mercredi 28 mai 2014

Service avec accès au container sans code

Les services de Symfony2 peuvent accéder au Container. La méthode la plus classique pour déclarer un service ayant accès à ce container est :
# Resources/config/services.yml services: foo: class: Foo\Bar\Service arguments: [ @service_container ]
Et dans votre classe Foo\Bar\Service, vous devez gérer une propriété protected (souvent $container), qui sera remplie dans le __construct :
<?php namespace Foo\Bar; use Symfony\Component\DependencyInjection\ContainerInterface; class Service { protected $container; public function __construct(ContainerInterface $container) { $this->container = $container; } }

Mais vous pouvez également vous simplifier le code du service, en étendant la classe ContainerAware et en utilisant les appels de méthode à l'instaciation de votre service.
ContainerAware ajoute une méthode setContainer et une propriété protected $container.
# Resources/config/services.yml services: foo: class: Foo\BarBundle\Service\MyService calls: - [ setContainer, [ @service_container ] ]
# Resources/config/services.xml <services> <service id="foo" class="Foo\BarBundle\Service\MyService"> <call method="setContainer"> <argument type="service" id="service_container" /> </call> </service> </services>
<?php namespace Foo\BarBundle\Service; use Symfony\Component\DependencyInjection\ContainerAware; class Service extends ContainerAware { }

2 commentaires:

  1. Comme on a vu, l'inconvénient de cette méthode est que ta classe ne peut plus rien étendre d'autre.
    Donc très pratique, mais faire attention à l'héritage unique :-)

    RépondreSupprimer
  2. Tout à fait, c'est réservé aux cas où il n'y a pas d'héritage.
    Il existe peut-être un trait, j'avoue que je n'ai pas regardé.

    RépondreSupprimer