PRÉSENTATION DU COURS

Créer ses propres services

Comprendre comment créer et utiliser ses propres services

Créer son premier service

Comme nous l'avons vu, les service sont un élément important de Symfony.

La bonne nouvelle c'est que vous pouvez aussi créer vous même vos propres services, afin de pouvoir partager et réutiliser du codes sans le dupliquer !

Avant de commencer à coder, créons notre dossier Service dans le dossier /src du projet.

Ensuite, créons notre premier service RandomHelper.php dans le dossier /src/Service.

Le bug de ce service va être d'exposer différentes méthodes permettant de récupérer différentes valeurs de manière aléatoires.

Comme Symfony c'est de la Programmation Orientée Objet, nous allons créer une classe.

Commencez par cette structure :

<?php
namespace App\Service;

class RandomHelper
{
    
}

! Le nom du dossier et service est totalement arbitraire, vous pouvez mettre ce que vous voulez ça ne changera rien.

Au sein de cette classe, on va créer une méthode, nous permettant d'avoir une chaine de caractère aléatoire, avec la longeur définie dans un argument :

<?php

namespace App\Service;

class RandomHelper
{
    const PERMITTER_CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    public function randomString(int $length = 10) : string
    {
        return $this->generateRandomString($length);
    }

    private function generateRandomString(int $length = 10) : string {
        $input_length = strlen(self::PERMITTER_CHARS);
        $random_string = '';
        for($i = 0; $i < $length; $i++) {
            $random_character = self::PERMITTER_CHARS[mt_rand(0, $input_length - 1)];
            $random_string .= $random_character;
        }

        return $random_string;
    }

}

Très bien, nous avons défini notre méthode permettant de définir des chaines de caractère aléatoire de la longeur que l'on veut ! (On a utiliser une petite constantes pour les caractères autorisés, c'est plus clean que directement dans la fonction)

! Comme vous le voyez, au final ce sont des classes normales, vous pouvez faire ce que vous voulez tant que ça reste du php !

Si tout vas bien, si vous tapez la commande php bin/console debug:autowiring --all vous devriez voir dans la liste votre service RandomHelper

! l'argument --all est important, car pour l'instant notre service n'a pas d'alias et donc il ne sera pas affiché à la commande php bin/console debug:autowiring. Cet argument supplémentaire nous permet de voir tous les service disponibles, retenez sinon vous aurez des surprise !

Utiliser son service

Pour utiliser votre service, vous pouvez l'utiliser exactement de la même manière que les autres !

Du coup ça se passe de cette manière là :

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Psr\Log\LoggerInterface; 
use Twig\Environment;
use App\Service\RandomHelper; // Ne pas oublier de use le service


class ExempleController extends AbstractController
{
    /**
    * @Route("/", name="homepage") // ajout d'une propriété name
    **/
    public function index(LoggerInterface $logger, Environment $twigEnvironment, RandomHelper $random) {
        $logger->info('Webédiable');
        $this-> render('index.html.twig', [
            'title' => 'hello world',
            'randomString' => $random->randomString(20)
        ]);
    }

    // Il y a le reste, mais la flemme de tout écrire
}

Et maintenant vous pouvez afficher cette chaine random dans votre template, la debug, faire ce que vous voulez.

Comme vous avez pu le voir, c'est exactement la même chose que les autres service, pas besoin d'apprendre deux méthode différentes !

Ajouter des dépendence à son service

Bon pour l'instant notre service ne fait pas grand chose donc on a pas eu besoin de dépendences, mais si vous en avez besoin vous pouvez très bien les injecter !

C'est un peu différent des controllers, ici vous ne pouvez pas les injecter directement dans votre méthode, mais vous pouvez les récupére gràce au __construct de la classe.

Ce construct de la classe bénéficie lui aussi de l'autowire de Symfony, donc c'est encore une fois la même méthode.

Voilà un petit exemple si vous voulez récupérer le service de logging :

<?php

namespace App\Service;

use Psr\Log\LoggerInterface;

class RandomHelper
{
    const PERMITTER_CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    public $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function randomString(int $length = 10) : string
    {
        $this->logger->info('User has asked an random string!');
        return $this->generateRandomString($length);
    }

    private function generateRandomString(int $length = 10) : string {
        $input_length = strlen(self::PERMITTER_CHARS);
        $random_string = '';
        for($i = 0; $i < $length; $i++) {
            $random_character = self::PERMITTER_CHARS[mt_rand(0, $input_length - 1)];
            $random_string .= $random_character;
        }

        return $random_string;
    }

}

Avec ce petit ajout, vous devirez voir écrit dans votre fichier de log User has asked an random string! lorsque vous utilisez le service !

! Vous pouvez très bien aussi injecter vos propres services dans vos services, ça fonctionne de la même manière !

Conclusion

Vous savez désormais comment utiliser, créer, et même injecter des services dans d'autres.

Il y a d'avantage à explorer sur les services, on en verra un peu plus dans les prochains chapitre, mais n'hésitez pas à vous renseigner de votre côté, ça pourrait être utile !

Envie de discuter du contenu ?

logo twitter @GarnierKristen