Vous êtes sur la page 1sur 76

Symfony 5 : contrôleur

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en Programmation par contrainte (IA)
Ingénieur en Génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 50


Plan
1 Introduction
2 Génération d’un contrôleur
3 Routage
Routage par annotation
Routage dans un fichier YAML
Routage dans un fichier XML
Routage dans un fichier PHP
4 Multi-routes
5 Paramètres de substitution
6 Objet request
7 Méthode HTTP
8 Génération d’URL et redirection
9 Gestion d’erreurs et page 404
10 Objet response
H & H: Research and Training 2 / 50
Introduction

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
...

pour retourner une réponse

H & H: Research and Training 3 / 50


Introduction

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

H & H: Research and Training 4 / 50


Introduction

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 .

Adresse n Routeur Contrôleur n

H & H: Research and Training 5 / 50


Introduction

Symfony

Modèle Vue

I c
ELH
U
request
L 1 MO response
f EContrôleur

c hre
c A

Le conteneur de service

H & H: Research and Training 6 / 50


Introduction

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.

H & H: Research and Training 7 / 50


Génération d’un contrôleur

Symfony
Pour générer un contrôleur nommé HomeController

php bin/console make:controller HomeController

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 8 / 50


Génération d’un contrôleur

Symfony
Pour générer un contrôleur nommé HomeController

php bin/console make:controller 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

H & H: Research and Training 8 / 50


Génération d’un contrôleur

Symfony
Pour générer un contrôleur nommé HomeController

php bin/console make:controller 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

index.html.twig : une vue générée dans templates/home

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.

H & H: Research and Training 8 / 50


Génération d’un contrôleur

Symfony

Pour générer un contrôleur sans template


php bin/console make:controller HomeController --no-
I c

template
ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 9 / 50


Génération d’un contrôleur

Symfony

Pour générer un contrôleur sans template


php bin/console make:controller HomeController --no-
I c

template
ELH
U
L MO
f E
rele nom, Symfony nous le rappellera
h
Si on oublie de spécifier
c
Choose a cnameAfor your controller class (e.g.
GrumpyPizzaController):

H & H: Research and Training 9 / 50


Routage

Symfony

Plusieurs modes de routage avec Symfony

par annotation (par défaut en Symfony)


dans un fichier YAML
I c

ELH
dans un fichier XML
U
dans un fichier PHP L MO
f E
chre
c A

H & H: Research and Training 10 / 50


Routage

Symfony

Plusieurs modes de routage avec Symfony

par annotation (par défaut en Symfony)


dans un fichier YAML
I c

ELH
dans un fichier XML
U
dans un fichier PHP L MO
f E
A c hre
c
Pour le vérifier, allez dans config/routes/annotations.yaml
controllers:
resource: ../../src/Controller/
type: annotation

H & H: Research and Training 10 / 50


Routage Routage par annotation

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’,
]);
}
}

H & H: Research and Training 11 / 50


Routage Routage par annotation

Symfony

Explication

Tous les contrôleurs sont définis dans un namespace App\Controller

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

H & H: Research and Training 12 / 50


Routage Routage par annotation

Symfony

Explication

Tous les contrôleurs sont définis dans un namespace App\Controller

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

Pour tester, allez sur localhost:8000/home

H & H: Research and Training 12 / 50


Routage Routage dans un fichier YAML

Symfony

Routage dans un fichier YAML : démarche

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

H & H: Research and Training 13 / 50


Routage Routage dans un fichier 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’,
]);
}
}

H & H: Research and Training 14 / 50


Routage Routage dans un fichier YAML

Symfony

Nouveau contenu de annotations.yaml


# controllers: I c

# resource: ../../src/Controller/
ELH
U
# type: annotation
L MO
f E
kernel:
chre
c A
resource: ../../src/Kernel.php

type: annotation

H & H: Research and Training 15 / 50


Routage Routage dans un fichier YAML

Symfony

Définissons les routes dans routes.yaml


home:
I c

path: /home
ELH
U
MO
controller: App\Controller\HomeController::index

f E L
chre
c A

H & H: Research and Training 16 / 50


Routage Routage dans un fichier YAML

Symfony

Définissons les routes dans routes.yaml


home:
I c

path: /home
ELH
U
MO
controller: App\Controller\HomeController::index

f E L
A c hre
c
Pour tester,
allez sur localhost:8000/home

H & H: Research and Training 16 / 50


Routage Routage dans un fichier XML

Symfony

Routage dans un fichier XML : démarche


I c

commenter code de routes.yaml
E LH
U
MOaccessible depuis le
vérifier que la route /home n’est plus
L
navigateur
h r e fE
créer un fichiercroutes.xml dans config
c A
définir les routes dans routes.xml

H & H: Research and Training 17 / 50


Routage Routage dans un fichier XML

Symfony
Définissons les routes dans routes.xml

<?xml version="1.0" encoding="UTF-8" ?>


<routes xmlns="http://symfony.com/schema/routing"

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">

<route id="home" path="/home" O


U
L M
ref E
controller="App\Controller\HomeController::index"/>

c h
c A
</routes>

H & H: Research and Training 18 / 50


Routage Routage dans un fichier XML

Symfony
Définissons les routes dans routes.xml

<?xml version="1.0" encoding="UTF-8" ?>


<routes xmlns="http://symfony.com/schema/routing"

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">

<route id="home" path="/home" O


U
L M
ref E
controller="App\Controller\HomeController::index"/>

c h
c A
</routes>

Pour tester, allez sur localhost:8000/home

H & H: Research and Training 18 / 50


Routage Routage dans un fichier PHP

Symfony

Routage dans un fichier PHP : démarche


I c

supprimer le fichier routes.xml
EL H
U
O depuis le navigateur
Maccessible
vérifier que la route /home n’est plus
L
h r e
créer un fichier routes.phpf Edans config
A c
c
dans routes.php
définir les routes

H & H: Research and Training 19 / 50


Routage Routage dans un fichier PHP

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

H & H: Research and Training 20 / 50


Routage Routage dans un fichier PHP

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

Pour tester, allez sur localhost:8000/home

H & H: Research and Training 20 / 50


Routage Routage dans un fichier PHP

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

H & H: Research and Training 21 / 50


Routage Routage dans un fichier PHP

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

H & H: Research and Training 21 / 50


Multi-routes

Il est aussi possible d’associer plusieurs routes à notre méthode

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’,
]);
}
}

H & H: Research and Training 22 / 50


Multi-routes

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’,
]);
}
}

H & H: Research and Training 23 / 50


Paramètres de substitution

Pour récupérer un paramètre de substitution, il faut le définir dans la route et l’ajouter


comme paramètre de l’action

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController


I c

{
/**
ELH
U
MO
* @Route("/home/{nom}", name="home_route")
*/
public function index(string $nom)
f E L
hre
{

c
return $this->render(’home/index.html.twig’, [

}
]); c A
’controller_name’ => $nom,

}

H & H: Research and Training 24 / 50


Paramètres de substitution

Pour récupérer un paramètre de substitution, il faut le définir dans la route et l’ajouter


comme paramètre de l’action

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController


I c

{
/**
ELH
U
MO
* @Route("/home/{nom}", name="home_route")
*/
public function index(string $nom)
f E L
hre
{

c
return $this->render(’home/index.html.twig’, [

}
]); c A
’controller_name’ => $nom,

}

Pour tester, allez sur localhost:8000/home/wick

H & H: Research and Training 24 / 50


Paramètres de substitution

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;

class HomeController extends AbstractController


{
I c

/**

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,

}

H & H: Research and Training 25 / 50


Paramètres de substitution

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;

class HomeController extends AbstractController


{
I c

/**

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,

}

Pour tester, allez sur localhost:8000/home/50

H & H: Research and Training 25 / 50


Paramètres de substitution

La contrainte peut être collée au paramètre (sans l’attribut requirements)

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{age<\d+>}", name="home_route")
U
*/
public function index(int $age)
L MO
{
f E
hre
return $this->render(’home/index.html.twig’, [
c
c A
’controller_name’ => $age,

}
}
]);

H & H: Research and Training 26 / 50


Paramètres de substitution

La contrainte peut être collée au paramètre (sans l’attribut requirements)

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{age<\d+>}", name="home_route")
U
*/
public function index(int $age)
L MO
{
f E
hre
return $this->render(’home/index.html.twig’, [
c
c A
’controller_name’ => $age,

}
}
]);

Pour tester, allez sur localhost:8000/home/5

H & H: Research and Training 26 / 50


Paramètres de substitution

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;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{age<\d+>}", name="home_route")
U
*/
public function index(int $age = 7)
L MO
{
f E
hre
return $this->render(’home/index.html.twig’, [
c
c A
’controller_name’ => $age,

}
}
]);

H & H: Research and Training 27 / 50


Paramètres de substitution

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;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{age<\d+>}", name="home_route")
U
*/
public function index(int $age = 7)
L MO
{
f E
hre
return $this->render(’home/index.html.twig’, [
c
c A
’controller_name’ => $age,

}
}
]);

Pour tester, allez sur localhost:8000/home

H & H: Research and Training 27 / 50


Paramètres de substitution

Pour accepter la valeur null

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{age?}", name="home_route")
U
*/
public function index(?int $age)
L MO
{
f E
hre
return $this->render(’home/index.html.twig’, [
c
c A
’controller_name’ => $age,

}
}
]);

H & H: Research and Training 28 / 50


Paramètres de substitution

Pour accepter la valeur null

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{age?}", name="home_route")
U
*/
public function index(?int $age)
L MO
{
f E
hre
return $this->render(’home/index.html.twig’, [
c
c A
’controller_name’ => $age,

}
}
]);

Pour tester, allez sur localhost:8000/home

H & H: Research and Training 28 / 50


Paramètres de substitution

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;

class HomeController extends AbstractController


{
I c

/**
ELH
U
* @Route("/home/{age}", name="home_route", defaults={"nom": "wick

*/
", "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",

}
}

H & H: Research and Training 29 / 50


Paramètres de substitution

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;

class HomeController extends AbstractController


{
I c

/**
ELH
U
* @Route("/home/{age}", name="home_route", defaults={"nom": "wick

*/
", "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",

}
}

Pour tester, allez sur localhost:8000/home/45

H & H: Research and Training 29 / 50


Objet request

Symfony

L’objet request permet de

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
...

H & H: Research and Training 30 / 50


Objet request

Pour récupérer un paramètre de substitution en utilisant l’objet request


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{nom}", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->attributes->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

H & H: Research and Training 31 / 50


Objet request

Pour récupérer un paramètre de substitution en utilisant l’objet request


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{nom}", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->attributes->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

Pour tester, allez sur localhost:8000/home/wick

H & H: Research and Training 31 / 50


Objet request

On peut aussi utiliser le raccourci request->get(’nom parametre’)


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{nom}", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

H & H: Research and Training 32 / 50


Objet request

On peut aussi utiliser le raccourci request->get(’nom parametre’)


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{nom}", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

Pour tester, allez sur localhost:8000/home/wick

H & H: Research and Training 32 / 50


Objet request

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;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->query->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

H & H: Research and Training 33 / 50


Objet request

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;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->query->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

Pour tester, allez sur localhost:8000/home?nom=wick

H & H: Research and Training 33 / 50


Objet request

On peut aussi utiliser le raccourci request->get(’nom parametre’)


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

H & H: Research and Training 34 / 50


Objet request

On peut aussi utiliser le raccourci request->get(’nom parametre’)


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home", name="home_route")
U
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

Pour tester, allez sur localhost:8000/home?nom=wick

H & H: Research and Training 34 / 50


Objet request

Symfony

Autres informations contenues dans $request


$request->server : les variables de serveur
$request->cookies : les variables de cookie I c

H
EmLéthode de la requête
U
$request->getMethod() : le type de la
HTTP
L MO
h r e fE
$request->attributes->get(’ route’) ou son raccourci
c
c A
$request->get(’
route’) : le nom de la route
$request->request->get(’var’) : une variable envoyée
par le biais de la méthode POST
...

H & H: Research and Training 35 / 50


Méthode HTTP

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

f lesEméthodes HTTP autorisées.


Cependant, est possible de
r e
spécifier pour chaque action
c h
c A

H & H: Research and Training 36 / 50


Méthode HTTP

Exemple
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
U
* @Route("/home", name="home_route", methods={"GET","POST"})
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->query->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

H & H: Research and Training 37 / 50


Méthode HTTP

Exemple
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class HomeController extends AbstractController


{
I c

/**
ELH
U
* @Route("/home", name="home_route", methods={"GET","POST"})
*/
L
public function index(Request $request) MO
f E
hre
{
$nom = $request->query->get(’nom’);
c
c A
return $this->render(’home/index.html.twig’, [

]);
’controller_name’ => $nom,

}
}

L’action index sera exécutée pour les deux méthodes HTTP GET et POST.

H & H: Research and Training 37 / 50


Génération d’URL et redirection

Symfony

Commençons par générer un deuxième contrôleur nommé


VehiculeController
I c

php bin/console make:controller VehiculeController
ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 38 / 50


Génération d’URL et redirection

Symfony

Commençons par générer un deuxième contrôleur nommé


VehiculeController
I c

php bin/console make:controller VehiculeController
ELH
U
L MO
f E
Le résultat est
c hre
c A

created: src/Controller/VehiculeController.php
created: templates/vehicule/index.html.twig

H & H: Research and Training 38 / 50


Génération d’URL et redirection

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,
]);
}
}

H & H: Research and Training 39 / 50


Génération d’URL et redirection

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

H & H: Research and Training 40 / 50


Génération d’URL et redirection

Dans VehiculeController, on génère une URL puis on redirige


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;

class VehiculeController extends AbstractController


{
I c

/**
ELH
* @Route("/vehicule", name="vehicule_route")
U
*/
L MO
public function index()
f E
hre
{

c
$url = $this->generateUrl(’home_route’, array(

c A
’nom’ => ’abruzzi’,
));

return new RedirectResponse($url);

}
}

H & H: Research and Training 41 / 50


Génération d’URL et redirection

Dans VehiculeController, on génère une URL puis on redirige


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;

class VehiculeController extends AbstractController


{
I c

/**
ELH
* @Route("/vehicule", name="vehicule_route")
U
*/
L MO
public function index()
f E
hre
{

c
$url = $this->generateUrl(’home_route’, array(

c A
’nom’ => ’abruzzi’,
));

return new RedirectResponse($url);

}
}

Pour tester, allez sur localhost:8000/vehicule

H & H: Research and Training 41 / 50


Génération d’URL et redirection

On peut aussi utiliser la méthode redirect


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class VehiculeController extends AbstractController


{
/**
I c

* @Route("/vehicule", name="vehicule_route")
ELH
*/
U
public function index()
{
L MO
f E
hre
$url = $this->generateUrl(’home’, array(
’nom’ => ’abruzzi’,
c
c A
));

return $this->redirect($url);

}
}

H & H: Research and Training 42 / 50


Génération d’URL et redirection

On peut aussi utiliser la méthode redirect


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class VehiculeController extends AbstractController


{
/**
I c

* @Route("/vehicule", name="vehicule_route")
ELH
*/
U
public function index()
{
L MO
f E
hre
$url = $this->generateUrl(’home’, array(
’nom’ => ’abruzzi’,
c
c A
));

return $this->redirect($url);

}
}

Pour tester, allez sur localhost:8000/vehicule

H & H: Research and Training 42 / 50


Génération d’URL et redirection

On peut aussi utiliser le raccourci redirectToRoute

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class VehiculeController extends AbstractController


I c

{
/**
ELH
* @Route("/vehicule", name="vehicule_route")
U
*/
L MO
public function index()
f E
hre
{

c
return $this->redirectToRoute(’home_route’, [’nom’ => ’abruzzi’

c A
]);

}
}

H & H: Research and Training 43 / 50


Génération d’URL et redirection

On peut aussi utiliser le raccourci redirectToRoute

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class VehiculeController extends AbstractController


I c

{
/**
ELH
* @Route("/vehicule", name="vehicule_route")
U
*/
L MO
public function index()
f E
hre
{

c
return $this->redirectToRoute(’home_route’, [’nom’ => ’abruzzi’

c A
]);

}
}

Pour tester, allez sur localhost:8000/vehicule

H & H: Research and Training 43 / 50


Génération d’URL et redirection

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")

public function index()


c hre
c A
{

}
}
return $this->redirect(’http://symfony.com/doc’);

H & H: Research and Training 44 / 50


Génération d’URL et redirection

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")

public function index()


c hre
c A
{

}
}
return $this->redirect(’http://symfony.com/doc’);

Pour tester, allez sur localhost:8000/vehicule

H & H: Research and Training 44 / 50


Gestion d’erreurs et page 404

Pour renvoyer une page d’erreur, on peut utiliser HTTPException

namespace App\Controller;

// les use précédents


use Symfony\Component\HttpKernel\Exception\HttpException;

class HomeController extends AbstractController


{
I c

/**
* @Route("/home/{nom?}",name="home_route")
ELH
*/
U
public function index(?string $nom)
L MO
{
f E
hre
if (!isset($nom)) {

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,
]);
}
}

H & H: Research and Training 45 / 50


Gestion d’erreurs et page 404

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

H & H: Research and Training 46 / 50


Gestion d’erreurs et page 404

On peut aussi utiliser la méthode createNotFoundException

namespace App\Controller;

// les use précédents


use Symfony\Component\HttpKernel\Exception\HttpException;

class HomeController extends AbstractController


{
I c

/**
ELH
* @Route("/home/{nom?}",name="home_route")
U
*/
public function index(?string $nom)
L MO
f E
hre
{
if (!isset($nom)) {
c
c A
throw $this->createNotFoundException(’On ne peut vous

}
afficher la page de cette personne’);

return $this->render(’home/index.html.twig’, [
’controller_name’ => $nom,
]);
}
}

H & H: Research and Training 47 / 50


Objet response

Symfony

Deux utilisations possibles pour l’objet response


I c
EL H
explicite : en construisant la réponse
O U
L M
fE
implicite : on n’utilise pas l’objet response pour retourner la
réponse mais il sera
c h r e
utilisé en coulisses, nous n’avons pas à le

c A
manipuler directement.

H & H: Research and Training 48 / 50


Objet response

Utilisation explicite
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;

class HomeController extends AbstractController


I c

{
/**
ELH
* @Route("/home/{nom?}",name="home_route")
U
*/
L MO
E
public function index(?string $nom)
f
hre
{

c
$response = new Response(

c A
"<p>Bonjour $nom</p>",

Response::HTTP_OK,
[’content-type’ => ’text/html’]
);
return $response;
}
}

H & H: Research and Training 49 / 50


Objet response

Utilisation explicite
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;

class HomeController extends AbstractController


I c

{
/**
ELH
* @Route("/home/{nom?}",name="home_route")
U
*/
L MO
E
public function index(?string $nom)
f
hre
{

c
$response = new Response(

c A
"<p>Bonjour $nom</p>",

Response::HTTP_OK,
[’content-type’ => ’text/html’]
);
return $response;
}
}

Pour tester, allez sur localhost:8000/home/wick

H & H: Research and Training 49 / 50


Objet 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,
]);
}
}

H & H: Research and Training 50 / 50