Créer une configuration sémantique dans Symfony sans bundle

Créer une configuration sémantique dans Symfony sans bundle

Depuis quelque temps et avec l'arrivé de Flex, le découpage applicatif en bundle ne fait plus partie des bonnes pratiques Symfony. Si cela amène plus de simplicité dans le code, un des avantages des bundles était leur capacité à étendre la configuration du framework grâce au répertoire DependencyInjection.

Voici comment reproduire cela dans les versions récentes de Symfony et sans bundle.

Créons une class de configuration. L'emplacement n'a pas d'importance, pour l'exemple plaçons là dans src/DependencyInjection :

<?php

namespace App\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('app');
        $root = $treeBuilder->getRootNode();

        $root
            ->children()
                ->scalarNode('foobar')->end()
            ->end()
        ;

        return $treeBuilder;
    }
}

Créons ensuite une extension pour charger et traiter cette configuration :

<?php

namespace App\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;

class AppExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $container->setParameter('app.foobar', $config['foobar']);
    }
}

Jusque là, tout ce passe comme dans un bundle. Mais alors que Symfony était capable de détecter et charger les extensions des bundles automatiques, sans bundle il va falloir indiquer à Symfony la présence d'une extension.

Cela va se passer dans la methode Kernel::build() qui permet de modifier la construction du container.

Dans le kernel (src/Kernel.php dans un projet Flex standard), enregistrons notre extensions :

protected function build(ContainerBuilder $container)
{
    $container->registerExtension(new AppExtension());
}

Nous pouvons désormais poser notre configurations dans le répertoire config/packages comme n'importe quel autre configuration. La surcharge de configuration par environnement fonctionne évidemment comme les autres configurations avec les répertoires config/packages/dev, config/packages/prod, etc

# config/packages/app.yaml
app:
    foobar: "foo"

Les commentaires