我在使用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,但我不知道如何做到这一点(我尝试过但失败了,悲惨地)
任何想法的人?
答案 0 :(得分:4)
对于新的S2开发人员来说,这实际上是一种常见的误解。正如@KingCrunch所说,S2控制器没有构造,因此你的方法将失败。看一下源代码:命名空间Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller,您将看到Controller扩展了ContainerAware组件,它有一个名为setContainer的方法。如果你真的想,你可以覆盖这个方法并做你想做的事。
但是,有一个专门为这些事情设计的事件系统,即在动作方法开始之前执行某些方法。可能想要搜索一下这个主题的其他问题。
S2.1控制器现在有一个getUser()方法。我建议将它添加到你的基本控制器类,而不用担心它。
答案 1 :(得分:1)
不知道,你扩展了哪个类,但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可以是一个完全独立的独立类。
官方文档非常糟糕!
文档在哪里建议调用父项构造函数;)