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

时间:2014-07-22 14:22:45

标签: php symfony

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

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

//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是控制器的实例。

生成像这样的控制器实例或我做错了什么?

3 个答案:

答案 0 :(得分:4)

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

services.yml将所需控制器定义为服务:

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

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

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

有关文档

Controllers as Services的一些有用信息

OP注意

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

将控制器更改为服务后,服务容器丢失,请参阅this Question here

要设置容器,并使用SF2的完全功能,您需要向service.yml添加一行

services:
    mail_controller:
        class: YourCompany\YourBundle\Controller\YourController
        calls:
            - [ setContainer, [ @service_container ]]

答案 1 :(得分:0)

$this->container->get('mailer');

作品?

答案 2 :(得分:0)

面对这个问题......但是在控制器服务中添加它解决了它

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