如何在奏鸣曲Admin类中获取容器实例?

时间:2012-09-01 00:37:06

标签: symfony symfony-2.1 symfony-sonata sonata-admin

我需要解析config.yml中的一些配置参数,例如启用的语言。但是当我尝试使用普通的symfony方法执行此操作时:$this->container->get('my_params');它失败了,因为我的管理类扩展了Sonata\AdminBundle\Admin\Admin类,但没有扩展Symfony\Component\DependencyInjection\ContainerAware类。

请问,如何在奏鸣曲Admin类中获取容器?

现在我通过覆盖奏鸣曲管理类来解决这个问题,使其扩展ContainerAware。

5 个答案:

答案 0 :(得分:51)

可能已经解决,因为它是一个老问题,但仅供参考,容器已在管理类中使用配置池...

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

当然,最好在admin类中注入服务,但是,就像在控制器中一样。为什么会有人,如果已经有容器可用,请花时间配置setter注入?

答案 1 :(得分:14)

添加您的Admin类

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

有关详细信息,请参阅Service Container文档

答案 2 :(得分:2)

这是在奏鸣曲管理类中使用服务的最佳方式:

使用 setter injection 注入所需的服务。在这种情况下,不允许使用构造函数注入,因为您必须覆盖父类的构造函数。父类的构造函数只接受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;
}

看看:

Service Container documentation

答案 3 :(得分:1)

在您的特定情况下,让自定义AdminController类设置Admin类的参数可能是明智之举。这将遵循MVC模式,并使您免于更改供应商包。如果您不知道如何执行此操作,请更新您的问题,我会更详细地解释。

答案 4 :(得分:0)

以下是liip_imagine服务的示例:

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