繁体   English   中英

如何在 Sonata Admin 类中获取容器实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM