如何将变量传递给Symfony 3中多个控制器的模板?

时间:2017-09-25 04:30:41

标签: php symfony templates controllers

如何指定一组控制器(例如管理部分的所有控制器)并分配一个可由这些控制器呈现的所有模板访问的变量或服务?

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

我不是在寻找这些答案:

  1. 全局变量 - 变量/服务将被不必要地注入某些控制器(例如前端控制器)。

  2. 在模板中嵌入其他控制器 - 一种缓慢,冗长和重复的解决方法。

1 个答案:

答案 0 :(得分:1)

要指定要传递额外参数的控制器,让我们使用AdminInterface等实现一些接口。然后将params传递给view,有几种方法:

1 / kernel.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的请求,并通过$ request-> attributes-> get(' myVar')将其传递到你的控制器中,并将其直接传递给模板。

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

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