Dans un billet précédent ( http://steevan-barboyon.blogspot.fr/2014/05/service-avec-acces-au-container-sans.html ), je vous parlais de la class abstraite Symfony\Component\DependencyInjection\ContainerAware qui permet d'ajouter une propriété $container et une méthode setContainer.
Seulement voilà, PHP ne gère pas l'héritage multiple, donc si votre service étend déjà d'une classe vous ne pouvez pas utiliser ContainerAware. Un exemple tout simple : une extension Twig.
Symfony2 ne fournissant pas encore de trait avec la même fonctionnalité que ContainerAware, vous pouvez installer le bundle steevanb/utilsbundle, qui vous fournira ce trait.
Seulement voilà, PHP ne gère pas l'héritage multiple, donc si votre service étend déjà d'une classe vous ne pouvez pas utiliser ContainerAware. Un exemple tout simple : une extension Twig.
Symfony2 ne fournissant pas encore de trait avec la même fonctionnalité que ContainerAware, vous pouvez installer le bundle steevanb/utilsbundle, qui vous fournira ce trait.
# composer.json
{
"require": {
"steevanb/utilsbundle": "1.*"
}
}
Définition du service, exactement la même qu'avec le ContainerAware fournit par Symfony 2 :
# Resources/config/services.yml
services:
myservice:
class: Foo\BarBundle\Service\MyService
calls:
- [ setContainer, [ @service_container ] ]
Le code du service, qui ne fait que utiliser le trait steevanb\UtilsBundle\Model\ContainerAware :
# Service/MyService.php
<?php
namespace Foo\BarBundle\Service
use steevanb\UtilsBundle\Model\ContainerAware;
class MyService
{
use ContainerAware;
}