web-dev-qa-db-ja.com

ソナタ管理クラスでコンテナインスタンスを取得する方法は?

有効な言語など、config.ymlからいくつかの構成パラメーターを解析する必要があります。しかし、通常のsymfonyメソッドを使用してそれを行おうとすると:$this->container->get('my_params');管理クラスがSonata\AdminBundle\Admin\Adminクラスを拡張しないためSymfony\Component\DependencyInjection\ContainerAwareクラスを拡張するため失敗します。

ソナタ管理クラス内にコンテナを取得するにはどうすればよいですか?

現在、sonata AdminクラスをオーバーライドしてContainerAwareを拡張することにより、この問題を解決しています。

22
skonsoft

古い質問であるため、おそらくすでに解決されていますが、参考までに、コンテナーは構成プールを使用してadminクラスで既に使用可能です...

$this->getConfigurationPool()->getContainer();

もちろん、adminクラスにサービスを注入することをお勧めしますが、コントローラーの場合と同様です。コンテナがすでに利用可能になっているのに、なぜ誰かがセッターインジェクションを設定するのに時間がかかるのでしょうか。

50
Javier Neyra

管理者クラスを追加します

_/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
private $container;

public function setContainer (\Symfony\Component\DependencyInjection\ContainerInterface $container) {
    $this->container = $container;
}
_

そして、サービス構成に呼び出しを追加します(構成はYAML、XML、またはPHPで指定できます):

[〜#〜] yaml [〜#〜]

_calls:
    - [ setContainer, [ @service_container ] ]
_

[〜#〜] xml [〜#〜]

_ <call method="setContainer">
     <argument type="service" id="service_container" />
 </call>
_

これで、通常のsymfonyメソッドを使用できます:$this->container->get()

詳細については、 サービスコンテナ ドキュメントを参照してください。

ソナタ管理クラスでサービスを使用する最良の方法は次のとおりです。

セッターインジェクションを使用して必要なサービスをインジェクトするだけです。この場合、親クラスのコンストラクターをオーバーライドする必要があるため、コンストラクターの挿入は許可されません。親クラスのコンストラクターは3つのパラメーターのみを受け入れるため、別のパラメーターを追加することはできません。

解決策は次のとおりです。

<!-- file: services.xml -->

 <service id="skonsoft.znata.admin.keyword" class="%skonsoft.znata.admin.keyword.class%">
            <tag name="sonata.admin" manager_type="orm" group="Keyword" label="Keyword"/>
            <argument />
            <argument>%skonsoft.znata.admin.keyword.entity.class%</argument>
            <argument>SonataAdminBundle:CRUD</argument>
            <call method="setTranslationDomain">
                <argument>SkonsoftZnataBundle</argument>
            </call>

            <!-- here you inject needed services or parameters -->
            <call method="setEnabledLocales">
                <argument>%skonsoft_znata.locales%</argument>
            </call>
        </service>

次に、管理クラスにsetEnabledLocalesというパブリックメソッドを追加するだけです。

/* file: MyclassAdmin.php */

 public function setEnabledLocales($locales){
    $this->enabedLocales = $locales;
}

を見てみましょう:

サービスコンテナのドキュメント

2
skonsoft

特定の状況では、カスタムAdminControllerクラスにAdminクラスのパラメーターを設定させるのが賢明かもしれません。これはMVCパターンに準拠し、ベンダーバンドルを変更する手間を省きます。これを行う方法がわからない場合は、質問を更新してください。詳細を説明します。

1
likeitlikeit

Liip_imagineサービスの例を次に示します。

 $cacheManager = $this->getConfigurationPool()->getContainer()->get('liip_imagine.cache.manager');
0
Shadi Akil