symfony2 - 如何覆盖控制器__construct

时间:2012-08-08 07:48:20

标签: symfony controller php

我在使用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,但我不知道如何做到这一点(我尝试过但失败了,悲惨地)

任何想法的人?

2 个答案:

答案 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可以是一个完全独立的独立类。

  

官方文档非常糟糕!

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

相关问题