【问题标题】:How to pass a variable to templates for multiple controllers in Symfony 3?如何将变量传递给 Symfony 3 中多个控制器的模板?
【发布时间】:2017-09-25 04:30:41
【问题描述】:

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

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

我不是在寻找这些答案:

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

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

【问题讨论】:

  • 你能展示你的代码吗?
  • Symfony 控制器通常返回模板的响应版本,因此中间件没有空间。通常当一个 Symfony 控制器返回一个响应时,它是一个完全解析的字符串。如果您希望能够在控制器之后处理它,您需要返回一组参数来识别模板,然后设置一个Kernel::Response 侦听器来处理额外的参数和响应对象的实际创建。
  • 我能想到的两个选项,你基本上都说了 1) 服务 - 如果用户有权限,或者请求是正确的 url/,则具有获取变量的功能控制器等 2) 中间件 - 使用事件监听器在正确的请求上设置变量。

标签: php symfony templates controllers


【解决方案1】:

要指定你想传递额外参数的控制器,让我们让它实现一些接口,如 AdminInterface。然后将参数传递给视图,有几种方法:

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。 希望能帮到你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多