![](/img/trans.png)
[英]How to get container instance in sonata Admin class (v 4.0.0-rc.1)?
[英]How to get container instance in sonata Admin class?
我需要从我的 config.yml 解析一些配置参数,例如启用的语言。 但是当我尝试使用普通的 symfony 方法来做到这一点时: $this->container->get('my_params');
它失败是因为我的管理类扩展了Sonata\\AdminBundle\\Admin\\Admin
类,它没有扩展Symfony\\Component\\DependencyInjection\\ContainerAware
类。
请问,如何在奏鸣曲管理类中获取容器?
现在我通过覆盖奏鸣曲管理类来解决这个问题,使其扩展 ContainerAware。
可能已经解决了,因为它是一个老问题,但仅供参考,容器已在管理类中使用配置池...
$this->getConfigurationPool()->getContainer();
当然,最好在admin类中注入服务,但是,就像在控制器中一样。 为什么有人,如果已经有容器可用,请花时间配置setter注入?
添加您的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文档
以下是在奏鸣曲管理类中使用服务的最佳方法:
只需使用setter注入注入所需的服务。 在这种情况下,不允许使用构造函数注入,因为您必须覆盖父类的构造函数。 父类的构造函数只接受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;
}
看一眼:
在您的特定情况下,让自定义AdminController
类设置Admin
类的参数可能是明智之举。 这将遵循MVC模式,并使您免于更改供应商包。 如果您不知道如何操作,请更新您的问题,我会更详细地解释。
以下是liip_imagine服务的示例:
$cacheManager = $this->getConfigurationPool()->getContainer()->get('liip_imagine.cache.manager');
Admin Pool 的 getContainer() 方法自 Sonata Admin 3.77.0 起已被弃用,并已在 v4.x 中删除。
您可以通过 Sonata Admin 类 (v4.x) 中的依赖注入来实现这一点。
例如,我已注入 ParameterBagInterface 以在我的奏鸣曲管理中获取应用程序参数。
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class ProtocolAdmin extends AbstractAdmin
{
private $params;
public function __construct(string $code, string $class, string $baseControllerName, ParameterBagInterface $params)
{
parent::__construct($code, $class, $baseControllerName);
$this->params = $params;
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.