在symfony2中为所有页面放置公共业务逻辑的位置

sum*_*lki 4 dry symfony

我现在正在研究我的第一个symfony2项目.我已经创建了一个服务,我需要为每个控制器调用它来生成一个html,这在我的网站的所有页面中都是必需的.

所以我创建了一个BaseController类,它扩展了Symfony\Bundle\FrameworkBundle\Controller\Controller类,并尝试将代码放在这个BaseController类中.现在每当我从构造函数调用时:

$my_service = $this->get('my_service');
Run Code Online (Sandbox Code Playgroud)

要么

$my_service = $this->container->get('my_service');
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

Call to a member function get() on a non-object.
Run Code Online (Sandbox Code Playgroud)

容器对象尚未初始化.这个问题的解决方案是什么?如果我想在包含动态数据的所有页面中放置左侧面板或标题,如何在symfony2中遵循DRY方法?

提前致谢.

Ald*_*nio 5

您不应该在控制器类中使用构造函数,特别是当您从Symfony Controller继承时:这样您在对象实例化获取容器(DIC将调用从Symfony的Controller继承的setContainer方法).

通常,对于您的第一个实验,请使用操作方法中的服务; 如果你需要在每个请求中执行一些交叉逻辑,你可以考虑注册一些事件监听器(参见Symfony网站上的"Internals"文档).

当您对框架更有信心时,您可以开始考虑不继承Symfony的Controller,在DIC中注册控制器类并手动注入您需要的服务(最终在构造函数中实现某些逻辑).