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

Улучшенный синтаксис 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']