if
, des for
etcVous pouvez utiliser symplify/config-transformer.
Cependant, il n’utilise pas les classes Config
précises, mais passe par ContainerConfigurator
,
ce qui ne vous ajoute pas un des principaux atouts de la version PHP : l’autocomplétion.
Je vous conseille donc de passer par une convertion manuelle (voir ci-dessous).
Pour que Symfony génère les classes PHP qui permettent la configuration en PHP, après avoir installé votre dépendance, il faut rafraîchir le cache :
bin/console.php cache:warmup
Pour être sûr d’avoir la même configuration entre la version YAML et la version PHP,
vous pouvez conserver le résultat de la configuration en YAML
(remplacer CONFIG_KEY
par la clé primaire de configuration, par exemple doctrine_migrations
) :
bin/dev/console debug:config [CONFIG_KEY]
Pendant que vous testez votre convertion,
faites bien attention : les 2 fichiers sont pris en compte (foo.yaml
et foo.php
).
Le fichier PHP étant lu en premier, puis le fichier YAML, si une même configuration est présente dans la version PHP et la version YAML, alors ce sera la version YAML qui sera la valeur finale.
Je vous conseille donc de mettre en commentaire le contenu complet du fichier YAML, pour effectuer votre convertion sans que la version YAML soit prise en compte tout en ayant un œil sur ce que vous devez convertir.
Symfony génère des classes Config
dans var/cache/dev/Symfony/Config
,
qui sont les classes PHP qui permettent de configurer votre package.
Si vous avez ignoré le répertoire var
dans votre éditeur de code,
pensez à ne pas exclure var/cache/dev/Symfony/Config
pour avoir accès à l’autocomplétion dans vos fichiers de configuration PHP.
Par exemple, avec PHPStorm,
il faut faire click droit sur var/cache/dev/Symfony/Config
> Mark directory as
> Cancel exclusion
.
Le nom de la classe Config
est la version UpperCamelCase de votre clé de configuration, suffixée de Config
.
Example :
doctrine_migrations:
use Symfony\Config\DoctrineMigrationsConfig;
Au même endroit que votre fichier YAML, créez un fichier PHP du même nom.
Ce nom n’est pas important pour Symfony, mais par convention, le nom du fichier est le nom de la clé de configuration principale.
Ensuite, il faut effectuer la convertion :
chaque clé dans le YAML doit avoir une méthode correspondante, au format camelCase, dans la classe Config
.
Exemple avec la version de base de config/packages/framework.yaml
:
framework:
secret: '%env(APP_SECRET)%'
session: true
router:
default_uri: http://localhost:10000
when@prod:
framework:
router:
strict_requirements: null
when@test:
framework:
test: true
session:
storage_factory_id: session.storage.factory.mock_file
<?php
declare(strict_types=1);
use Symfony\Config\FrameworkConfig;
return static function (FrameworkConfig $config): void {
$config->secret($_ENV['APP_SECRET']);
$config
->session()
->enabled(true);
$config->router()->defaultUri('http://localhost:10000');
if ($_ENV['APP_ENV'] === 'prod') {
$config->router()->strictRequirements(null);
}
if ($_ENV['APP_ENV'] === 'test') {
$config->test(true);
$config
->session()
->storageFactoryId('session.storage.factory.mock_file');
}
};
Vous pouvez vérifier que la configuration n’a pas changé en exécutant bin/dev/console debug:config [CONFIG_KEY]
,
et en comparant avec la version que vous avez exécuté avant la convertion (étape #1).
Si un Bundle n’est pas installé dans tous les environnements,
alors la classe Config
n’existera que dans les environnements dans lesquels le Bundle est installé.
Par exemple, Symfony\Bundle\DebugBundle\DebugBundle
n’est installé que pour l’environnement dev
.
Dans ce cas, vous pouvez faire comme ça :
<?php
declare(strict_types=1);
use App\Environment\Environment;
use Symfony\Config\DebugConfig;
if ($_ENV['APP_ENV'] === 'dev') {
return static function (DebugConfig $config): void {
};
}