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 :
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\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 {
}
Comme on a vu, l'inconvénient de cette méthode est que ta classe ne peut plus rien étendre d'autre.
RépondreSupprimerDonc très pratique, mais faire attention à l'héritage unique :-)
Tout à fait, c'est réservé aux cas où il n'y a pas d'héritage.
RépondreSupprimerIl existe peut-être un trait, j'avoue que je n'ai pas regardé.