symfony - ¿Cómo obtener instancia de contenedor en la clase de administración de sonata?
symfony 4 admin (4)
Agregue su clase Admin
/** @var /Symfony/Component/DependencyInjection/ContainerInterface */
private $container;
public function setContainer (/Symfony/Component/DependencyInjection/ContainerInterface $container) {
$this->container = $container;
}
Y agregue llamadas en la configuración de los servicios (la configuración se puede especificar en YAML, XML o PHP):
YAML
calls:
- [ setContainer, [ @service_container ] ]
XML
<call method="setContainer">
<argument type="service" id="service_container" />
</call>
Ahora puedes usar el método symfony normal: $this->container->get()
Para obtener más información, consulte la documentación del contenedor de servicio
Necesito analizar algunos parámetros de configuración de mi config.yml, como los idiomas habilitados. Pero cuando trato de hacerlo usando el método symfony normal: $this->container->get(''my_params'');
falla porque mi clase de administrador extiende la clase Sonata/AdminBundle/Admin/Admin
que no extiende la clase Symfony/Component/DependencyInjection/ContainerAware
.
Por favor, ¿cómo conseguir el contenedor dentro de la clase de administración de sonata?
Ahora resuelvo este problema anulando la clase de administración de sonata para que amplíe el ContainerAware.
En su situación particular, podría ser conveniente tener una clase AdminController
personalizada que establezca los parámetros de su clase Admin
. Esto se ajustaría al patrón MVC y le evitaría cambiar los paquetes de proveedores. Si no sabe cómo hacerlo, actualice su pregunta y la explicaré con más detalle.
Esta es la mejor forma de usar los servicios en las clases de administración de sonata:
Simplemente inyecte el servicio necesario usando la inyección setter . Las inyecciones de constructor no están permitidas en este caso, ya que tendría que anular el constructor de la clase principal. El constructor de la clase padre acepta solo 3 parámetros, por lo que no puede agregar otro.
La solucion es:
<!-- 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>
Luego, solo agregue un método público en su clase de administrador llamado setEnabledLocales
.
/* file: MyclassAdmin.php */
public function setEnabledLocales($locales){
$this->enabedLocales = $locales;
}
Echa un vistazo a:
probablemente ya se haya resuelto, porque es una pregunta antigua, pero solo como referencia, el contenedor ya está disponible en la clase de administrador utilizando el grupo de configuración ...
$this->getConfigurationPool()->getContainer();
Por supuesto, es una mejor práctica inyectar servicios en la clase de administración, pero, como en los controladores. ¿Por qué alguien, tómese el tiempo para configurar la inyección setter si ya tiene el contenedor disponible?