Symfony 2, вызывающий несуществующий сервис "router"

У меня есть служба MailController которая определяется как это в моей конфигурации

 services: mail_controller: class: Company\Project\Bundle\Controller\MailController 

Я звоню в Службу в других сервисах

 $mailController = $this->get('mail_controller'); 

Теперь ошибка, которую я получаю, наращивает этот вопрос

container не был установлен на контроллере, поэтому я вставляю его внутри constructor

 // MailController public function __construct() { $this->setContainer(new Container()); } 

Теперь я получаю эту ошибку:

 You have requested a non-existent service "router". 

Я предполагаю, что мне нужно вводить дополнительные услуги вообще, но я не знаю, что делать, поэтому что мне нужно добавить, чтобы мой контроллер мог работать со всеми сервисами?

Мой MailController выглядит так

 namespace Company\Project\Bundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\DependencyInjection\Container; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Doctrine\ORM\EntityManager; class MailController extends Controller{ public function __construct() { $this->setContainer(new Container()); } //Code for mailstuff } 

Вы создаете новый контейнер вместо того, чтобы вводить встроенный контейнер, поэтому он не имеет служб.

Чтобы использовать ваш контроллер, вам необходимо вставить контейнер, который был предварительно добавлен в ваш контроллер, через вашу службу.

 services: mail_controller: class: Company\Project\Bundle\Controller\MailController calls: - [ setContainer, [ @service_container ]] 

.. и избавиться от сеттера в вашем __construct .

вводя весь контейнер обслуживания

 calls: - [ setContainer, [ @service_container ]] 

поражает цель объявления вашего контроллера как службы. Просто введите нужные вам службы в свой конструктор. Конструктор нуждается в обслуживании, переданном как параметр, и больше не продлевать Controller .

 //MailController use Symfony\Component\Routing\RouterInterface; class MailController { private $router; public function __construct(RouterInterface $router){ $this->router = $router; } //actions } 

Теперь вам нужно настроить параметры services.yml и расширить службу с помощью аргументов, описывающих требуемую службу.

 services: mail_controller: class: Company\Project\Bundle\Controller\MailController arguments: - @router 

et voila, требуется только одна услуга, только одна введенная услуга. Если вы обнаружите, что употребляете слишком много услуг за одно действие, вероятность того, что ваше действие / контроллер недостаточно «тонкое».