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.

22
demandé sur Elnur Abdurrakhimov 2012-09-01 04:37:06

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?

47
répondu Javier Neyra 2013-08-01 20:27:41

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

14
répondu Максим Шатов 2013-02-03 02:27:46

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:

documentation du conteneur de Service

2
répondu skonsoft 2013-01-28 05:54:06

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.

1
répondu likeitlikeit 2012-09-01 15:26:35