Новое в Symfony 2.8: Автоматическая привязка служб

Компонент внедрения зависимостей является одним из наиболее важных элементов приложений 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

Добавить комментарий

Ваш адрес email не будет опубликован.

тринадцать + два =