Новое в Symfony 5.3: Настройка нескольких сред в одном файле

Symfony определяет различные среды конфигурации, поэтому вы можете изменять поведение своего приложения в зависимости от того, где оно запущено (например, локально на вашем компьютере разработки, на производственном сервере и т. д.)

Параметры, применяемые к пакетам/пакетам во всех средах, определены в config/packages/, а конкретные параметры каждой среды определены в config/packages/<environment>/.

Это работает хорошо, но это обременительно, когда различия между средами минимальны, потому что вам нужно создать/поддерживать другой файл конфигурации, чтобы изменить несколько параметров конфигурации.

Вот почему в Symfony 5.3 вы также можете определять параметры для разных сред в одном файле. Точный синтаксис зависит от формата файла конфигурации.

В файлах конфигурации YAML используйте специальный ключ when@…:

# config/packages/webpack_encore.yaml
webpack_encore:
    # ...
    output_path: '%kernel.project_dir%/public/build'
    strict_mode: true
    cache: false

when@prod:
    webpack_encore:
        cache: true

when@test:
    webpack_encore:
        strict_mode: false

В конфигурации XML оберните конфигурацию в новый тег <when>:

<!-- config/packages/webpack_encore.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="...">
        <webpack-encore:config>
            <!-- ... -->
        </webpack-encore:config>

        <when env="prod">
            <webpack-encore:config>
                <!-- ... -->
            </webpack-encore:config>
        </when>

        <when env="test">
            <webpack-encore:config>
                <!-- ... -->
            </webpack-encore:config>
        </when>
    </container>

В файлах конфигурации PHP используйте новый метод env(), чтобы проверить, в какой среде работает приложение:

// config/packages/framework.php
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Config\FrameworkConfig;

return static function (FrameworkConfig $framework, ContainerConfigurator $container) {
    // ...

    if ('prod' === $container->env()) {
        // ...
    }

    if ('test' === $container->env()) {
        $framework->test(true);
        $framework->session()->storageFactoryId('session.storage.mock_file');
    }
};

Этот синтаксис также работает для определения маршрутов и служб только в некоторых средах. Вы даже можете объединить все в одном файле для настройки некоторых пакетов и создания служб, но только для некоторых сред:

framework:
    secret: '%env(APP_SECRET)%'

when@dev:
    services:
        App\SomeServiceForDev: ~

when@test:
    framework:
        test: true
        # ...

Традиционный способ использования файла конфигурации для каждой среды будет работать и в будущем, но мы рекомендуем вам попробовать эту новую функцию, чтобы уменьшить количество файлов конфигурации, которые необходимо поддерживать.

Наконец, классы теперь могут использовать атрибуты PHP, чтобы указать, что они должны регистрироваться как службы только в некоторых средах:

use Symfony\Component\DependencyInjection\Attribute\When;

#[When(env: 'dev')]
class SomeClass
{
    // ...
}

// you can apply more than one attribute to the same class:

#[When(env: 'dev')]
#[When(env: 'test')]
class AnotherClass
{
    // ...
}