2012-08-08 61 views
-1

我在Symfony2有一些麻烦。即如何使用__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,但我不知道如何做到这一点(我尝试和失败,草草收场)

任何想法的人?

+0

您应该更好地使用4个空格来突出显示您的代码,而不是使用'>'。 – j0k 2012-08-08 07:51:12

回答

4

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

但是,有一个事件系统专门设计用于这些类型的事情,即在动作方法启动之前执行某些方法。可能想就这个主题寻找一些其他问题。

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

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

the Official Documentation is shockingly bad!

哪里的文件建议拨打父母的构造函数;)