0
如何指定一组控制器(例如管理员部分的所有控制器)并分配一个变量或服务,这些变量或服务可以在这些控制器呈现的所有模板中访问?如何将变量传递给Symfony 3中多个控制器的模板?
Laravel中的一个等价物将为不同的路由组指定不同的中间件。
我不是在寻找这些问题的答案:
全局变量 - 变量/服务将不必要地注入一些控制器
嵌入(例如前端控制器)。模板中的其他控制器 - 缓慢,冗长和重复的解决方法。
如何指定一组控制器(例如管理员部分的所有控制器)并分配一个变量或服务,这些变量或服务可以在这些控制器呈现的所有模板中访问?如何将变量传递给Symfony 3中多个控制器的模板?
Laravel中的一个等价物将为不同的路由组指定不同的中间件。
我不是在寻找这些问题的答案:
全局变量 - 变量/服务将不必要地注入一些控制器
嵌入(例如前端控制器)。模板中的其他控制器 - 缓慢,冗长和重复的解决方法。
要指定控制器,你想传递一个额外的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。 希望能帮到你。
你能显示你的代码吗? –
Symfony控制器通常会返回模板的响应版本,因此中间件没有空间。通常,当Symfony控制器返回响应时,它是一个完全分析的字符串。如果你希望能够在控制器之后处理它,你需要返回一些参数来标识模板,然后设置一个'Kernel :: Response'监听器来处理额外的参数以及实际创建的响应目的。 – qooplmao
我可以想到的两个选项,你基本上都说他们两个 1)服务 - 有一个函数来获得变量,如果用户有权限,或请求是正确的URL /控制器等 2 )中间件 - 使用事件侦听器在正确的请求上设置变量。 –