Как получить экземпляр контейнера в классе администратора сонаты?
Мне нужно проанализировать некоторые параметры конфигурации из моего config.yml, например, с включенными языками. Но когда я пытаюсь это сделать, используя обычный метод symfony: $this->container->get('my_params');
он терпит неудачу, потому что мой класс admin расширяет класс Sonata\AdminBundle\Admin\Admin
, который не расширяет класс Symfony\Component\DependencyInjection\ContainerAware
.
Пожалуйста, как получить контейнер внутри класса администратора сонаты?
Теперь я разрешаю эту проблему, переопределяя класс администратора сонаты, чтобы он расширил ContainerAware.
Ответы
Ответ 1
возможно, уже разрешен, поскольку его старый вопрос, но только для справки, контейнер уже доступен в классе admin с использованием пула конфигурации...
$this->getConfigurationPool()->getContainer();
Конечно, лучше применять инъекции в классе admin, но, как и в контроллерах. почему кто-то, потратьте время на настройку инсталляции сеттера, если уже есть контейнер?
Ответ 2
Добавьте в свой класс администратора
/** @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
Ответ 3
Вот лучший способ использования сервисов в классах sonata admin:
Просто введите необходимую услугу, используя инъекцию установщика. В этом случае встраивание конструктора не допускается, поскольку вам придется переопределить конструктор родительского класса. Конструктор родительского класса принимает только 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;
}
Взгляните на:
Документация по контейнерному контейнеру
Ответ 4
В вашей конкретной ситуации может быть разумным, чтобы пользовательский класс AdminController
задавал параметры вашего класса Admin
. Это будет соответствовать шаблону MVC и избавит вас от изменения пакетов поставщиков. Если вы не знаете, как это сделать, обновите свой вопрос, и я объясню более подробно.
Ответ 5
Вот пример службы liip_imagine:
$cacheManager = $this->getConfigurationPool()->getContainer()->get('liip_imagine.cache.manager');