0% ont trouvé ce document utile (0 vote)
220 vues76 pages

Cours Symfony Controleur

Ce document décrit la génération et l'utilisation des contrôleurs dans le framework Symfony. Il explique comment générer un contrôleur, le routage, les paramètres, la requête, la réponse et les erreurs.

Transféré par

losus007
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
220 vues76 pages

Cours Symfony Controleur

Ce document décrit la génération et l'utilisation des contrôleurs dans le framework Symfony. Il explique comment générer un contrôleur, le routage, les paramètres, la requête, la réponse et les erreurs.

Transféré par

losus007
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

[email protected]

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

Vous aimerez peut-être aussi