1

私は次のように私のアプリのほとんどのコントローラーのベースコントローラーを持っています:

class BaseController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller
{
    /**
     * 
     * @Route("/")
     */
    public function indexAction($partial = false)
    {
            $this->partial = $partial;
        $this->currentAction = 'index';

        return $this->r();
    }
}

これには、レイアウト付きの完全なhtmlページまたはコンテンツのみのいずれかであるテンプレートのパックが付属しています。これは、テンプレートの行によって行われます。

{% extends this.partial ? "SomeProject:_base:partial.html.twig" : "SomeProject::layout.html.twig" %}

(ここthisで、はコントローラー参照です)。

これらのテンプレートは、を介してレイアウトを複製することなく、他のコントローラーでレンダリングできます。

{% render 'SomeProject:SomeController:index' with  { "partial":true }  %}

このアプローチに関する私の問題は次のとおりです。

  1. 部分的なコントローラーである必要があるすべてのアクションには、$partial引数が必要です。ほとんどのアクションは部分的である可能性があるため、すべてのコントローラーにそれを振りかける必要があります。
  2. すべての潜在的に部分的なアクションには、$this->partial = $partial簡単に忘れられる可能性のある線が必要です。

SymfonyまたはTwigの魔法を使用する(renderタグをオーバーライドするなど)ことで、よりクリーンな方法があります。上記の問題を取り除くために?

4

2 に答える 2

0

テンプレートにいくつかの標準変数を挿入するために、ほとんどのコントローラーでrenderメソッドをオーバーライドしました。うまく機能しているように見えますが、$ thisをテンプレートに明示的に渡す必要がないため、コントローラーからのテンプレートのレンダリングが少し簡単になります。

コントローラへの参照を渡すことがそれほど良い考えかどうかはわかりません。少なくともあなたの例では、部分的に渡すだけで十分なようです。

テンプレートにこの部分的な機能を本当に与える必要がありますか?2つのテンプレート(1つはページ用、もう1つはパーシャル用)を使用する方が簡単なようです。しかし、おそらくあなたのユースケースはそれを必要とします。

于 2012-05-18T11:51:28.927 に答える
0

いくつかの調査と内部の調査の後、私はエレガントな解決策を思いつきました。

答えは、イベントリスナー(Symfony2 Docsでカバーされています)を構築することです。より正確には、クラスの内容が次のようになっているコントローラーリスナー。これにより、コントローラーコードに変更を加えることなく、パーシャルを透過的に処理できます。

class ControllerListener
{
    /**
     *
     * @param BaseController $ctrl
     * @param Request $request
     * @return BaseController 
     */
    public function injectPartial($ctrl,Request $request)
    {
        if ($ctrl instanceof BaseController)
        {
            if ($request->get("partial",false))
                $ctrl->setPartial($request->get ("partial"));
        }
        return $ctrl;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $ctrl = $event->getController();
        $ctrl[0] = $this->injectPartial($ctrl[0], $event->getRequest());
        $event->setController($ctrl);
    }
}
于 2012-05-22T06:54:05.580 に答える