Principe.
Les contrôleurs Symfony sont les classes qui définissent les opérations à réaliser quand on visite les pages du sites : elles transforment une requête HTTP en réponse (JSON, XML (dont HTML), etc.).
Par convention, leurs noms se terminent par "Controller", les noms de leurs méthodes se terminent par "Action", et les URL qui provoquent leurs exécutions sont définies dans leurs annotations. L'exemple suivant affiche un texte quand on visite l'adresse "/" ou "/helloWorld" :
class HelloWorldController extends AbstractController
 #[Route(path: '/', name: 'helloWorld')]
 #[Route(path: '/helloWorld', name: 'helloWorld')]
 public function indexAction(Request $request): Response
 return new Response('Hello World!');
NB : en PHP < 8, remplacer l'attribut par une annotation :
 * @Route("/", name="helloWorld")
 * @Route("/helloWorld")
Retours.
Ces méthodes peuvent déboucher sur plusieurs actions :
Flashbag.
On peut aussi ajouter un bandeau de message temporaire en en-tête via :
 $this->addflash('success', 'mon_message');
Le Twig peut les récupérer ensuite avec :
En effet, ils sont stockés dans un Flashbag : un objet de session.
De plus, il en existe plusieurs types (chacun avec une couleur) : "success", "notice", "info", "warning", "error".
Accès aux paramètres et services.
Les contrôleurs étendent la codice_13. Cela leur permettait entre autres dans Symfony 2, de récupérer les services et paramètres ainsi :
dump($this->get('session'));
dump($this->getParameter('kernel.project_dir'));
Depuis Symfony 4, il faut injecter le service "service_container" pour accéder à la liste des services publiques (codice_14 en YAML), mais la bonne pratique est d'injecter uniquement les services nécessaires dans le constructeur.
Les paramètres sont ceux des fichiers .yml du dossier "config", mais plusieurs autres paramètres sont fournis par Symfony :
 bin/console debug:container --parameters
Routing.
Par exemple pour créer une nouvelle page sur l'URL :
 http://localhost:8000/test
Installer le routage :
 composer require sensio/framework-extra-bundle
 composer require symfony/routing
Par défaut, la page renvoie l'exception "No route found for "GET /test"". Pour la créer, il faut d'abord générer un fichier contrôleur (rôle ), qui fera le lien entre les URL, les données (modèle) et les pages (vue).
Les URL définies dans l'attribut (ou l'annotation) "route" d'une méthode exécuteront cette dernière :
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class TestController extends AbstractController
 #[route('/test/{numero}', name: 'test', requirements: ['id' => '\d*'], methods: ['GET', 'POST'], priority: -1)]
 public function HelloWorldAction(int $numero = 0)
 return new Response('Hello World! '.$numero);
NB : en PHP < 8, remplacer l'attribut par une annotation :
 * @Route("/test/{numero}", name="test", requirements={"id"="\d*"}, methods={"GET|POST"}, priority=-1)
Autres exemples de prérequis :
Alias.
Pour créer des alias, c'est-à-dire plusieurs autres URL pointant vers la page ci-dessus, on peut l'ajouter dans les annotations des contrôleurs, ou bien dans config/routes.yaml (anciennement app\config\routing.yml sur Symfony < 4) :
test:
À présent http://localhost:8000/test/1 ou http://localhost:8000/test/2 affichent "Hello World!".
Redirection vers la dernière page visitée.
Une astuce pour rediriger l'utilisateur vers la dernière page qu'il avait visité :
$router = $this->get('router');
$lastPage = $request->getSession()->get('last_view_page');
$parameterLastPage = $router->match($lastPage);
$routeLastPage = $parameterLastPage['_route'];
unset($parameterLastPage['_route']); // Pour ne pas la voir dans l'URL finale
return $this->redirect(
 $this->generateUrl($routeLastPage, $parameterLastPage)
Annotations.yaml.
Ce fichier permet de définir des groupes de contrôleurs, dont les routes sont préfixées. Ex :
back_controllers:
 resource: ../../src/Controller/BackOffice
 type: annotation
 prefix: admin
front_controllers:
 resource: ../../src/Controller/FrontOffice
 type: annotation
 prefix: api
Paramètres spéciaux.
Il existe quatre paramètres spéciaux que l'on peut placer dans routes.yaml ou en argument des méthodes des contrôleurs :
Exemple :
 #[Route('/controller_route', requirements: ['_locale' => 'en|fr'])]
 class MyController extends AbstractController
Vue.
Pour commencer à créer des pages plus complexes, il suffit de remplacer :
 return new Response('Hello World!');
par une vue issue d'un . Celui de Symfony est Twig :
 return $this->render('helloWorld.html.twig');
Pour installer les bibliothèques JavaScript qui agiront sur ces pages, se positionner dans /public. Exemple :
cd public/
sudo apt-get install npm
npm install --save jquery
npm install --save bootstrap
Ensuite il suffit de les appeler dans /templates/helloWorld.html.twig pour pouvoir les utiliser :
<link rel="stylesheet" href="">
<script type="text/javascript" src=""></script>
<script type="text/javascript" src=""></script>
Modèle.
Pour gérer le modèle du MVC, c'est-à-dire la structure des données stockées, l' officiel de Symfony se nomme Doctrine.
Par défaut, ses classes sont :

Git/Débogage
Mathc matrices/a76
Application
Mathc matrices/a77
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* Save as : c00a.c */
void fun(void)
int n = 10; 
int i = 0; 
double **A = rE_mR(i_mR(RCA,RCA),999,+1.E-3); 
double **A_n = i_mR(RCA,RCA);
double **sA = i_mR(RCA,RCA);
double **ExpA = i_mR(RCA,RCA); 
double **NewExpA = i_mR(RCA,RCA); 
 clrscrn(); 
 printf(" Copy/Past into the octave window. \n\n");
 p_Octave_mR(A, "A", P3);
 printf(" expm (A)\n\n\n");
 for(i = 0; i <= n; i++)
 pow_mR(i, A, A_n); 
 smul_mR(1./factorial(i), A_n, sA); 
 add_mR(ExpA,sA,NewExpA); 
 c_mR(NewExpA,ExpA);

printf(" ExpA :");
 p_mR(ExpA,S8,P6,C6);
 f_mR(A);
 f_mR(A_n);
 f_mR(sA);
 f_mR(ExpA);
 f_mR(NewExpA); 
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun();
} while(stop_w());
 return 0;
/* ------------------------------------ */
 ExpA = Ide + A + (1/2) A**2 + (1/6) A**3 + ... + 1/(n-1)! A**(n-1)
 Exemple de sortie écran :
 Copy/Past into the octave window. 
 A=[
-0.275,+0.505,-0.220,+0.732;
+0.893,-0.871,-0.249,-0.251;
+0.803,+0.152,-0.659,-0.776;
-0.689,+0.150,-0.932,+0.664]
 expm (A)
 ExpA :
+0.469595 +0.281641 -0.498660 +0.989235 
+0.473987 +0.521426 -0.182876 +0.115416 
+0.815081 +0.198096 +0.657846 -0.544365 
-1.216594 -0.106370 -0.910987 +1.927402 
 Press return to continue
 Press X to stop