添加数据以返回Symfony控制器中的所有操作

时间:2015-02-24 09:23:10

标签: symfony render symfony-2.1

我在Symfony 2.1应用程序中有一个控制器,我们只需在FooController中调用它BarBundle即可。此控制器包含许多操作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。

2 个答案:

答案 0 :(得分:3)

一个选项是创建自己的基本控制器,并让所有其他控制器扩展它。您的基本控制器将覆盖symfony框架中render类的Controller函数

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'));
    }
}

答案 1 :(得分:0)

其中一个选项

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

其中$type为bar,foo或baz

相关问题