使用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中的路由),它可以正常工作。
答案 0 :(得分:7)
Symfony2使用依赖注入模式,你必须注入容纳所有服务的容器(如数据库连接):
$authenticate = new AuthenticationController();
$authenticate->setContainer($this->container);
$authenticate->isTokenValid($token);
我当然假设你的听众课程是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;
}
答案 1 :(得分:4)
我正在添加另一个答案,因为@ dev-null-dweller建议这是一个不好的做法:几乎在每种情况下你最好只注入你需要的服务 - 而不是整个容器:
use Doctrine\DBAL\Connection;
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
my_listener:
arguments: [ @database_connection ]