
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
- on crée une classe PHP dans un dossier spécifique de src (par exemple, src/Service)
- on crĂ©e les mĂ©thodes que lâon veut
Utiliser un service
Un service est typiquement utilisé depuis un contrÎleur.
- on appelle un service en injection de dĂ©pendances et on utilise la mĂ©thode Ă travers lâinstance
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().
- on lui ajoute un attribut qui sera lâinstance de la dĂ©pendance injectĂ©e
- on injecte la dépendance dans le constructeur
- on instancie lâattribut
use Doctrine\ORM\EntityManagerInterface;
class SomeService
{
protected $entityManager;
public function __construct(
EntityManagerInterface $entityManager
)
{
$this->entityManager = $entityManager;
}
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.
- New PHP class > MailService.
(on lance papercut)
- on injecte MailerInterface (en constructeur)
- Symfony\Component\Mime
- avec text on met du texte, on peut utiliser du html et mĂȘme un twig
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()
- on injecte notre service
- on utilise la mĂ©thode via lâinstance
...
public function list(
...,
MailService $mailService
): Response
{
...
$mailService->sendEmail();
}