В Symfony 3.2, инъекцию зависимостей можно делать несколькими способами. Один из наиболее популярных способов - это использование автозависимостей при создании контроллеров.
Для начала, вам необходимо убедиться, что ваш контроллер наследуется от базового контроллера Symfony - SymfonyBundleFrameworkBundleControllerController
. Это гарантирует наличие метода get()
для доступа к сервисам, зарегистрированным в контейнере зависимостей.
Затем, чтобы сделать инъекцию зависимостей через методы, в контроллере необходимо определить конструктор и зависимости для инъекции.
Предположим, что у вас есть сервис MyService
, который нужно внедрить в контроллер. Вы можете написать в контроллере конструктор, который ожидает этот сервис:
use AppBundleServiceMyService; class DefaultController extends Controller { private $myService; public function __construct(MyService $myService) { $this->myService = $myService; } // ... }
Если вы хотите, чтобы Symfony сам внедрил зависимость, вам потребуется пометить ваш сервис или класс, который создает ваш контроллер, аннотацией @SymfonyComponentDependencyInjectionContainerAwareInterface
. Это позволяет Symfony использовать метод setContainer()
для установки экземпляра контейнера перед выполнением методов контроллера:
use SymfonyComponentDependencyInjectionContainerAwareInterface; use SymfonyComponentDependencyInjectionContainerInterface; use AppBundleServiceMyService; class DefaultController extends Controller implements ContainerAwareInterface { private $myService; public function setContainer(ContainerInterface $container = null) { parent::setContainer($container); $this->myService = $container->get('my_service'); } // ... }
В этом случае, вам также необходимо привести сервис к локальной переменной, чтобы иметь к нему доступ в других методах контроллера.
Наконец, у вас также должна быть конфигурация сервиса MyService
в файле services.yml
, чтобы Symfony знал, как создавать экземпляр этого сервиса:
services: my_service: class: AppBundleServiceMyService
Обратите внимание, что вам также необходимо убедиться, что сервис AppBundleServiceMyService
зарегистрирован в вашем контейнере зависимостей.
После выполнения этих шагов, в вашем контроллере у вас будет доступным экземпляр сервиса MyService
, который будет автоматически внедрен в контроллер при создании. Вы можете использовать его в любом методе контроллера, где это необходимо.