2017-09-25 144 views
0

如何指定一组控制器(例如管理员部分的所有控制器)并分配一个变量或服务,这些变量或服务可以在这些控制器呈现的所有模板中访问?如何将变量传递给Symfony 3中多个控制器的模板?

Laravel中的一个等价物将为不同的路由组指定不同的中间件。

我不是在寻找这些问题的答案:

  1. 全局变量 - 变量/服务将不必要地注入一些控制器

  2. 嵌入(例如前端控制器)。模板中的其他控制器 - 缓慢,冗长和重复的解决方法。

+0

你能显示你的代码吗? –

+1

Symfony控制器通常会返回模板的响应版本,因此中间件没有空间。通常,当Symfony控制器返回响应时,它是一个完全分析的字符串。如果你希望能够在控制器之后处理它,你需要返回一些参数来标识模板,然后设置一个'Kernel :: Response'监听器来处理额外的参数以及实际创建的响应目的。 – qooplmao

+1

我可以想到的两个选项,你基本上都说他们两个 1)服务 - 有一个函数来获得变量,如果用户有权限,或请求是正确的URL /控制器等 2 )中间件 - 使用事件侦听器在正确的请求上设置变量。 –

回答

1

要指定控制器,你想传递一个额外的PARAM,让我们做它实现了一些接口像AdminInterface.Then通过PARAMS查看,有几种方法:

1 /监听器内核.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的请求和$请求 - >属性 - > GET得到它在你的控制器(“myVar的”),并直接把它传递给模板。

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

有关symfony内核事件的更多详细信息请看doc。 希望能帮到你。

相关问题