Подтвердить что ты не робот

Как получить экземпляр контейнера в классе администратора сонаты?

Мне нужно проанализировать некоторые параметры конфигурации из моего config.yml, например, с включенными языками. Но когда я пытаюсь это сделать, используя обычный метод symfony: $this->container->get('my_params'); он терпит неудачу, потому что мой класс admin расширяет класс Sonata\AdminBundle\Admin\Admin, который не расширяет класс Symfony\Component\DependencyInjection\ContainerAware.

Пожалуйста, как получить контейнер внутри класса администратора сонаты?

Теперь я разрешаю эту проблему, переопределяя класс администратора сонаты, чтобы он расширил ContainerAware.

4b9b3361

Ответ 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');