コントローラーのアクションでは、データベース内のテーブルから行を ID で選択することが多いため、これを関数に分離しました。しかし、これを行うたびに、クエリによって何かが返されたかどうかをチェックするので、これも関数に分離したいと考えています。これが私のコードです:
この関数はコントローラー内にあり、コントローラーによって拡張され、次のアクションがあります。
protected function findById($id, $class)
{
$result = $this->getEM()->getRepository('EMMyFriendsBundle:'.$class)->find($id);
if($result == null) {
return false;
} else {
return $result;
}
}
そして、これは私のコントローラーです:
class FriendController extends Controller
{
private $em;
private $friend;
private function init($id)
{
$this->em = $this->getEM();
$this->friend = $this->findById($id, 'Friend');
if(!$this->friend) {
return $this->render('EMMyFriendsBundle:Friend:error.html.twig', array(
'item' => 'friend'));
}
}
/*
* Displays all the information about a concrete friend
*/
public function displayAction($id)
{
$this->init($id);
if($this->friend->getCategory() != null) {
$category = $this->friend->getCategory()->getName();
} else {
$category = null;
}
return $this->render('EMMyFriendsBundle:Friend:friend.html.twig', array(
'friend' => $this->friend, 'category' => $category));
}
// ...
}
存在しない ID (38743874 など) を選択すると、init 関数の if-part に移動しますが、テンプレート error.html.twig をレンダリングしません :( しかし、この部分を取ると
if(!$this->friend) {
return $this->render('EMMyFriendsBundle:Friend:error.html.twig', array(
'item' => 'friend'));
}
関数から取り出して を呼び出した直後にinit()
入れると、動作します。しかし、そのコントローラーのすべてのアクションにこれを書きたいわけではありません。コードの重複を避けるためにそれを分離する方法はありますか?displayAction($id)
$this->init($id)