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

How to pass a variable to templates for multiple controllers in Symfony 3?

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

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

我不是在寻找这些答案:

  1. 全局变量 - variable/service 会被不必要地注入到某些控制器(例如前端控制器)。

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

要指定您想要传递额外参数的控制器,让我们使其实现一些类似 AdminInterface.Then 的接口来传递参数以查看,有几种方法:

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/将属性传递给包含您的参数的请求,并通过 $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。 希望对你有帮助。