2012-09-10 15 views
5

私のアプリケーションは、HelloWorldAdminBundle,HelloWorldUserBundleHelloWorldDemoBundleという名前の複数のバンドルで構成されています。これにより、hello_world_demohello_world_user、およびhello_world_demoのような構成ルートが生成されます。バンドルのコンフィグレーションルーツはhelloworld_demohelloworld_userhelloworld_adminです。その時点では、これは実際には技術的な問題ではなく、審美的な問題であると言わざるを得ない。Symfony2:カスタム設定ルート

私はカスタム拡張を実装し、バンドルに登録しようとしています:

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; 
    } 
} 

How to expose a Semantic Configuration for a Bundleの指示、にアイテムを追加するとdocumentationとして

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

答えて

3

動作するはずです。それは私が質問でそれを記述したのとまったく同じですが、デフォルトの拡張子(バンドルの名前)でなければなりません。

私は今、私は別名helloworld_demoとDemoExtension()を追加し、それが動作HelloWorldDemoExtension(別名hello_world_demoとし、さらに名前の空が、既存の拡張子を持っている。

+0

素晴らしい!あなたがそれを見つけられたらうれしい –

0

は言う:あなたは自分のbuildgetAliasメソッドを定義する必要がある場合、私は本当に知らないのです

When creating an extension, follow these simple conventions:

  • The extension must be stored in the DependencyInjection sub-namespace;
  • The extension must be named after the bundle name and suffixed with Extension (AcmeHelloExtension for AcmeHelloBundle);
  • The extension should provide an XSD schema.

10は、私は次のエラーを取得します。必要な場合は、getAliasメソッドは、ルートノードで定義したのと同じ値を返します。だから、それはおそらくhelloworld_demoの代わりに、この場合、本 」からhello_world_demo

+0

いいえ、私がドキュメントを理解している限り、 'getAlias'メソッドはSymfonyが拡張をバンドルに関連付けるために使用します。拡張の名前はもはやバンドルのヒントを提供しないので、エイリアスが使用されます。 **編集:**これは、セマンティックコンフィグレーションのドキュメントページの一番下に説明されています。http://symfony.com/doc/2.0/cookbook/bundles/extension.html#extension-conventions –

+0

そして最初の部分について。私はこれらの慣習を認識しており、美学のためにそれらを壊したいと思っています。 –

0

する必要があり、拡張クラスも(例えばacme_hello)getAliasは()メソッドを実装し、バンドルにちなんで名付けられたユニークな別名を返さなければなりません。これが必要です また、ユーザーが少なくとも1つの構成ファイルでacme_helloエイリアスを指定した場合にのみ、拡張機能のload()メソッドが呼び出されます。

Soこの別名ISはルート構成名です。

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

にコードを変更し、それは私が私の問題への解決策を見つけた

+0

'[LogicException] バンドルのデフォルトの拡張子の拡張エイリアスはバンドル名の下線付きのバージョンでなければなりません(" helloworld_demo "の代わりに" hello_world_demo ")' –

+0

mmm ...だから、残っている唯一の解決策あなたのバンドルの名前をHelloworldDemoBundleなどに変更することです... –

3

私はSymfony\Component\HttpKernel\Bundle\Bundle#getContainerExtension()をオーバーライドすることによってこれを解決しました。

このメソッドは自動的にExtensionInterfaceのインスタンスを作成して返し、拡張子の別名(Carlos Granados'の回答として拡張クラスにgetAliasを実装することで指定できる)が命名規則に準拠しているかどうかをチェックします。

バンドルクラスのgetContainerExtension()メソッドをオーバーライドし、拡張クラスのインスタンスを返すだけで、チェックとLogicExceptionをバイパスすることができます。

これは、あなたのバンドル・クラスは次のようになります。

<?php 

namespace HelloWorld\Bundle\UserBundle; 

use HelloWorld\Bundle\UserBundle\DependencyInjection\HelloWorldUserExtension; 
use Symfony\Component\HttpKernel\Bundle\Bundle; 

class HelloWorldUserBundle extends Bundle 
{ 
    public function getContainerExtension() 
    { 
     if (null === $this->extension) { 
      $this->extension = new HelloWorldUserExtension(); 
     } 

     return $this->extension; 
    } 
} 

そして、もちろん、あなたの拡張クラスにこれを追加することを忘れないでください:

/** 
* The extension alias 
* 
* @return string 
*/ 
public function getAlias() 
{ 
    return 'helloworld_user'; 
} 

警告:IなぜこのチェックがgetContainerExtension()メソッドに追加されたのかわかりません。非常に正当な理由がある可能性があり、上記の手順を実行する際に問題が発生する可能性があります。しかし、これまでのところ問題はありませんでした。

Symfony2: Some things I don't like about Bundlesも参照してください。このブログ記事には、私の答えと同じ解決策が付属しています。 Symfonyのドキュメントについては、this pull requestを参照してください。これは同じ方法についても説明しています。これは、副作用を期待することなくそうすることが安全だと私に信じさせる。

+0

これは醜いですが、実際にsymfonyの慣習を破りたいのであれば、それは行く方法です。とにかくバンドルの名前を正しく指定することが最もクリーンな方法です。 –

+1

@AlainTiembloがバンドルを正しく指定することは必ずしも可能ではありません - 'CMSIP2LocationBundle'。 – tftd

関連する問題