我在Symfony 2.1应用程序中有一个控制器,我们只需在FooController
中调用它BarBundle
即可。此控制器包含许多操作fooAction
,barAction
,bazAction
以及其他一些操作。
所有这些都有一些共同之处。它们在某些部分中显示的是视图中的相同数据,而不是全部,因此我不能仅使用类型为参数的一个操作。我想在一个中心位置添加必须传递给视图的数据,否则,它就不会干。
糟糕(在我看来):
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。
答案 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