这是针对Symfony 4的。
我需要使用DependencyInjection \ Configuration和DependencyInjection \ AppExtension实现应用程序(不是捆绑包),配置参数。
我像创建捆绑包一样创建了两个类。每个名称空间是App \ DependencyInjection。
文件名和类名分别是Configuration和AppExtension,分别位于src / DependencyInjection /中。
为了简单起见,当前配置仅定义了两个标量节点。
// src/DependencyInjection/Configuration.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();
$rootNode = $treeBuilder->root( 'app' );
$rootNode
->addDefaultsIfNotSet()
->children()
->scalarNode( 'a1' )
->defaultValue( 'I am the default value for a1' )
->end()
->scalarNode( 'a2' )
->defaultValue( 'I am the default value for a2' )
->end()
->end();
return $treeBuilder;
}
}
AppExtension类实现两个方法:__construct()和load()。
__construct()方法只是回显其方法名称。
load()方法当前执行一次die(__METHOD__);只是为了确保我知道它是否被调用。不是。
// src/DependencyInjection/AppExtension.php
namespace App\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
class AppExtension extends Extension
{
public function __construct()
{
echo __METHOD__ . "()\n";
}
public function load( array $configs, ContainerBuilder $container )
{
die( __METHOD__ );
}
}
我还创建了一个配置文件:
# config/app.yml
app:
a1: 'A one'
a2: 'A two'
this question的答案表示我需要在src / kernel.php文件的configureContainer()方法中包含对$ container-> registerExtension()的调用,因此我添加了该调用。
protected function configureContainer( ContainerBuilder $container, LoaderInterface $loader )
{
$container->registerExtension( new AppExtension() );
...
}
当我运行控制台cache:clear命令时,将调用AppExtension的构造函数,但从不会调用load()方法。
运行控制台debug:config app命令会导致以下错误:
没有适用于“应用”的扩展程序。
我想念什么?
TIA
最佳答案
所以。我有解决办法。
除了src / DependencyInjection /中的常规Configuration和AppExtension类,它需要做三件事
实现一个空的App \ AppBundle类,该类扩展Bundle并将其放置在src /中
// src/AppBundle.php
namespace App;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AppBundle extends Bundle {}
将捆绑商品的条目添加到config / bundles.php返回的数组中
<?php
// config/bundles.php
return [
...
App\AppBundle::class => ['all' => true],
]
将您的配置参数放在config / packages / app.yaml中
# config/packages/app.yaml
app:
a1: 'A1 from app.yaml'
a2: 'A2 from app.yaml'
array_one:
a: { attr1: 'attribute one', attr2: 'two' }
b: { attr1: 'attribute one', attr2: 'two' }
这实际上为我工作。
顺便说一下,用这种方式,您无需在Kernel.php中注册扩展名。