2017-09-25 12 views
0

コントローラのグループ(管理セクションのすべてのコントローラなど)を指定し、それらのコントローラによってレンダリングされるすべてのテンプレートでアクセス可能な変数またはサービスを割り当てる方法はありますか?Symfony 3の複数のコントローラのテンプレートに変数を渡すには?

Laravelの同等の機能は、異なるルートグループに対して異なるミドルウェアを指定することです。

私はこれらの答えを探していないよ:

  1. グローバル変数 - 変数/サービスが不必要にコントローラの一部に注入されるだろう(例えば、フロントエンド・コントローラー。)

  2. 埋め込みテンプレート内の他のコントローラ - 遅く、冗長で反復的な回避策

    1 /リスナーカーネルに:

+0

コードを表示できますか? –

+1

symfonyコントローラは、一般に、ミドルウェアのためのスペースがないように、テンプレートの応答バージョンを返します。一般的に、Symfonyコントローラが応答を返すとき、それは完全に解析された文字列です。コントローラの後でそれを処理できるようにするには、テンプレートを特定するためのパラメータを返す必要があり、追加のパラメータと実際の応答の作成を処理する 'Kernel :: Response'リスナを設定しますオブジェクト。 – qooplmao

+1

2つのオプションが考えられますが、基本的に両方とも言っています 1)サービス - ユーザーが権限を持っているか、要求が正しいURL /コントローラなどにある場合に変数を取得する機能があります 2 )ミドルウェア - イベントリスナーを使用して、正しい要求に変数を設定します。 –

答えて

1

AdminInterface.Thenのようないくつかのインタフェースが表示するのparamsを渡すのは、その実装を作ってみましょう、あなたは余分のparamに合格したいコントローラを指定するには、いくつかの方法があります.view:

public function onKernelView(GetResponseForControllerResultEvent $event) 
    { 
     $result = $event->getControllerResult(); 

     if (!$result instanceof AdminInterface || !isset($result['template']) || !isset($result['data'])) { 
      return; 
     } 

     $data = array_merge($result['data'], array('myvar' => 'value')); 
     $rendered = $this->templating->render($result['template'], $data); 

     $event->setResponse(new Response($rendered)); 
    } 

2 /属性をあなたのparamsが含まれており、$要求 - >属性 - >(「myVarに」)を取得し、テンプレートに直接渡すことで、あなたのコントローラでそれを得る要求を渡します。

public function onKernelController(FilterControllerEvent $event) 
{ 
    $controller = $event->getController(); 
    if (!$result instanceof AdminInterface) { 
     return; 
    } 
    $event->getRequest->attributes->set('myvar', 'value'); 
} 

symfonyカーネルイベントの詳細については、docを参照してください。 お手伝いをしてください。

関連する問題