Symfony 2: инъекция зависимостей (DI) контроллеров
Есть ли вероятность, что контроллеры зависят от их услуг, а не через использование контейнера обслуживания внутри них, но через инъекцию зависимости чистого конструктора?
Я хотел бы написать контроллеры таким образом:
<?php
class ArticleController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller
{
private $articleFacade;
private $articleRepository;
public function __construct(ArticleFacade $articleFacade, ArticleRepository $articleRepository)
{
$this->articleFacade = $articleFacade;
$this->articleRepository = $articleRepository;
}
public function indexAction()
{
...
}
}
К сожалению, Symfony ControllerResolver делает новые экземпляры контроллеров не через ServiceContainer, а через простой вызов return new $controller
.
Ответы
Ответ 1
Абсолютно на самом деле это рекомендуется, и если вы посмотрите на большинство сторонних пакетов, таких как FOSUser, вы можете видеть, что это именно то, что они делают.
Фокус в том, чтобы определить ваши контроллеры как службы, а затем использовать идентификатор службы вместо имени класса.
http://symfony.com/doc/current/cookbook/controller/service.html
Имейте в виду, что вам придется вводить все необходимые службы, такие как менеджеры сущностей, и обычно вы не расширяете базовый класс symfony. Конечно, вы можете ввести полный контейнер, но это, как правило, недоверчиво.