5

使用 symfony2。我有一个侦听器类,它试图从不同的类(控制器)调用方法,如下所示:

        $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 中使用路由)它工作正常。

4

2 回答 2

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;
}
于 2012-10-15T23:15:59.963 回答
4

我正在添加另一个答案,因为@dev-null-dweller 建议的是一种不好的做法:几乎在每种情况下,您最好只注入您需要的服务 - 而不是整个容器:

use Doctrine\DBAL\Connection;

public function __construct(Connection $connection)
{
    $this->connection = $connection;
}
my_listener:
    arguments: [ @database_connection ]
于 2012-10-16T06:29:17.517 回答