2012-10-15 60 views
5

使用symfony2。我有一个试图调用从不同的类(控制器)的方法,像这样的监听器类:'调用成员函数get()非对象'?

 $authenticate = new AuthenticationController(); 
     $authenticate->isTokenValid($token); 

而且控制器isTokenValid方法:

public function isTokenValid($token) { 

    $conn = $this->get('database_connection'); 

抛出错误

Fatal error: Call to a member function get() on a non-object in /home/content/24/9254124/html/newsite/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 246 

如果我加载控制器方法的正确方法(使用路由在url中)它工作正常。

+0

测试用例需要 –

+0

@LightnessRacesinOrbit原谅我? –

+0

有些问题呢? –

回答

7

Symfony2的使用依赖注入模式,你必须注入容器中保存的所有服务(如数据库连接):

$authenticate = new AuthenticationController(); 
$authenticate->setContainer($this->container); 
$authenticate->isTokenValid($token); 

当然我这里假设你的监听器类是ContainerAware

[+]为了让你的听众ContainerAware,通过@service_container给它(例如形式services.yml

my.listener: 
    class: ACME\MyBundle\ListenerController 
    arguments: [ @service_container ] 
    tags: 
     - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 
    kernel.event_listener: 
     event: kernel.controller 

,然后在你监听器类的构造函数:

public function __construct($container = null){ 
    $this->container = $container; 
} 
+0

其实,我不认为它的containeraware,它扔了错误'未定义的属性:$ container' .. –

+0

看到我编辑的答案 –

+0

不错。我明白你的意思了。 “[@service_container]”是字面意思,还是应该用某种东西替换它?请原谅我不了解什么是容器.. –

3

我加入另一个答案,因为什么@开发无效居民顾名思义就是一种不好的做法:在几乎所有情况下,你最好仅注入你需要的服务 - 不是整个容器:

use Doctrine\DBAL\Connection; 

public function __construct(Connection $connection) 
{ 
    $this->connection = $connection; 
} 
my_listener: 
    arguments: [ @database_connection ] 
相关问题