Улучшенный синтаксис YAML для вызовов методов
Вызовы методов службы и внедрение метода установки – это разные способы вызова некоторых методов в ваших классах при создании служб для них. В Symfony 4.4 улучшили синтаксис YAML, чтобы сделать его более кратким и простым для чтения/записи:
# config/services.yaml
services:
App\Service\MessageGenerator:
# ...
calls:
- - method: setLogger
- arguments:
- - '@logger'
+ - setLogger: ['@logger']
Вызов методов также был упрощен:
# 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 игнорировать ошибку и удалять службу App\NewMailer
. Другими возможными значениями являются исключение и ноль.
Значение исключения указывает 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']