У меня есть служба 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, требуется только одна услуга, только одна введенная услуга. Если вы обнаружите, что употребляете слишком много услуг за одно действие, вероятность того, что ваше действие / контроллер недостаточно «тонкое».