Plutôt que d’injecter le container dans un service il est plus pertinent d’injecter seulement les services dont on a besoin.
Déclarer le service
Dans le fichier services.yml du bundle de notre service on a :
parameters: neodsi_validation.class: Neodsi\MetierBundle\Lib\Validation services: neodsi_service_validation: class: "%neodsi_validation.class%" arguments: [@translator, %url%, @neodsi_service_helper]
Le service neodsi_service_validation
est déclaré avec la classe dont le nom est indiqué dans le paramètre neodsi_validation.class
Il prend comme argument :
- le service translator de symfony
- le paramètre url contenu dans le fichier parameters.yml
- le service neodsi_service_helper
Le service neodsi_service_helper est un service qui peut être déclaré dans ce fichier services.yml ou dans un autre bundle.
Utiliser les arguments dans la classe
Il suffit ensuite dans le constructeur du service d’indiquer les arguments
public function __construct($translator, $url, $oHelper)
On peut mettre les noms de variables que l’on veut et éventuellement indiquer le type d’objet avant la variable (par exemple Translator devant $translator).
Services que l’on peut injecter
Parmi les services de symfony utile on peut citer :
- translator : pour utiliser les traductions dans le service
- logger : pour faire du log
- router : pour générer des url (utiliser generate() au lieu de generateUrl() dans ce cas)
- session : pour utiliser les sessions
- request_stack : pour utiliser le service de requêtes (utiliser getCurrentRequest() au lieu de la proprieté request dans ce cas)
- templating : pour utiliser les services de vue (utiliser EngineInterface comme type sans oublier de déclarer use Symfony\Component\Templating\EngineInterface; )