компилируется...
Перейти к основному содержанию
Рекомендовать во Вконтакте Рекомендовать в Фейсбуке Рекомендовать в Твиттере

Новое в Symfony 4.4: Улучшение внедрения зависимостей (часть 2)

Усовершенствованный синтаксис YAML для вызовов методов

call метод и внедрение зависимости через setter - это разные способы вызова некоторых методов в ваших классах при построении сервисов для них. В Symfony 4.4 мы улучшили синтаксис YAML, чтобы сделать его более лаконичным и удобным для чтения и записи:

# config/services.yaml
services:
    App\Service\MessageGenerator:
        # ...
        calls:
-            - method: setLogger
-              arguments:
-                  - '@logger'
+            - setLogger: ['@logger']

Призыв with методов также упрощен:

# config/services.yaml
services:
    App\Service\MessageGenerator:
        # ...
        calls:
-            - method: withLogger
-              arguments:
-                  - '@logger'
-              returns_clone: true
+            - withLogger: !returns_clone ['@logger']

Улучшенный контроль за декорированием сервиса

Декорирование сервиса является одной из самых популярных и мощных функций Symfony Dependency Injection. В Symfony 4.4 мы улучшили его, чтобы вы могли контролировать то, что происходит, когда декорированного сервиса не существует:

# config/services.yaml
services:
    App\NewMailer:
        decorates: App\Mailer
        decoration_on_invalid: ignore

Если служба App\Mailer отсутствует, эта конфигурация сообщает Symfony, чтобы она проигнорировала ошибку и удалила эту службу. Другие возможные значения - exception и null.

Значение exception говорит Symfony бросить ServiceNotFoundException, и это значение является значением по умолчанию, поскольку соответствует текущему поведению. Нулевое значение делает декорированный сервис равным null, поэтому декорирующий сервис должен быть готов к работе с null значениями.

Приоритеты для тегированных сервисов

При внедрении сервисов с тегами в другие сервисы, вы можете установить определенный приоритет для этих сервисов следующим образом:

# config/services.yaml
services:
    _instanceof:
        App\Handler:
            tags:
                - { name: 'app.handler', priority: 20 }

    App\HandlerCollection:
        arguments: [!tagged_iterator app.handler]

Однако приоритет (20 в данном примере) одинаков для всех сервисов. В Symfony 4.4 мы улучшили эту функцию, чтобы определить приоритет для каждого сервиса. Для этого определите публичную статическую функцию getDefaultPriority(): int в своих классах сервисов и верните им приоритет. Вы можете настроить имя метода с атрибутом default_priority_method:

# config/services.yaml
services:
    # ...
    App\HandlerCollection:
        arguments: [!tagged_iterator app.handler, default_priority_method: 'calculateServicePriority']

Комментарии

Пока что нет комментариев, вы можете быть первым.
Войти или Регистрация , чтобы оставлять комментарии.
Наш сайт использует куки. Узнайте больше о нашем использовании куки: политика в отношении файлов cookie
Наш сайт существует только благодаря показу онлайн-рекламы нашим посетителям.
Пожалуйста, поддержите нас, отключив блокировку рекламы.