23

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

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

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

4

6 回答 6

53

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

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

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

于 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

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

只需使用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;
}

看一眼:

服务容器文档

于 2012-09-01T15:52:28.210 回答
1

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

于 2012-09-01T15:26:35.433 回答
0

这是 liip_imagine 服务的示例:

 $cacheManager = $this->getConfigurationPool()->getContainer()->get('liip_imagine.cache.manager');
于 2019-01-18T15:03:29.423 回答
0

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;
    }
  
    ...
}
于 2021-12-21T11:06:06.620 回答