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
{
// ...
}