这是针对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中注册扩展名。

09-28 09:39