Les services
Lorsqu'on écrit du code, on aime que celui-ci soit bien rangé. On évite de faire de trop gros bouts de code, on préfère les morceler en de petits morceaux, plus faciles à maintenir, à faire évoluer et à débugger. De même, on peut être amené à vouloir réutiliser le même code à plusieurs endroits différents de l'application. Les services permettent de répondre à cette problématique.
Symfony propose déjà des services tout en un, par exemple pour gérer des logs, envoyer des emails, gérer le cache, etc. Mais il est tout à fait possible de créer ses propres services. De plus, un service peut tout à fait faire appel à d'autres services.
Prenons un exemple :
function SayHello(string $prenom, string $lang='EN') : string
{
$hellos = [
'EN' => 'Hello',
'DE' => 'GutenTag',
'FR' => 'Bonjour',
'ES' => 'Hola'
];
return $hellos[$lang] . ' ' . $prenom . '!';
}
Cette fonction prend en entrée un prénom et éventuellement une langue et retourne Bonjour
suivi du prénom dans cette langue.
Transformons la en service. Nous créons un fichier HelloService.php
que nous rangeons dans un dossier services
Dedans, nous écrivons une classe :
<?php
namespace App\Service;
class HelloService
{
public function SayHello(string $prenom, string $lang='EN'): string
{
$hellos = [
'EN' => 'Hello',
'DE' => 'GutenTag',
'FR' => 'Bonjour',
'ES' => 'Hola'
];
return $hellos[$lang] . ' ' . $prenom . '!';
}
}
Si nous souhaitons faire appel à la méthode SayHello
de ce service dans une méthode d'un contrôleur relié à une route, nous pouvons injecter ce service dans les paramètres de la méthode.
use App\Service\HelloService;
use Symfony\Component\HttpFoundation\Response;
#[Route('/hello/{firstname}', name: 'hello')]
public function hello(string $firstname, HelloService $helloService)
{
$helloString = $helloService->SayHello($firstname, 'FR')
$response = new Response(
$helloString,
Response::HTTP_OK,
['content-type' => 'text/html']
);
$response->send()
}
Si nous souhaitons utiliser ce service dans une méthode d'une autre classe, nous pouvons l'injecter grâce au constructeur.
use App\Service\HelloService;
class ServiceB
{
public function __construct(
private HelloService $helloService
)
{}
public function something(): string
{
return $this->helloService->SayHello('John', 'EN');
}