Institut Supérieur des Etudes Technologiques de Jendouba
Département Technologies de l’Informatique
2ème
année Licence Appliquée
Amir Souissi
Atelier Framework Web Côté Serveur
TP N° 3
Objectifs
• Comprendre la correspondance entre URL et Controller à travers le Routing,
• Configurer les Routes en YAML et par les annotations,
• Créer une Route avec des paramètres, leurs contraintes et leurs valeurs par défaut.
Le Routing est un élément dans Symfony qui fait la correspondance entre une URL et un Controller.
Ainsi, pour utiliser un Controller, on a besoin de lui assigner une Route.
1. Création d’une route en format YAML
Une Route fait la correspondance entre une URL et le contrôleur à appeler. Le fichier
app/config/routing.yml est un fichier de mapping des routes (un fichier de correspondance).
Dans ce fichier, la configuration de base d’une Route se présente de la manière suivante :
Nom_Route :
path : …………………
defaults : {_controller : …………………… }
la valeur de _controller correspond au Contrôleur selon la convention suivante :
_controller : BackBundle:Blog:accueil
Avec BackBundle est le nom du Bundle dans lequel se trouve la controller
Blog correspond au nom du controleur BlogController ( suffixé par le mot Contoller)
accueil correspond au nom de l’action acceuilAction (suffixé du mot Action)
ACTIVITE 1 :
1. Ajouter la route suivante dans le fichier de configuration des Routes :
back_accueil:
path: '/blog/article'
defaults: { _controller: BackBundle:Blog:accueil }
2. Ajouter le code suivant dans son emplacement approprié :
<?php
// src/BackBundle/Controller/BlogController.php
namespace BackBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationResponse;
class BlogController extends Controller
{ public function accueilAction ()
{
return new Response(
'<html><body> page Accueil du Blog </body></html>'
);
}
}
3. Quelle est l’URL absolue qui fait apparaitre la page d’accueil du blog.
…………………………………………………………………………………………………….
4. Créer une autre Route qui permet de faire la correspondance de l’URL suivante
'/blog/nouveau' avec une action ajouterAction du BlogController. La page affiché permet
d’ajouter un article au blog.
2. Création d’une route en format annotations
Depuis Symfony 3 on préconise l’utilisation des annotations pour définir des Routes. Les annotations
sont un moyen de configuration qui se place dans les commentaires des fichiers PHP.
Avec les annotations, on peut définir les Routes directement au-dessus des méthodes (des actions) des
Contrôleurs. (Tout est dans le même endroit).
<?php
namespace AppBundleController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
// replace this example code with whatever you need
return $this->render('default/index.html.twig' , [base_dir' => realpath($this-
>getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
]);
}
}
Dans le fichier routing.yml
app:
resource: '@AppBundle/Controller/'
type: annotation
La Route qu’il faut spécifier dans l’annotation doit prendre la forme suivante :
@Route("path (url)", name="nom de la route")
ACTIVITE 2 :
1. Créer un nouveau Controller dans AppBundle nommé : MyController dans lequel vous allez
copier le code du DefaulController.php
2. MyController doit contenir une action MyAction qui permet d’afficher une page HTML située
dans le dossier des Vues de Symfony (/app/Resources/Views) et nommée MyPage.html
3. Définir une Route qui permet d’afficher cette page lorsque l’on se place à l’URL suivante :
localhost/TestSymfony1/web/app_dev.php/Essai/Affichage
ACTIVITE 3 :
1. Dans un nouveau Bundle (BackBundle par exemple), créer une action d’affichage du texte
« Page du BackBundle » câblée sur la Route « /» dans le contrôleur par défaut de ce bundle.
2. Dans le Bundle par défaut (AppBundle de Symfony), vérifier que l’affichage de la page de
démarrage de Symfony est cablée sur la Route « / » aussi.
3. Ainsi, nous avons deux routes identiques dans deux bundles différents sans conflit. Au
chargement de l’URL racine « / » (localhost/TestSymfony1/web/app_dev.php), qu’elle est la
route la plus prioritaire ?
………………………………………………………………………………………………..
4. Modifiez cette priorité en modifiant l’ordre des imports dans /app/config/routing.yml puis
vérifiez la différence à l’affichage.
3. Création d’une route avec des paramètres et des contraintes
On peut ajouter un paramètre dans le path d’une route.
/**
*@Route(path="/{id}")
*/
public function xxxxAction($id)
{ …………………………………………… }
Grâce au paramètre {id}, toutes les url de type /* seront gérées par cette route.
Exemples : web/app_dev/blog/article/5
web/app_dev/blog/article/654
web/app_dev/blog/article/abcd ({id} peut ne pas être un nombre)
ACTIVITE 4 :
1. Compléter le code suivant pour afficher la valeur du paramètre depuis la méthode du Controller.
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
. . .
/**
* @Route("/blog/article/{id}")
*/
public function voirAction ($id)
{
return new Response(
"affichage de l'article qui a un id = ".$id);
}
2. Tester avec plusieurs URL en modifiant la valeur du paramètre ?
On peut ajouter une contrainte sur les paramètres de l’URL en ajoutant les sections requirements et
defaults dans la définition de la Route.
La section requirements permet d’ajouter une contrainte exprimée en expression régulière.
Exemple : d exige que le paramètre soit un seul chiffre.
d+ exige que le paramètre soit un ou plusieurs chiffres.
d{4} exige que le paramètre soit exactement 4 chiffres à la suite.
A | B exige que le paramètre soit A ou B.
Les paramètres sont par défaut obligatoires. La section defaults permet de les rendre
facultatifs.
Lorsqu’on ne renseigne pas la valeur d’un paramètre, c’est sa valeur par défaut qui sera
interceptée. Il devient ainsi facultatif.
ACTIVITE 5 :
/**
*@Route(path="/blog/article/{id}",
requirements={"id"="d+"})
*/
1. Utiliser la Route ci-dessus pour la câbler sur l’action voirAction ($id) de BlogController.
2. Modifier cette Route pour que le paramètre de l’URL soit un seul chiffre.
3. Modifier cette Route pour que le paramètre soit facultatif.
ACTIVITE 6:
Soit le code de la méthode voirSlugAction ($slug, $annee, $format) de BlogController.
public function voirSlugAction ($slug, $annee, $format)
{
return new Response ( "Affichage de l'article correspondant au slug
".$slug."créé à l'année ".$annee."et au format ".$format
);
}
1. Déterminer la Route à configurer pour intercepter les URL de la forme :
/blog/2018/mon-weekend.html ou /blog/2017/symphony.xml
Il faut que l’année {annee} soit sur 4 chiffres exactement.
Le format de la page {format} doit être seulement en html ou en xml.
2. Modifier cette Route de manière à ce que la valeur par défaut du paramètre {format} soit html.
3. Compléter ainsi la configuration suivante de la Route :
/**
*@Route(path="/blog/………………………………………………………………………………………………………… ,
requirements={…………………………………………………………, ……………………………………………………………},
defaults= {………………………………………………………}
)
*/

Atelier symfony n 3

  • 1.
    Institut Supérieur desEtudes Technologiques de Jendouba Département Technologies de l’Informatique 2ème année Licence Appliquée Amir Souissi Atelier Framework Web Côté Serveur TP N° 3 Objectifs • Comprendre la correspondance entre URL et Controller à travers le Routing, • Configurer les Routes en YAML et par les annotations, • Créer une Route avec des paramètres, leurs contraintes et leurs valeurs par défaut. Le Routing est un élément dans Symfony qui fait la correspondance entre une URL et un Controller. Ainsi, pour utiliser un Controller, on a besoin de lui assigner une Route. 1. Création d’une route en format YAML Une Route fait la correspondance entre une URL et le contrôleur à appeler. Le fichier app/config/routing.yml est un fichier de mapping des routes (un fichier de correspondance). Dans ce fichier, la configuration de base d’une Route se présente de la manière suivante : Nom_Route : path : ………………… defaults : {_controller : …………………… } la valeur de _controller correspond au Contrôleur selon la convention suivante : _controller : BackBundle:Blog:accueil Avec BackBundle est le nom du Bundle dans lequel se trouve la controller Blog correspond au nom du controleur BlogController ( suffixé par le mot Contoller) accueil correspond au nom de l’action acceuilAction (suffixé du mot Action) ACTIVITE 1 : 1. Ajouter la route suivante dans le fichier de configuration des Routes : back_accueil: path: '/blog/article' defaults: { _controller: BackBundle:Blog:accueil } 2. Ajouter le code suivant dans son emplacement approprié : <?php // src/BackBundle/Controller/BlogController.php namespace BackBundleController; use SymfonyBundleFrameworkBundleControllerController; use SymfonyComponentHttpFoundationResponse; class BlogController extends Controller { public function accueilAction () { return new Response( '<html><body> page Accueil du Blog </body></html>' ); } }
  • 2.
    3. Quelle estl’URL absolue qui fait apparaitre la page d’accueil du blog. ……………………………………………………………………………………………………. 4. Créer une autre Route qui permet de faire la correspondance de l’URL suivante '/blog/nouveau' avec une action ajouterAction du BlogController. La page affiché permet d’ajouter un article au blog. 2. Création d’une route en format annotations Depuis Symfony 3 on préconise l’utilisation des annotations pour définir des Routes. Les annotations sont un moyen de configuration qui se place dans les commentaires des fichiers PHP. Avec les annotations, on peut définir les Routes directement au-dessus des méthodes (des actions) des Contrôleurs. (Tout est dans le même endroit). <?php namespace AppBundleController; use SensioBundleFrameworkExtraBundleConfigurationRoute; use SymfonyBundleFrameworkBundleControllerController; use SymfonyComponentHttpFoundationRequest; class DefaultController extends Controller { /** * @Route("/", name="homepage") */ public function indexAction(Request $request) { // replace this example code with whatever you need return $this->render('default/index.html.twig' , [base_dir' => realpath($this- >getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR, ]); } } Dans le fichier routing.yml app: resource: '@AppBundle/Controller/' type: annotation La Route qu’il faut spécifier dans l’annotation doit prendre la forme suivante : @Route("path (url)", name="nom de la route") ACTIVITE 2 : 1. Créer un nouveau Controller dans AppBundle nommé : MyController dans lequel vous allez copier le code du DefaulController.php
  • 3.
    2. MyController doitcontenir une action MyAction qui permet d’afficher une page HTML située dans le dossier des Vues de Symfony (/app/Resources/Views) et nommée MyPage.html 3. Définir une Route qui permet d’afficher cette page lorsque l’on se place à l’URL suivante : localhost/TestSymfony1/web/app_dev.php/Essai/Affichage ACTIVITE 3 : 1. Dans un nouveau Bundle (BackBundle par exemple), créer une action d’affichage du texte « Page du BackBundle » câblée sur la Route « /» dans le contrôleur par défaut de ce bundle. 2. Dans le Bundle par défaut (AppBundle de Symfony), vérifier que l’affichage de la page de démarrage de Symfony est cablée sur la Route « / » aussi. 3. Ainsi, nous avons deux routes identiques dans deux bundles différents sans conflit. Au chargement de l’URL racine « / » (localhost/TestSymfony1/web/app_dev.php), qu’elle est la route la plus prioritaire ? ……………………………………………………………………………………………….. 4. Modifiez cette priorité en modifiant l’ordre des imports dans /app/config/routing.yml puis vérifiez la différence à l’affichage. 3. Création d’une route avec des paramètres et des contraintes On peut ajouter un paramètre dans le path d’une route. /** *@Route(path="/{id}") */ public function xxxxAction($id) { …………………………………………… } Grâce au paramètre {id}, toutes les url de type /* seront gérées par cette route. Exemples : web/app_dev/blog/article/5 web/app_dev/blog/article/654 web/app_dev/blog/article/abcd ({id} peut ne pas être un nombre) ACTIVITE 4 : 1. Compléter le code suivant pour afficher la valeur du paramètre depuis la méthode du Controller. use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAnnotationRoute; . . . /** * @Route("/blog/article/{id}") */ public function voirAction ($id) { return new Response( "affichage de l'article qui a un id = ".$id); } 2. Tester avec plusieurs URL en modifiant la valeur du paramètre ?
  • 4.
    On peut ajouterune contrainte sur les paramètres de l’URL en ajoutant les sections requirements et defaults dans la définition de la Route. La section requirements permet d’ajouter une contrainte exprimée en expression régulière. Exemple : d exige que le paramètre soit un seul chiffre. d+ exige que le paramètre soit un ou plusieurs chiffres. d{4} exige que le paramètre soit exactement 4 chiffres à la suite. A | B exige que le paramètre soit A ou B. Les paramètres sont par défaut obligatoires. La section defaults permet de les rendre facultatifs. Lorsqu’on ne renseigne pas la valeur d’un paramètre, c’est sa valeur par défaut qui sera interceptée. Il devient ainsi facultatif. ACTIVITE 5 : /** *@Route(path="/blog/article/{id}", requirements={"id"="d+"}) */ 1. Utiliser la Route ci-dessus pour la câbler sur l’action voirAction ($id) de BlogController. 2. Modifier cette Route pour que le paramètre de l’URL soit un seul chiffre. 3. Modifier cette Route pour que le paramètre soit facultatif. ACTIVITE 6: Soit le code de la méthode voirSlugAction ($slug, $annee, $format) de BlogController. public function voirSlugAction ($slug, $annee, $format) { return new Response ( "Affichage de l'article correspondant au slug ".$slug."créé à l'année ".$annee."et au format ".$format ); } 1. Déterminer la Route à configurer pour intercepter les URL de la forme : /blog/2018/mon-weekend.html ou /blog/2017/symphony.xml Il faut que l’année {annee} soit sur 4 chiffres exactement. Le format de la page {format} doit être seulement en html ou en xml. 2. Modifier cette Route de manière à ce que la valeur par défaut du paramètre {format} soit html. 3. Compléter ainsi la configuration suivante de la Route : /** *@Route(path="/blog/………………………………………………………………………………………………………… , requirements={…………………………………………………………, ……………………………………………………………}, defaults= {………………………………………………………} ) */