23 votes

Comment obtenir des services (dépendances) dans une classe personnalisée ?

Dans le contrôleur, je pourrais faire

$this->get('service.name')

Mais dans une classe personnalisée, comment puis-je faire cela ?

26voto

Arms Points 8729

Définissez votre classe personnalisée comme un service, puis injectez-y des dépendances.

Ex :

// services.yml
services:
   my.custom.service.id:
       class: My\Custom\Class
       arguments:
         - @service.name
         - @doctrine.orm.entity_manager

Le constructeur de votre classe personnalisée recevra alors ces services comme arguments.

N'oubliez pas de lire la documentation officielle sur le conteneur de service. Elle traite de tout cela en détail.

8voto

Inoryy Points 4353

Vous étiez sur la bonne voie avec ContainerAware.

$this->get('id') est en fait un raccourci vers $this->container->get('id') . Pour intégrer un conteneur dans votre classe, il suffit d'implémenter ContainerAwareInterface - en insérant cet extrait dans votre classe :

public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
    $this->container = $container;
}

0voto

Dmitry Points 43

Si vous ne connaissez pas la liste complète des dépendances dont vous avez besoin au moment où le service est créé, vous pouvez passer le conteneur comme argument http://symfony.com/doc/current/book/service_container.html#using-the-expression-language

services:  
    service_name:  
        class: AppBundle\Class  
        arguments: ['@=container']

-2voto

GlupiJas Points 196

Accès au conteneur de service dans une classe personnalisée (et non dans une classe définie par le service)

Ce n'est pas la meilleure pratique, mais cela fonctionne. Si votre classe personnalisée n'est pas définie comme un service, vous pouvez accéder au conteneur de service en utilisant la variable globale $kernel :

class Helper {

    private $container;

    /**
     * Constructor assigns service container to private container. 
     */
    public function __construct() {

        global $kernel;
        $this->container = $kernel->getContainer();

    }

    function doSOmething() {
        $someService = $this->container->get('service.name');
        // do something with someService ...
    }

}

-3voto

Jiew Meng Points 10155

OK, je suppose que la réponse de @Arms est une solution possible, j'ai trouvé en regardant la source à Controller Je pourrais étendre ContainerAware

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X