5

HelloWorldAdminBundle私のアプリケーションは、、、HelloWorldUserBundleのような名前の複数のバンドルで構成されていますHelloWorldDemoBundlehello_world_demoこれにより、、、などの構成ルートが作成されhello_world_userますhello_world_demo。バンドルの構成ルートは、、およびである必要がhelloworld_demoありhelloworld_userますhelloworld_admin。その時点で、これは実際には技術的な問題ではなく、より美的な問題であることに言及する必要があります。

カスタム拡張機能を実装して、バンドルに登録しようとしました。

public function build(ContainerBuilder $container)
{
    parent::build($container);

    $container->registerExtension(new HelloworldDemoExtension());
}

拡張機能:

...
class HelloworldDemoExtension 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');
    }

    public function getAlias()
    {
        return 'hello_world_demo';
    }
}

そして最後に構成:

...
class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('helloworld_demo');
        ...
        return $treeBuilder;
    }
}

バンドルのセマンティック構成を公開する方法の指示に従いましたが、アイテムを追加するとconfig.yml、次のエラーが発生します。

There is no extension able to load the configuration for "helloworld_demo"
4

4 に答える 4

3

私の問題の解決策を見つけました。質問で説明したとおりに機能しますが、デフォルトの拡張機能 (バンドルの名前付き)が存在する必要があります。

これで空ですが、HelloWorldDemoExtension という名前の既存の拡張機能 (エイリアスを使用しhello_world_demo、さらに DemoExtension (エイリアスを使用) を追加) がhelloworld_demoあり、機能します。

于 2012-09-10T13:33:10.997 に答える
0

ドキュメントが言うように:

拡張機能を作成するときは、次の簡単な規則に従ってください。

  • 拡張機能は、DependencyInjectionサブ名前空間に格納する必要があります。
  • 拡張機能は、バンドル名にちなんで名前を付け、拡張子にExtension(AcmeHelloBundleの場合はAcmeHelloExtension)を付ける必要があります。
  • 拡張機能はXSDスキーマを提供する必要があります。

build独自のメソッドとメソッドを定義する必要があるかどうかはわかりませんgetAlias。必要な場合、getAliasメソッドはルートノードで定義したのと同じ値を返す必要があります。helloworld_demoだからそれはおそらく代わりにすべきですhello_world_demo

于 2012-09-10T13:01:30.540 に答える
0

「この場合、拡張クラスはgetAlias()メソッドも実装し、バンドルにちなんで名付けられた一意のエイリアス(acme_helloなど)を返す必要があります。これは、クラス名がExtensionで終わることで標準に準拠していないために必要です。さらに、拡張機能のload()メソッドは、ユーザーが少なくとも1つの構成ファイルでacme_helloエイリアスを指定した場合にのみ呼び出されます。 "

したがって、このエイリアスはルート構成名です。コードを次のように変更します

public function getAlias()
{
    return 'helloworld_demo';
}

そしてそれはうまくいくはずです

于 2012-09-10T13:22:44.377 に答える