How to get container instance in sonata Admin class? How to get container instance in sonata Admin class? symfony symfony

How to get container instance in sonata Admin class?


probably already resolved, because its an old question, but just for reference, the container is already available in admin class using the configuration pool...

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

Of course, it is better practice to inject services in the admin class, but, like in the controllers. why would someone, take the time to configure setter injection if already has the container available?


Add in your Admin class

/** @var \Symfony\Component\DependencyInjection\ContainerInterface */private $container;public function setContainer (\Symfony\Component\DependencyInjection\ContainerInterface $container) {    $this->container = $container;}

And add calls in services configuration(configuration can be specified in YAML, XML or PHP):

YAML

calls:    - [ setContainer, [ @service_container ] ]

XML

 <call method="setContainer">     <argument type="service" id="service_container" /> </call>

Now you can using the normal symfony method: $this->container->get()

For more information see Service Container documentation


Here is the best way to use services in sonata admin classes:

Just inject the needed service using setter injection. Constructor injections are not allowed in this case, because you would have to override the constructor of the parent class. The constructor of the parent class accepts only 3 parameters, so you can not add another one.

The solution is:

<!-- 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>

Then, just add a public method in your admin class called setEnabledLocales.

/* file: MyclassAdmin.php */ public function setEnabledLocales($locales){    $this->enabedLocales = $locales;}

Take a look at:

Service Container documentation