📘

Services

Un service est une classe PHP indĂ©pendante et autonome. On dit souvent “un contrĂŽleur qui ne retourne pas de Twig”, donc il fait des choses mais pas d’affichage.

On crĂ©e un service quand on a deux contrĂŽleurs qui font la mĂȘme chose. Par exemple, pour afficher la mĂ©tĂ©o dans plusieurs Twig, on peut crĂ©er un service qui affiche la mĂ©tĂ©o et qui est appelĂ© dans les contrĂŽleurs.

Les services sont faciles Ă  tester et rĂ©utilisables, ils permettent d’avoir des contrĂŽleurs lisibles et propres et d’avoir du code rĂ©utilisable.

BP : On peut mettre la BLL dans nos services —> si on utilise trois fois un findAll(), ça vaut le coup de faire un service. BP : On peut crĂ©er un service si le contrĂŽleur est trop grand (>20lignes) —>moche, illisible, difficile Ă  tester.

Créer un service

Utiliser un service

Un service est typiquement utilisé depuis un contrÎleur.

⚠
On n’hĂ©rite pas d’un service, on fait une injection de service.

ProblĂšme ?

Un contrîleur injecte un service, qui lui aussi injecte d’autres services.

Dans ce cas, on ne peut pas lui injecter les services comme d’habitude : on n’est plus dans un contrîleur mais dans un service (classe PHP).

Pour injecter des dépendances dans un service, on doit lui créer un constructeur __construct().

use Doctrine\ORM\EntityManagerInterface;

class SomeService
{
	protected $entityManager;
	public function __construct(
		EntityManagerInterface $entityManager
	)
{
	$this->entityManager = $entityManager;
}

â„č
Principe de gĂ©nĂ©ricitĂ© : le conteneur de services de Symfony est omniscient et connait tous les services (singleton), les dĂ©pendances des services, les instances créées une premiĂšre fois


Services internes de Symfony

liste : symfony console debug:container

services qu'on peut recevoir en injection : symfony console debug:autowiring

Ainsi quand on en crée un, il est ajouté à la liste.

Démonstration

Un service qui envoie un mail.

Souvent on les met dans un dossier Service dans src.

(on lance papercut)

namespace App\Service;

class MailService 
{
	private $mailer;

	public function __construct(MailerInterface $mailer)
{
	$this->mailer = $mailer;
}

	public function sendEmail() {
		$email = (new Email())
			->from('brucewayne@eni.fr')
			->to('batman@eni.fr')
			->cc('alfred@eni.fr')
			->replyTo('gordon@eni.fr')
			->subject('Le joker est revenu')
			->text('blablabla')
			->html('<a href="https://fr.wikipedia.org/wiki/Joker_(personnage)">Joker</a>');
			$this->mailer->send($email);
	}
}

On va l’utiliser : dans un contrĂŽleur (ex: serie), dans la mĂ©thode list()

...
public function list(
		...,
		MailService $mailService
): Response
{
	...
	$mailService->sendEmail();
}