我正在尝试在Symfony2中编写捆绑包的语义配置。我使用YAML(spu.yml)编写了一个配置文件:
spu:
modules:
spu-module:
reuqires: []
path: modules/spu-module.js
然后我将它加载到扩展文件(DependencyInjection / spuExtension.php)中:
namespace Gig\SpuBundle\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;
class spuExtension extends Extension
{
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' );
$loader->load( 'spu.yml' );
}
}
此扩展的配置类()DependencyInjection / Configuration.php)是:
namespace Gig\SpuBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'spu' );
$rootNode
->children()
->arrayNode('modules')
->isRequired()
->prototype('array')
->end()
->end();
return $treeBuilder;
}
}
验证配置时出错:
[Symfony的\元器件\配置\定义\异常\ InvalidConfigurationException] 必须配置路径“spu”中的子节点“modules”。
我做错了什么?
答案 0 :(得分:1)
您必须将其包含在主app / config / config.yml文件中
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: spu.yml }
如果要使用默认参数,请在DependencyInjection / Configuration.php中设置它们 这可能是这样的。
$rootNode
->children()
->arrayNode('modules')
->isRequired()
->addDefaultsIfNotSet()
->prototype('array')
->children()
->arrayNode('reuqires')->end()
->scalarNode('path')->defaultValue('modules/spu-module.js')->end()
->end()
->end()
->end()
->end();
答案 1 :(得分:0)
执行此操作的最佳方法是让用户在config.yml文件中定义捆绑包的配置。不需要特殊文件。
您可以保留Configuration类中的配置,但必须修改spuExtension类。
Symfony的工作方式你必须在spuExtension类中读取bundle的config.yml中的值,然后将它们设置为参数。然后,您可以使用容器的getParameter方法轻松访问这些值。
这就是你的config.yml看起来的样子
spu:
modules:
spu-module:
reuqires: []
path: modules/spu-module.js
然后在您的spuExtension类中,您可以通过执行以下操作来获取这些值:
class spuExtension extends Extension
{
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' );
$container->setParameter('modules', $configs[0]);
}
}
这将使您可以轻松地在控制器中使用容器来获取参数。
spuExtension中的$ configs变量将包含根目录下列出的所有配置。在这种情况下是spu。
Symfony的工作方式首先必须在bundle的扩展类中加载配置,然后将其设置为参数,这似乎是多余的,但这是最佳实践,它的目的是像这样工作。
答案 2 :(得分:0)
好的,我的方式不同。
public function load(array $configs, ContainerBuilder $container)
{
$loader = new Loader\YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
$loader->load( 'services.yml' );
$loader->load( 'spu.yml' );
$spuConfig = Yaml::parse(__DIR__ . '/../Resources/config/spu.yml');
$configs = array_merge($configs, $spuConfig);
$configuration = new Configuration();
$config = $this->processConfiguration( $configuration, $configs );
}
现在我得到了我想要的东西。我可以在Configuration
类中验证params。