web-dev-qa-db-ja.com

DI拡張クラスのYaml構成ファイルからカスタムパラメーターをロード、処理、使用するにはどうすればよいですか?

ここに記載されているドキュメントに従って、アプリにyaml構成ファイルをインポートしようとしています http://symfony.com/doc/current/bundles/extension.html しかし、常にエラーメッセージが表示されます。

「アプリ」の構成をロードできる拡張機能はありません

私のファイルはここにあります:config/packages/app.yamlそして次の構造を持っています:

app:  
    list:  
        model1:  
            prop1: value1
            prop2: value2  
        model2:
            ...

これは単純なアプリであるため、すべてのファイルはsrc/にあります。だから私はsrc/DependencyInjection/AppExtension.phpを持っています

<?php

namespace App\DependencyInjection;

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

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

そしてsrc/DependencyInjection/Configuration.php

<?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');

        // Node definition
        $rootNode
            ->children()
                ->arrayNode('list')
                    ->useAttributeAsKey('name')
                    ->requiresAtLeastOneElement()
                    ->prototype('array')
                        ->children()
                            ->requiresAtLeastOneElement()
                            ->prototype('scalar')
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
}

パラメータにアクセスできません:(
何か案が?

6
ArGh

カスタム構成ファイルをロードして、拡張クラス(Symfonyバンドル拡張のようにバンドルを作成せずに)を使用してパラメーターを処理する場合は、最終的に「作成」し、その1つ以上を「コンテナ」に追加します(コンパイルされる前に)、Extensionクラスを手動で登録できます。 Kernel.phpファイルに含まれるconfigureContainerメソッド:

protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
{
    // to avoid the same error you need to put this line at the top
    // if your file is stored under "$this->getProjectDir().'/config'" directory
    $container->registerExtension(new YourAppExtensionClass());

    // ----- rest of the code
}

その後、通常どおりパラメータを使用できます コンパイラパスの登録

お役に立てれば。

13
gp_sflover