-1

コントローラーのアクションでは、データベース内のテーブルから行を 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)

4

1 に答える 1

2

init関数の応答は返されません。そのため、エラーメッセージが表示されます。あなたはでそのようなことをしなければならないでしょうdisplayAction()

$response = $this->init();
if ($response) {
    return $response;
}
于 2012-09-14T07:38:52.560 に答える