Symfony 2错误:在非对象上调用成员函数get()


Symfony 2 Error: Call to a member function get() on a non-object

我查找了一些解决方案,但没有一个适合我的问题。

在一个控制器中,我创建了另一个控制器的实例

//Controller1
$mailController = new MailController();
$mailController->newCommentMail($entity, $em);

在MailController中,我想生成一个URL并发送一封电子邮件

$url = $this->generateUrl('path', array('turnId' => $data->getPoi()->getId(), 'poiId' => $data->getPoi()->getTurn()->getId()));
$this->get('mailer')->send($mail);

这两行抛出以下错误:

Error: Call to a member function get() on a non-object

但是我的IDE确定$this是一个控制器的实例。

生成这样的控制器实例有问题吗?或者我做错了什么?

您可以将控制器定义为服务,然后在另一个控制器中获取它。

在您的services.yml中,将所需的控制器定义为服务:

services:
    your_service_name:
        class: YourCompany'YourBundle'Controller'YourController

然后在任何控制器中,您都可以通过容器获得此服务:

$yourController = $this->get('your_service_name');

文档中有一些关于控制器即服务的有用信息

来自OP的注释

这个答案是完全正确的,我只想添加一些东西,这样这个答案就可以100%正常工作!

在我将控制器更改为服务后,服务容器丢失了,请参阅此处的此问题。

要设置容器,以及SF2的完全功能性,您需要向service.yml 添加一行

services:
    mail_controller:
        class: YourCompany'YourBundle'Controller'YourController
        calls:
            - [ setContainer, [ @service_container ]]
$this->container->get('mailer');

工作?

面临这个问题。。。但是在控制器服务中添加这个为我解决了

calls:
    - [setContainer, ["@service_container"]]