Qu'est-ce qu'un service ?
Je vous en ai déjà brièvement parlé : un service est un script qui remplit un rôle précis et que l'on peut utiliser depuis notre contrôleur.
Imaginez par exemple un service qui a pour but d'envoyer des e-mails. Depuis notre contrôleur, on appelle ce service, on lui donne les informations nécessaires (contenu de l'e-mail, destinataire, etc.), puis on lui dit d'envoyer l'e-mail. Ainsi, toute la logique « création et envoi d'e-mail » se trouve dans ce service et non dans notre contrôleur. Cela nous permet de réutiliser ce service très facilement ! En effet, si vous codez en dur l'envoi d'e-mail dans un contrôleur A et que, plus tard, vous avez envie d'envoyer un autre e-mail depuis un contrôleur B, comment réutiliser ce que vous aviez déjà fait ? C'est impossible et c'est exactement pour cela que les services existent.
Accéder aux services
Pour accéder aux services depuis votre contrôleur, il faut utiliser la méthode
<?php $this->get() du contrôleur. Par exemple, le service pour envoyer des e-mails se nomme justement « mailer ». Pour employer ce service, nous faisons donc :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | <?php
// src/Sdz/BlogBundle/Controller/BlogController.php
namespace Sdz\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BlogController extends Controller
{
public function voirAction($id)
{
// Récupération du service.
$mailer = $this->get('mailer');
// Création de l'e-mail : le service mailer utilise SwiftMailer, donc nous créons une instance de Swift_Message.
$message = \Swift_Message::newInstance()
->setSubject('Hello zéro !')
->setFrom('tutorial@symfony2.com')
->setTo('votre@email.com')
->setBody('Coucou, voici un email que vous venez de recevoir !');
// Retour au service mailer, nous utilisons sa méthode « send() » pour envoyer notre $message.
$mailer->send($message);
// N'oublions pas de retourner une réponse, par exemple, une page qui afficherait « L'email a bien été envoyé ».
return new Response('Email bien envoyé');
}
}
|
Retenez donc la méthode <?php $this->get('nom_du_service') !
Brève liste des services
Évidemment, vous savez récupérer un service, mais encore faut-il connaître leur nom ! Et savoir les utiliser ! Ci-dessous est dressée une courte liste de quelques services utiles.
Templating
Templating est un service qui vous permet de gérer vos
templates (vos vues, vous l'aurez compris). En fait, vous avez déjà utilisé ce service… via le raccourci
<?php $this->render ! Voici la version longue d'un
<?php $this->render('MonTemplate') :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?php
// ...
public function voirAction($id)
{
// Récupération du service.
$templating = $this->get('templating');
// On récupère le contenu de notre template.
$contenu = $templating->render('SdzBlogBundle:Blog:voir.html.twig');
// On crée une réponse avec ce contenu et on la retourne.
return new Response($contenu);
}
|
Le service
Templating est utile, par exemple, pour notre e-mail de tout à l'heure. Nous avons écrit le contenu de l'e-mail en dur, ce qui n'est pas bien, évidemment. Nous devrions avoir un
template pour cela. Et pour en récupérer le contenu, nous utilisons
<?php $templating->render().
Une autre fonction de ce service qui peut servir, c'est
<?php $templating->exists('MonTemplate') qui permet de vérifier si « MonTemplate » existe ou non.
Request
Eh oui, encore elle. C'est également un service ! C'est pour cela qu'on l'a récupéré de cette façon :
<?php $this->get('request').
Session
Les outils de session sont également intégrés dans un service. Vous pouvez le récupérer via
<?php $this->get('session');
Pour définir et récupérer des variables en session, il faut utiliser les méthodes « get » et « set », tout simplement :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | <?php
// src/Sdz/BlogBundle/Controller/BlogController.php
namespace Sdz\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BlogController extends Controller
{
public function voirAction($id)
{
// Récupération du service
$session = $this->get('session');
// On récupère le contenu de la variable user_id
$user_id = $session->get('user_id');
// On définit une nouvelle valeur pour cette variable user_id
$session->set('user_id', 91);
// On n'oublie pas de renvoyer une réponse
return new Response('Désolé je suis une page de test, je n\'ai rien à dire');
}
}
|
Un autre outil très pratique du service de session est ce que l'on appelle les "flash". Un terme précis pour désigner en réalité une variable de session qui ne dure que pendant 1 page. C'est une astuce utilisée pour les formulaires par exemple : la page qui traite le formulaire définit un message flash ("Article bien enregistré" par exemple) puis redirige vers la page de visualisation de l'article nouvellement créé. Sur cette page, le message flash s'affiche et disparait. Mais si l'on change de page ou qu'on l'actualise, le message flash ne sera plus présent. Voici un exemple d'utilisation :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | <?php
// src/Sdz/BlogBundle/Controller/BlogController.php
namespace Sdz\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BlogController extends Controller
{
public function voirAction($id)
{
return $this->render('SdzBlogBundle:Blog:voir.html.twig', array(
'id' => $id
));
}
public function ajouterAction()
{
// Bien sûr, cette méthode devra réellement ajouter l'article,
// Mais faisons comme si c'était le cas.
$this->get('session')->setFlash('info', 'Article bien enregistré');
// Puis on redirige vers la page de visualisation de cet article.
return $this->redirect( $this->generateUrl('sdzblog_voir', array('id' => 5)) );
}
}
|
Vous pouvez voir que la méthode ajouterAction définit un message flash (appelé ici "info"). La lecture de ce message se fait dans la vue de l'action voirAction, que j'ai modifié comme ceci :
Code : HTML & Django 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | {# src/Sdz/BlogBundle/Resources/views/Blog/voir.html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>Bienvenue sur ma première page avec le Site du Zéro !</title>
</head>
<body>
<h1>Lecture d'un article</h1>
<p>
{# On affiche tous les messages flash #}
{% for key, flash in app.session.getFlashes() %}
{{ flash }}
{% endfor %}
</p>
<p>
Ici nous pourrons lire l'article ayant comme id : {{ id }}<br />
Mais pour l'instant, nous ne savons pas encore le faire, cela viendra !
</p>
</body>
</html>
|
Essayez d'aller sur
http://localhost/Symfony/web/app_dev.php/blog/ajouter vous allez être redirigé et voir le message flash. Faites
F5 et hop, il a disparu !
Les autres… et les nôtres !
Il existe évidemment bien d'autres services : nous les rencontrerons au fur et à mesure dans ce cours.
Mais il existera surtout nos propres services ! En effet, la plupart des outils que nous allons créer (un formulaire, un gestionnaire d'utilisateurs personnalisé, etc.) devront être utilisés plusieurs fois. Quoi de mieux, dans ce cas, que de les définir en tant que service ? Nous verrons cela dans la partie 2, mais sachez qu'après une petite étape de mise en place (configuration, quelques conventions), les services sont vraiment très pratiques !