【问题标题】:'Call to a member function get() on a non-object'?'调用非对象上的成员函数 get()'?
【发布时间】:2012-10-15 22:59:46
【问题描述】:

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

【问题讨论】:

  • @LightnessRacesinOrbit 对不起?
  • @LightnessRacesinOrbit 我只是不明白你的意思是什么......
  • eelis.net/iso-c++/testcase.xhtml -- 良好的调试技术包括为自己制作一个测试用例向互联网寻求帮助!制作测试用例的过程往往会发现问题。
  • 您可能会发现这很有见地:stackoverflow.com/questions/12769982/…

标签: php symfony


【解决方案1】:

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;
}

【讨论】:

  • 其实,我不认为它的容器感知,它抛出了错误undefined property: $container..
  • 不错。我明白你现在的意思了。 [ @service_container ] 是字面意思,还是我应该用一些东西代替它?请原谅我不了解什么是容器..
  • 如果你使用 yml 文件进行配置,它的字面意思是@service_container,如果你使用其他东西,请参考文档,看看你应该如何定义你的监听器
  • -1 建议注入整个容器。
  • @elnur 据我了解 OP 问题,此类也可用作标准控制器,因此双重功能是没有意义的,一个使用容器,另一个仅使用 db 连接
【解决方案2】:

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

use Doctrine\DBAL\Connection;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多