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 commandephp 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 !