Я искал некоторые решения, но ни одна из найденных не соответствовала моей проблеме.
В одном контроллере я создаю экземпляр другого контроллера
//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
экземпляр контроллера.
Есть ли проблема с генерацией экземпляра такого контроллера или что я делаю неправильно?
Вы можете определить свой контроллер как службу, а затем получить его на другом контроллере.
В your 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"]]