23

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

Sonata Admin クラス内でコンテナを取得する方法を教えてください。

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

4

6 に答える 6

53

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

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

もちろん、管理クラスにサービスを注入することをお勧めしますが、コントローラーと同様です。コンテナーが既に利用可能である場合、なぜ誰かがセッター注入を構成するのに時間がかかるのでしょうか?

于 2013-08-01T20:27:41.953 に答える
16

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

/** @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()

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

于 2013-02-03T02:27:46.047 に答える
3

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

セッター注入を使用して、必要なサービスを注入するだけです。この場合、親クラスのコンストラクターをオーバーライドする必要があるため、コンストラクター インジェクションは許可されません。親クラスのコンストラクターは 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>

次に、管理クラスに public メソッドを追加するだけsetEnabledLocalesです。

/* file: MyclassAdmin.php */

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

を見てみましょう:

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

于 2012-09-01T15:52:28.210 に答える
1

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

于 2012-09-01T15:26:35.433 に答える