2012-04-15 6 views
5

que sigo "¿Cómo exponer una configuración semántica de un paquete de" manual oficial de Symfony 2.cómo acceder a la configuración semántica en un controlador con symfony2?

tengo mi configuration.php

namespace w9\UserBundle\DependencyInjection; 

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

class Configuration implements ConfigurationInterface 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function getConfigTreeBuilder() 
    { 
     $treeBuilder = new TreeBuilder(); 
     $rootNode = $treeBuilder->root('w9_user'); 

     $rootNode 
      ->children() 
       ->scalarNode('logintext')->defaultValue('Zareejstruj się')->end() 
      ->end() 
     ;   

     return $treeBuilder; 
    } 
} 

Y w9UserExtension.php:

namespace w9\UserBundle\DependencyInjection; 

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

class w9UserExtension extends Extension 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
     $loader->load('services.yml'); 
    } 
} 

Puede sonar tonto, pero no puedo encontrar el camino, ¿cómo acceder al parámetro logintext en el controlador?

$logintext = $this->container->getParameter("w9_user.logintext"); 

no funciona.

¿Qué estoy haciendo mal?

Respuesta

10

En w9UserExtension.php después processConfiguration línea sólo tiene que añadir

$container->setParameter('w9_user.logintext', $config['logintext']); 
+1

Wow. Gracias. – dunqan

+3

¿Qué pasa si tengo un montón de parámetros de configuración, cómo los configuraría todos a la vez? – acme

+0

@acme Yo también quería hacer eso. Ver mi respuesta a continuación. – LaGoutte

0

que quería añadir indiscriminadamente todos los valores de configuración mis a los parámetros, como @acme, y escribir docenas de líneas setParameter no era lo suficientemente vago.

Por lo tanto, hice un método setParameters para agregar a la clase Extension.

/** 
* Set all leaf values of the $config array as parameters in the $container. 
* 
* For example, a config such as this for the alias w9_user : 
* 
* w9_user: 
* logintext: "hello" 
* cache: 
*  enabled: true 
* things: 
*  - first 
*  - second 
* 
* would yield the following : 
* 
* getParameter('w9_user.logintext') == "hello" 
* getParameter('w9_user.cache') ---> InvalidArgumentException 
* getParameter('w9_user.cache.enabled') == true 
* getParameter('w9_user.things') == array('first', 'second') 
* 
* It will resolve `%` variables like it normally would. 
* This is simply a convenience method to add the whole array. 
* 
* @param array $config 
* @param ContainerBuilder $container 
* @param string $namespace The parameter prefix, the alias by default. 
*       Don't use this, it's for recursion. 
*/ 
protected function setParameters(array $config, ContainerBuilder $container, 
           $namespace = null) 
{ 
    $namespace = (null === $namespace) ? $this->getAlias() : $namespace; 

    // Is the config array associative or empty ? 
    if (array_keys($config) !== range(0, count($config) - 1)) { 
     foreach ($config as $k => $v) { 
      $current = $namespace . '.' . $k; 
      if (is_array($v)) { 
       // Another array, let's use recursion 
       $this->setParameters($v, $container, $current); 
      } else { 
       // It's a leaf, let's add it. 
       $container->setParameter($current, $v); 
      } 
     } 
    } else { 
     // It is a sequential array, let's consider it as a leaf. 
     $container->setParameter($namespace, $config); 
    } 
} 

que entonces se puede utilizar la siguiente manera:

class w9UserExtension extends Extension 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     // Add them ALL as container parameters 
     $this->setParameters($config, $container); 

     // ... 
    } 
} 

Advertencia

Esto puede ser mala práctica si no documenta extensamente y/o la necesidad de este tipo de comportamiento , ya que puede exponer la información de configuración confidencial si se olvida de ella y perder el rendimiento al exponer la configuración inútil.

Además, le impide higienizar ampliamente las variables de configuración antes de agregarlas en la bolsa de parámetros del contenedor.

Si está utilizando esto, probablemente debería utilizar parameters: y no la configuración semántica, a menos que sepa lo que está haciendo.

Utilice bajo su responsabilidad.

Cuestiones relacionadas