Компонент внедрения зависимостей является одним из наиболее важных элементов приложений Symfony. Этот компонент позволяет разработчикам конфигурировать сервисы с помощью YAML, XML или PHP файлов и оставляет за Symfony создание эти сервисов.
Сервисы, как правило, определяют опцию arguments
списком аргументов, передаваемых в их конструктор. Если приложение содержит следующие два класса:
namespace AppBundle\Service; class Service1 { } namespace AppBundle\Service; use AppBundle\Service\Service1; class Service2 { private $service1; public function __construct(Service1 $service1) { $this->service1 = $service1; } }
Необходимая YAML конфигурация будет следующая:
# app/config/services.yml services: service1: class: AppBundle\Service\Service1 service2: class: AppBundle\Service\Service2 arguments: ['@service1']
В Symfony 2.8, благодаря новой опции службы автоматического привязки, вы можете не делать настройку service1. Причина в том, что сервис контейнеров способен распознать параметры конструктора, создать частную службу для класса service1 и ввести его в service2.
Эта функция отключена по умолчанию, и его поведение ограничивается случаями, когда сервисы могут быть распознаны однозначно. Вам просто нужно, указать для службы значение true
для нового параметр autowire, там где вы хотите задействовать автоматическую привязку и пусть сервис контейнеров сделает все остальное.
Так выглядит конфигурация службы при использовании автоматической привязки (service1 не определяется явно, а service2 не определяет свои аргументы):
# app/config/services.yml services: service2: class: AppBundle\Service\Service2 autowire: true
Автоматическая привязка сервисов впервые появилась более десяти лет назад в Spring Java framework( @Autowired
) и это отличный способ упрощения процесса разработки прототипов приложений.
Источник: http://symfony.com/blog/new-in-symfony-2-8-service-auto-wiring