Uso di parametri in una classe Dependency Injection

Abbiamo già visto come usare parametri della configurazione nei contenitori di servizi di Symfony. Ci sono casi speciali in cui si vuole, per esempio, usare il parametro %kernel.debug% per far modo che un servizio entri in modalità di debug. Per questi casi, occorre un po’ di lavoro in più per far capire il valore del parametro al sistema. Per impostazione predefinita, il parametro %kernel.debug% sarà trattato come una semplice stringa. Si consideri questo esempio con AcmeDemoBundle:

// Dentro una classe Configuration
$rootNode
    ->children()
        ->booleanNode('logging')->defaultValue('%kernel.debug%')->end()
        // ...
    ->end()
;

// Dentro una classe Extension
$config = $this->processConfiguration($configuration, $configs);
var_dump($config['logging']);

Vediamo ora i risultati:

  • YAML
    mio_bundle:
        logging: true
        # true, come ci si aspettava
    
    mio_bundle:
        logging: %kernel.debug%
        # true/false (a seconda del secondo parametro di AppKernel),
        # come ci si aspettava, perché %kernel.debug% dentro una configurazione
        # è valutato prima di essere passato all'estensione
    
    mio_bundle: ~
    # passa la stringa "%kernel.debug%".
    # Che è sempre considerata true.
    # Il configuratore non sa che
    # "%kernel.debug%" va preso come un parametro.
  • XML
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:my-bundle="http://example.org/schema/dic/my_bundle">
    
        <mio-bundle:config logging="true" />
        <!-- true, come ci si aspettava -->
    
         <my-bundle:config logging="%kernel.debug%" />
         <!-- true/false (a seconda del secondo parametro di AppKernel),
              come ci si aspettava, perché %kernel.debug% dentro una configurazione
              è valutato prima di essere passato all'estensione -->
    
        <mio-bundle:config />
        <!-- passa la stringa "%kernel.debug%".
             Che è sempre considerata true.
             Il configuratore non sa che
             "%kernel.debug%" va preso come un parametro. -->
    </container>
    
  • PHP
    $container->loadFromExtension('mio_bundle', array(
            'logging' => true,
            // true, come ci si aspettava
        )
    );
    
    $container->loadFromExtension('mio_bundle', array(
            'logging' => "%kernel.debug%",
            // true/false (a seconda del secondo parametro di AppKernel),
            // come ci si aspettava, perché %kernel.debug% dentro una configurazione
            // è valutato prima di essere passato all'estensione
        )
    );
    
    $container->loadFromExtension('my_bundle');
    // passa la stringa "%kernel.debug%".
    // Che è sempre considerata true.
    // Il configuratore non sa che
    // "%kernel.debug%" va preso come un parametro.
    

Per supportare anche questo caso, alla classe Configuration va iniettato questo parametro, tramite l’estensione, come segue:

namespace Acme\DemoBundle\DependencyInjection;

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

class Configuration implements ConfigurationInterface
{
    private $debug;

    public function  __construct($debug)
    {
        $this->debug = (Boolean) $debug;
    }

    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('acme_demo');

        $rootNode
            ->children()
                // ...
                ->booleanNode('logging')->defaultValue($this->debug)->end()
                // ...
            ->end()
        ;

        return $treeBuilder;
    }
}

E poi impostato nel costruttore di Configuration tramite la classe Extension:

namespace Acme\DemoBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Config\FileLocator;

class AcmeDemoExtension extends Extension
{
    // ...

    public function getConfiguration(array $config, ContainerBuilder $container)
    {
        return new Configuration($container->getParameter('kernel.debug'));
    }
}

Argomento precedente

Modificare la struttura predefinita della cartelle

Argomento successivo

Capire come interagiscono front controller, Kernel e ambienti

Questa pagina