Comment obtenir l'instance conteneur dans la classe Admin sonata?
je dois analyser quelques paramètres de configuration de ma configuration.yml tels que les langues activées. Mais quand j'essaie de le faire en utilisant la normale symfony méthode: $this->container->get('my_params');
il échoue parce que ma classe admin s'étend SonataAdminBundleAdminAdmin
classe qui n'étend pas le SymfonyComponentDependencyInjectionContainerAware
classe.
s'il vous Plaît, Comment obtenir le conteneur à l'intérieur de la sonata Admin classe ?
maintenant je résous ce problème en remplaçant la classe Admin de la sonata pour qu'elle étende la ContainerAware.
4 réponses
probablement déjà résolu, parce que c'est une vieille question, mais juste pour référence, le conteneur est déjà disponible dans la classe admin en utilisant le pool de configuration...
$this->getConfigurationPool()->getContainer();
bien sûr, il est préférable d'injecter des services dans la classe admin, mais, comme dans les controllers. pourquoi quelqu'un prendrait-il le temps de configurer setter injection si le conteneur est déjà disponible?
ajouter dans votre classe Admin
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
private $container;
public function setContainer (\Symfony\Component\DependencyInjection\ContainerInterface $container) {
$this->container = $container;
}
et ajouter des appels dans la configuration des services (la configuration peut être spécifiée en YAML, XML ou PHP):
YAML
calls:
- [ setContainer, [ @service_container ] ]
XML
<call method="setContainer">
<argument type="service" id="service_container" />
</call>
Maintenant vous pouvez utiliser la méthode symfony normale:$this->container->get()
pour plus d'information voir Conteneur De Service documentation
Voici la meilleure façon d'utiliser les services dans les classes admin sonata:
il suffit d'injecter le service nécessaire en utilisant injection par mutateur. Les injections par le constructeur ne sont pas autorisées dans ce cas, parce que vous auriez à Outrepasser le constructeur de la classe mère. Le constructeur de la classe parent n'accepte que 3 Paramètres, donc vous ne pouvez pas en ajouter un autre.
LA solution est:
<!-- 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>
alors, il suffit d'ajouter une méthode publique dans votre classe admin appelée setEnabledLocales
.
/* file: MyclassAdmin.php */
public function setEnabledLocales($locales){
$this->enabedLocales = $locales;
}
regardez:
dans votre situation particulière, il pourrait être sage d'avoir une coutume AdminController
classe de régler les paramètres de votre Admin
classe. Cela respecterait le modèle MVC et vous éviterait de changer les paquets du fournisseur. Si vous ne savez pas comment faire, veuillez mettre à jour votre question et je vous expliquerai plus en détail.