Symfony2 - 如何覆盖控制器__construct


symfony2 - how override controller __construct

我在使用Symfony2时遇到了一些问题。即如何使用__construct()功能。官方文档糟糕得令人震惊!

我希望能够使用以下:

public function __construct()
{
    parent::__construct();
    $user = $this->get('security.context')->getToken()->getUser();
}

我怎么会收到以下错误:

Fatal error: Cannot call constructor in /Sites/src/DEMO/DemoBundle/Controller/Frontend/HomeController.php on line 11

11号线parent::__construct();。我删除了它并得到以下新错误

Fatal error: Call to a member function get() on a non-object in /Sites/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 242

我想我可能需要设置 ContainerInterface DIC,但我不知道该怎么做(我尝试过并失败了,很惨)

伙计们有什么想法吗?

对于新的 S2 开发人员来说,这实际上是一个相当普遍的误解。 正如@KingCrunch所说,S2 控制器没有构造,因此您的方法将失败。 看看源代码:命名空间Symfony''Bundle''FrameworkBundle''Controller''Controller,你会看到控制器扩展了组件ContainerAware,它有一个名为setContainer的方法。 如果你真的想,你可以重写这个方法并做你想做的事。

但是,有一个专门为这些事情设计的事件系统,即在操作方法启动之前执行某些方法。 可能想搜索一下有关此主题的其他问题。

S2.1 控制器现在有一个 getUser() 方法。 我建议将其添加到您的基本控制器类中,而不必担心它。

不知道,你扩展了哪个类,但是symfony控制器没有构造函数。因此,正如消息所暗示的那样,它正是

Fatal error: Cannot call constructor in
/Sites/src/DEMO/DemoBundle/Controller/Frontend/HomeController.php on line 11
Line 11 is "parent::__construct();"

它不能调用构造函数,因为它不存在

public function __construct()
{
    $user = $this->get('security.context')->getToken()->getUser();
}

值得注意的是,你甚至不需要扩展任何类,也不需要实现任何接口。symfony2-controller可以是一个完全独立的独立类。

官方文档糟糕得令人震惊!

文档建议在哪里调用父构造函数;)