Symfony - Routage

Les cartes de routage demandent l'URI à la méthode d'un contrôleur spécifique. En général, tout URI comprend les trois parties suivantes -

  • Segment de nom d'hôte
  • Segment de chemin
  • Segment de requête

Par exemple, dans URI / URL, http://www.tutorialspoint.com/index?q=data, www.tutorialspoint.comest le segment de nom d'hôte, index est le segment de chemin et q = data est le segment de requête. En règle générale, le routage vérifie le segment de page par rapport à un ensemble de contraintes. Si une contrainte correspond, elle renvoie un ensemble de valeurs. L'une des principales valeurs est le contrôleur.

Annotations

L'annotation joue un rôle important dans la configuration de l'application Symfony. L'annotation simplifie la configuration en déclarant la configuration dans le codage lui-même. L'annotation n'est rien d'autre que de fournir des méta-informations sur les classes, les méthodes et les propriétés. Le routage utilise largement l'annotation. Même si le routage peut être effectué sans annotation, l'annotation simplifie le routage dans une large mesure.

Voici un exemple d'annotation.

/** 
   * @Route(“/student/home”) 
*/ 
public function homeAction() { 
   // ... 
}

Concepts de routage

Considérez la classe StudentController créée dans le projet «étudiant».

StudentController.php

// src/AppBundle/Controller/StudentController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class StudentController extends Controller { 
   /** 
      * @Route(“/student/home”) 
   */ 
   public function homeAction() { 
      // ... 
   }  
    
   /** 
      * @Route(“/student/about”) 
   */ 
   public function aboutAction() { 
   } 
}

Ici, le routage effectue deux étapes. Si vous allez à/student/home, la première route correspond alors homeAction()est exécuté. Sinon, si vous allez à/student/about, le deuxième itinéraire est apparié puis aboutAction() est exécuté.

Ajout de formats de caractères génériques

Considérez que vous avez une liste paginée de dossiers d'étudiants avec des URL telles que / student / 2 et / student / 3 pour les pages 2 et 3 en conséquence. Ensuite, si vous souhaitez modifier le chemin de l'itinéraire, vous pouvez utiliser des formats génériques.

Exemple

// src/AppBundle/Controller/BlogController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;  

class StudentController extends Controller {
   /**      
      * @Route(“/student/{page}", name = “student_about”, requirements = {"page": "\d+"})
   */ 
   public function aboutAction($page) { 
      // ... 
   } 
}

Ici le \d+ est une expression régulière qui correspond à un chiffre de n'importe quelle longueur.

Attribuer un espace réservé

Vous pouvez affecter une valeur d'espace réservé dans la gamme. Il est défini comme suit.

// src/AppBundle/Controller/BlogController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;  

class StudentController extends Controller { 
   /**      
      * @Route(“/student/{page}", name = “student_about”, requirements = {"page": "\d+"})
   */ 
    
   public function aboutAction($page = 1) { 
      // ... 
   } 
}

Ici, si vous allez à / student, le student_about route correspondra et $page prendra par défaut la valeur 1.

Redirection vers une page

Si vous souhaitez rediriger l'utilisateur vers une autre page, utilisez le redirectToRoute() et redirect() méthodes.

public function homeAction() { 
   // redirect to the "homepage" route 
   return $this->redirectToRoute('homepage');  
   
   // redirect externally 
   \return $this->redirect('http://example.com/doc'); 
}

Générer des URL

Pour générer une URL, considérez un nom de route, student_name et nom générique, student-namesutilisé dans le chemin de cet itinéraire. La liste complète pour générer une URL est définie comme suit.

class StudentController extends Controller { 
   public function aboutAction($name) { 
      // ...  
      // /student/student-names 
      $url = $this->generateUrl( 
         ‘student_name’, 
         array(‘name’ =>
         ’student-names’) 
      ); 
   } 
}

StudentController

Prenons un exemple simple de routage dans la classe StudentController comme suit.

StudentController.php

<?php  
namespace AppBundle\Controller;  

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;  

class StudentController  { 
   /** 
      * @Route("/student/home") 
   */ 
   
   public function homeAction() { 
      $name = 'Student details application'; 
      return new Response( 
         '<html><body>Project: '.$name.'</body></html>' 
      ); 
   } 
}

Maintenant, demandez l'url,”http://localhost:8000/student/home” et il produit le résultat suivant.

De même, vous pouvez créer un autre itinéraire pour aboutAction() ainsi que.