将数据添加到 Symfony 控制器中所有操作的 return
Add data to return of all actions in a Symfony controller
我在 Symfony 2.1 应用程序中有一个控制器,我们在 BarBundle
中将其命名为 FooController
。此控制器有很多操作 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。
选项之一
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'));
}
}
我在 Symfony 2.1 应用程序中有一个控制器,我们在 BarBundle
中将其命名为 FooController
。此控制器有很多操作 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。
选项之一
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'));
}
}