我需要解析config.yml中的一些配置参数,例如启用的语言。但是当我尝试使用普通的symfony方法执行此操作时:$this->container->get('my_params');
它失败了,因为我的管理类扩展了Sonata\AdminBundle\Admin\Admin
类,但没有扩展Symfony\Component\DependencyInjection\ContainerAware
类。
请问,如何在奏鸣曲Admin类中获取容器?
现在我通过覆盖奏鸣曲管理类来解决这个问题,使其扩展ContainerAware。
答案 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;
}
看看:
答案 3 :(得分:1)
在您的特定情况下,让自定义AdminController
类设置Admin
类的参数可能是明智之举。这将遵循MVC模式,并使您免于更改供应商包。如果您不知道如何执行此操作,请更新您的问题,我会更详细地解释。
答案 4 :(得分:0)
以下是liip_imagine服务的示例:
$cacheManager = $this->getConfigurationPool()->getContainer()->get('liip_imagine.cache.manager');