Cours Symfony Controleur
Cours Symfony Controleur
Cours Symfony Controleur
Achref El Mouelhi
Symfony
Rôle
Un élément indispensable de l’architecture MVC
I c
Il reçoit une requête et il interagit avec les différents composants
d’une application Symfony :
ELH
U
les vues
L MO
les services
re f E
c
les modèles h
A de formulaires
cconstructeurs
les
...
Symfony
Techniquement
I
c
Un contrôleur est une classe PHP qui hérite
EL H
d’AbstractControl U
O est associée à une route
Chaque méthode (action) deLcontr Môleur
h r e fE
A c
Dans un contrôleur, il n’y a que du code PHP (pas de HTML ni
cJS)
CSS ni
Symfony
Modèle Vue
Demande Construction
I c
de données page HTML
ELH
Adresse 1
U Contrôleur 1
Interception
MO Exécution Page HTML
f EL
de requête
c h re
Adresse 2
c
A Contrôleur frontal Kernel Symfony2 Contrôleur 2
. Recherche .
. contrôleur .
. adèquat .
Symfony
Modèle Vue
I
c
ELH
U
request
L 1 MO response
f EContrôleur
c hre
c A
Le conteneur de service
Symfony
Explication
request et response sont deux objets I
c
H
ElaLrequête utilisateur
O U
request contient les données concernant
response correspond à E L M
r e f la réponse préparée puis retourner par
le contrôleur
A ch
c les modèles... vont nous permettre de réaliser tout
Les services,
le travail nécessaire pour préparer le contenu de la réponse.
Symfony
Pour générer un contrôleur nommé HomeController
I c
ELH
U
L MO
f E
c hre
c A
Symfony
Pour générer un contrôleur nommé HomeController
Le résultat est
I c
created: src/Controller/HomeController.php
ELH
U
MO
created: templates/home/index.html.twig
f E L
c hre
c A
Symfony
Pour générer un contrôleur nommé HomeController
Le résultat est
I c
created: src/Controller/HomeController.php
ELH
U
MO
created: templates/home/index.html.twig
f E L
c hre
c A
Constats
HomeController.php : un contrôleur généré dans src/controller
home : un répertoire créé pour le contrôleur HomeController qui contiendra toutes ses
vues. Par défaut, Symfony cherchera les vues dans ce répertoire.
Symfony
Symfony
Symfony
Symfony
Symfony
Code généré pour HomeController
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\
AbstractController;
use Symfony\Component\Routing\Annotation\Route;
I c
EL H
U
MO
class HomeController extends AbstractController
{
/**
fE L
h r
* @Route("/home",
c e
name="home_route")
*/
public c
A
function index()
{
return $this->render(’home/index.html.twig’, [
’controller_name’ => ’HomeController’,
]);
}
}
Symfony
Explication
c
La méthode index retourne la vue home/index.html.twig et lui envoie un
I
HomeController
EL H
paramètre controller name avec comme valeur le nom du contrôleur
U
Oqui définit le chemin qui permettra
M
La méthode index est annotée par @Route
L
d’exécuter cette méthode
h r e fE
l’appeler c A
L’annotation @Routec permet d’associer un nom à la route pour qu’on puisse
Symfony
Explication
c
La méthode index retourne la vue home/index.html.twig et lui envoie un
I
HomeController
EL H
paramètre controller name avec comme valeur le nom du contrôleur
U
Oqui définit le chemin qui permettra
M
La méthode index est annotée par @Route
L
d’exécuter cette méthode
h r e fE
l’appeler c A
L’annotation @Routec permet d’associer un nom à la route pour qu’on puisse
Symfony
c
supprimer l’annotation de la méthode index du contrôleur
I
HomeController
EL H
vérifier que la route /home n’estM
plus
U
Oaccessible depuis le
navigateur
fE L
commenter A h r e
c concernant l’annotation des contrôleurs dans
la partie
c
annotations.yaml
définir les routes dans routes.yaml
Symfony
Nouveau contenu de HomeController
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\
AbstractController;
I c
EL H
use Symfony\Component\Routing\Annotation\Route;
U
MO
class HomeController extends AbstractController
L
{
h r e fE
A c
public function index()
{ c
$this->render(’home/index.html.twig’, [
return
’controller_name’ => ’HomeController’,
]);
}
}
Symfony
Symfony
f E L
chre
c A
Symfony
f E L
A c hre
c
Pour tester,
allez sur localhost:8000/home
Symfony
Symfony
Définissons les routes dans routes.xml
I
c
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
EL H
https://symfony.com/schema/routing/routing-1.0.xsd">
c h
c A
</routes>
Symfony
Définissons les routes dans routes.xml
I
c
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
EL H
https://symfony.com/schema/routing/routing-1.0.xsd">
c h
c A
</routes>
Symfony
Symfony
Définissons les routes dans routes.php
<?php
use App\Controller\HomeController;
use Symfony\Component\Routing\Loader\Configurator\
RoutingConfigurator;
I
c
E L{ H
U
return function (RoutingConfigurator $routes)
$routes->add(’home’, ’/home’) O
L M
ref E
->controller([HomeController::class, ’index’]);
};
c h
?>
c A
Symfony
Définissons les routes dans routes.php
<?php
use App\Controller\HomeController;
use Symfony\Component\Routing\Loader\Configurator\
RoutingConfigurator;
I
c
E L{ H
U
return function (RoutingConfigurator $routes)
$routes->add(’home’, ’/home’) O
L M
ref E
->controller([HomeController::class, ’index’]);
};
c h
?>
c A
Symfony
Pour la suite
Nous n’utiliserons que le routage par annotations.
Pensez à supprimer tous les fichiers routes.*
I c
ELH
U
L MO
f E
chre
c A
Symfony
Pour la suite
Nous n’utiliserons que le routage par annotations.
Pensez à supprimer tous les fichiers routes.*
I c
E LH
U
MO dans
Pensez à réactiver le routage par annotation
L
annotations.yaml
h r e fE
controllers:
A c
c
resource: ../../src/Controller/
type: annotation
kernel:
resource: ../../src/Kernel.php
type: annotation
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\
AbstractController;
use Symfony\Component\Routing\Annotation\Route;
I c
class HomeController extends AbstractController
ELH
{
U
/**
L MO
* @Route("/")
f E
hre
* @Route("/home", name="home_route")
*/
c
c A
public function index()
{
return $this->render(’home/index.html.twig’, [
’controller_name’ => ’HomeController’,
]);
}
}
Il est aussi possible d’associer une route à un contrôleur, la méthode index sera
exécutée en allant sur la route /controller/home
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
/**
I c
* @Route("/controller")
ELH
*/
U
class HomeController extends AbstractController
{
L MO
f E
hre
/**
* @Route("/home")
c
c A
*/
public function index()
{
return $this->render(’home/index.html.twig’, [
’controller_name’ => ’HomeController’,
]);
}
}
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
c
return $this->render(’home/index.html.twig’, [
}
]); c A
’controller_name’ => $nom,
}
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
c
return $this->render(’home/index.html.twig’, [
}
]); c A
’controller_name’ => $nom,
}
On peut utiliser les expressions régulières pour définir des contraintes sur les paramètres
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
ELH
* @Route("/home/{age}", name="home_route", requirements={"age"="\d
U
MO
{2,3}"})
*/
public function index(int $age)
f E L
hre
{
c
return $this->render(’home/index.html.twig’, [
}
]); c A
’controller_name’ => $age,
}
On peut utiliser les expressions régulières pour définir des contraintes sur les paramètres
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
ELH
* @Route("/home/{age}", name="home_route", requirements={"age"="\d
U
MO
{2,3}"})
*/
public function index(int $age)
f E L
hre
{
c
return $this->render(’home/index.html.twig’, [
}
]); c A
’controller_name’ => $age,
}
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
]);
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
]);
On peut aussi rendre ce paramètre optionnel en lui attribuant une valeur par défaut
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
]);
On peut aussi rendre ce paramètre optionnel en lui attribuant une valeur par défaut
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
]);
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
]);
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
]);
On peut aussi définir des constantes qu’on récupère comme des paramètres de
substitution mais ils ne font pas partis de la route
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
*/
", "prenom": "john"})
L MO
f E
hre
public function index(int $age, string $nom, string $prenom)
{
c
c A
return $this->render(’home/index.html.twig’, [
]);
’controller_name’ => "$age $nom $prenom",
}
}
On peut aussi définir des constantes qu’on récupère comme des paramètres de
substitution mais ils ne font pas partis de la route
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
*/
", "prenom": "john"})
L MO
f E
hre
public function index(int $age, string $nom, string $prenom)
{
c
c A
return $this->render(’home/index.html.twig’, [
]);
’controller_name’ => "$age $nom $prenom",
}
}
Symfony
I
c
récupérer les paramètres de substitution
EL H
récupérer les variables hors routes O(lesU
paramètres libres)
L M
r e f
récupérer la méthode de E
la requ ête HTTP
récupérer leAnom
h
c de la route
c
...
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
Pour les variables hors routes, pas besoin de les déclarer dans la route
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
Pour les variables hors routes, pas besoin de les déclarer dans la route
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
Symfony
Symfony
I
c
Remarque
E L H
U
soit le type de la méthode HTTP.L MOpeutilêtre
Par défaut, chaque action d’un contrôleur exécutée quel que
Exemple
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
Exemple
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
]);
’controller_name’ => $nom,
}
}
L’action index sera exécutée pour les deux méthodes HTTP GET et POST.
Symfony
Symfony
Symfony
Considérons le contenu suivant pour HomeController
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\
AbstractController;
use Symfony\Component\Routing\Annotation\Route;
I c
EL H
U
class HomeController extends AbstractController
{
L MO
/**
h r e fE
* @Route("/home/{nom}",name="home_route")
*/
public c A c index(string $nom)
{
function
return $this->render(’home/index.html.twig’, [
’controller_name’ => $nom,
]);
}
}
Objectif
I c
Dans VehiculeController : générer une route pour le
ELH
contrôleur HomeControlleur U
L MO
E
Ensuite, utiliser cette route pour rediriger vers
f
HomeControlleur
c hre
c A
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
c
$url = $this->generateUrl(’home_route’, array(
c A
’nom’ => ’abruzzi’,
));
return new RedirectResponse($url);
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
c
$url = $this->generateUrl(’home_route’, array(
c A
’nom’ => ’abruzzi’,
));
return new RedirectResponse($url);
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
}
}
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
c
return $this->redirectToRoute(’home_route’, [’nom’ => ’abruzzi’
c A
]);
}
}
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
c
return $this->redirectToRoute(’home_route’, [’nom’ => ’abruzzi’
c A
]);
}
}
Symfony
La méthode redirect permet aussi de rediriger vers une URL externe
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
I c
class VehiculeController extends AbstractController
ELH
{
U
MO
/**
*/
f E L
* @Route("/vehicule", name="vehicule_route")
}
}
return $this->redirect(’http://symfony.com/doc’);
Symfony
La méthode redirect permet aussi de rediriger vers une URL externe
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
I c
class VehiculeController extends AbstractController
ELH
{
U
MO
/**
*/
f E L
* @Route("/vehicule", name="vehicule_route")
}
}
return $this->redirect(’http://symfony.com/doc’);
namespace App\Controller;
c
throw new HttpException(
c A
404,
);
’On ne peut vous afficher la page de cette personne’
}
return $this->render(’home/index.html.twig’, [
’controller_name’ => $nom,
]);
}
}
Symfony
I c
Pour tester
EL H
U
MO
allez sur une URL avec paramètre
localhost:8000/home/wick
E L
flocalhost:8000/home
et une deuxièmeh
c r e
sans
c A
namespace App\Controller;
}
afficher la page de cette personne’);
return $this->render(’home/index.html.twig’, [
’controller_name’ => $nom,
]);
}
}
Symfony
c A
manipuler directement.
Utilisation explicite
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
c
$response = new Response(
c A
"<p>Bonjour $nom</p>",
Response::HTTP_OK,
[’content-type’ => ’text/html’]
);
return $response;
}
}
Utilisation explicite
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
c
$response = new Response(
c A
"<p>Bonjour $nom</p>",
Response::HTTP_OK,
[’content-type’ => ’text/html’]
);
return $response;
}
}
Symfony
Utilisation implicite
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\
AbstractController;
I c
use Symfony\Component\Routing\Annotation\Route;
EL H
O U
class HomeController extends AbstractController
{
L M
/**
h r e fE
* @Route("/home/{nom?}",name="home_route")
*/
public
c Ac
function index(?string $nom)
{
return $this->render(’home/index.html.twig’, [
’controller_name’ => $nom,
]);
}
}