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

Сброс контейнера в один файл

Изначально контейнер Symfony был скомпилирован и выгружен в большой файл PHP. Затем изменили его, чтобы разрешить сброс каждого сервиса в отдельный небольшой PHP-файл. В Symfony 4.4 добавили новую опцию конфигурации, чтобы снова разрешить сброс контейнера в один большой файл.

Это включено по умолчанию для всех новых приложений Symfony, но вы также можете включить его для существующих приложений в файле src/Kernel.php:

class Kernel extends BaseKernel
{
    // ...

    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
    {
        // ...

        $container->setParameter('container.dumper.inline_factories', true);

        // ...
    }
}

Игнорирование ошибок при импорте файлов

При импорте файлов конфигурации вы можете использовать опцию ignore_errors: true, чтобы игнорировать все отсутствующие файлы. Однако этот параметр также игнорирует файлы которые содержат синтаксические ошибки. В Symfony 4.4 добавили новое значение для этой опции, чтобы вы игнорировали только отсутствующие файлы, а не файлы с синтаксическими ошибками:

imports:
    # this will show an error if 'parameters.yaml' exists but contains syntax errors
    - { resource: 'parameters.yaml', ignore_errors: 'not_found' }

Разрешить использование значений Base64url в Env Vars

Использование стандартного Base64 в URL требует кодирования символов +, / и =. Вот почему RFC 4648 определяет вариант Base64, называемый Base64url, который безопасен для URL-адресов и имен файлов. Base64url заменяет + на — и / на _ (и делает трейлинг = необязательным).

В Symfony 4.4 улучшили процессор переменных окружения base64, чтобы также разрешать анализ значений base64url. Вам не нужно ничего менять в своем коде, потому что Symfony может автоматически определять значения base64url и анализировать их для вас.

Разрешить привязку помеченных служб

Привязка аргументов по имени или типу позволяет вводить сервисы и параметры на основе имени и/или типа аргументов конструктора сервисов. В Symfony 4.4 вы также можете добавлять итерируемые и помеченные сервисы.

В следующем примере конфигурация _instanceof добавляет тег для любых сервисов, классы которых реализуют данный интерфейс, а конфигурация _defaults.bind внедряет все эти сервисы в любой итерируемый аргумент конструктора $rules:

# config/services.yaml
services:
    _instanceof:
        App\Foo\Rule\RuleInterface:
            tags: ['app.foo.rule']

    _defaults:
        bind:
            iterable $rules: !tagged_iterator app.foo.rule

    # ...