我查找了一些解决方案,但没有一个适合我的问题。
在一个控制器中,我创建了另一个控制器的实例
//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"]]