将数据添加到 Symfony 控制器中所有操作的 return

Add data to return of all actions in a Symfony controller

我在 Symfony 2.1 应用程序中有一个控制器,我们在 BarBundle 中将其命名为 FooController。此控制器有很多操作 fooActionbarActionbazAction 以及更多操作。

他们都有一些共同点。它们在视图中的某些部分显示相同的数据,而不是全部,所以我不能只使用一个将类型作为参数的操作。我想把必须传递给视图的数据放在一个中心位置,否则就干不下去了。

差(我认为):

public function fooAction() {
    // ...
    return $this->render('BarBundle:Foo:foo.html.twig', array('foo' => 'Foo Data', 'data' => $this->getTheDataThatIsNeededInEveryAction()));
}
public function barAction() {
    // ...
    return $this->render('BarBundle:Foo:bar.html.twig', array('bar' => 'Bar Data', 'data' => $this->getTheDataThatIsNeededInEveryAction()));
}
public function bazAction() {
    // ...
    return $this->render('BarBundle:Foo:baz.html.twig', array('baz' => 'Baz Data', 'data' => $this->getTheDataThatIsNeededInEveryAction()));
}

我现在想知道的是,"Good" 方法是什么?在将数据发送到视图之前调用的父控制器中是否有类似 finished 的函数,我可以在其中将该数据添加到响应对象?

另一种可能是创建一个事件侦听器,但我认为这会浪费资源。

第三种选择是使用像 {% render url('latest_articles', { 'max': 3 }) %} 这样的渲染函数 我知道现在是 {{ render(controller(..)) }} 但我在这个项目中仍然使用 Symfony 2.1。

选项之一

public function commonAction($type) {
     // ...
     return $this->render('BarBundle:Foo:'.$type.'.html.twig', array('data' => $this->getTheDataThatIsNeededInEveryAction()));
}

其中 $type 是 bar、foo 或 baz

一个选择是创建您自己的基本控制器,并让所有其他控制器扩展它。您的基本控制器将覆盖来自 symfony 框架

Controller class 的 render 函数
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class BaseController extends Controller
{
    // override render method
    protected function render($template, $data)
    {
        $commonData = [];// get data from wherever you need
        parent::render($template, $data + $commonData);
    }
}

然后在你的其他控制器中

class MyAnotherController extends BaseController
{
    public function fooAction() {
    // ...
    return $this->render('BarBundle:Foo:foo.html.twig', array('foo' => 'Foo Data'));
    }
}