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

sko*_*oft 22 symfony symfony-sonata symfony-2.1 sonata-admin

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

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

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

小智 50

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

$this->getConfigurationPool()->getContainer();
Run Code Online (Sandbox Code Playgroud)

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

  • 自 Sonata Admin 3.77.0 起,管理池的方法 `getContainer()` 已被弃用,并已在 4.x 中删除。请参阅其他答案以了解替代(=正确)方法。 (3认同)

Мак*_*тов 14

添加您的Admin类

/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
private $container;

public function setContainer (\Symfony\Component\DependencyInjection\ContainerInterface $container) {
    $this->container = $container;
}
Run Code Online (Sandbox Code Playgroud)

并在服务配置中添加调用(可以在YAML,XML或PHP中指定配置):

YAML

calls:
    - [ setContainer, [ @service_container ] ]
Run Code Online (Sandbox Code Playgroud)

XML

 <call method="setContainer">
     <argument type="service" id="service_container" />
 </call>
Run Code Online (Sandbox Code Playgroud)

现在您可以使用正常的symfony方法: $this->container->get()

有关更多信息,请参阅Service Container文档