我查了一些解决方案,但没有找到适合我的问题。
在一个控制器中,我创建另一个控制器的实例
//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
是控制器的实例。
生成像这样的控制器实例或我做错了什么?
答案 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"]]