Symfony - roteamento

Os mapas de roteamento solicitam o URI para um método de controlador específico. Em geral, qualquer URI tem as três partes a seguir -

  • Segmento de nome de host
  • Segmento de caminho
  • Segmento de consulta

Por exemplo, em URI / URL, http://www.tutorialspoint.com/index?q=data, www.tutorialspoint.comé o segmento do nome do host, índice é o segmento do caminho e q = data é o segmento da consulta. Geralmente, o roteamento verifica o segmento da página em relação a um conjunto de restrições. Se qualquer restrição corresponder, ele retornará um conjunto de valores. Um dos principais valores é o controlador.

Anotações

A anotação desempenha um papel importante na configuração do aplicativo Symfony. A anotação simplifica a configuração, declarando a configuração na própria codificação. A anotação nada mais é do que fornecer metainformações sobre classes, métodos e propriedades. O roteamento usa anotações extensivamente. Mesmo que o roteamento possa ser feito sem anotação, a anotação simplifica o roteamento em grande medida.

A seguir está um exemplo de anotação.

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

Conceitos de Roteamento

Considere a classe StudentController criada no projeto “student”.

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() { 
   } 
}

Aqui, o roteamento executa duas etapas. Se você vai para/student/home, a primeira rota é combinada, então homeAction()É executado. Caso contrário, se você for para/student/about, a segunda rota é combinada e então aboutAction() É executado.

Adicionar formatos curinga

Considere que você tem uma lista paginada de registros de alunos com URLs como / student / 2 e / student / 3 para as páginas 2 e 3, respectivamente. Então, se você quiser mudar o caminho da rota, você pode usar formatos curinga.

Exemplo

// 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) { 
      // ... 
   } 
}

Aqui o \d+ é uma expressão regular que corresponde a um dígito de qualquer comprimento.

Atribuir espaço reservado

Você pode atribuir um valor de espaço reservado no roteamento. É definido como segue.

// 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) { 
      // ... 
   } 
}

Aqui, se você for para / student, o student_about route vai combinar e $page será padronizado para um valor de 1.

Redirecionando para uma página

Se você deseja redirecionar o usuário para outra página, use o redirectToRoute() e redirect() métodos.

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

Gerando URLs

Para gerar um URL, considere um nome de rota, student_name e nome curinga, student-namesusado no caminho para essa rota. A lista completa para gerar um URL é definida a seguir.

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

StudentController

Considere um exemplo simples de roteamento na classe StudentController como segue.

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>' 
      ); 
   } 
}

Agora, solicite o url,”http://localhost:8000/student/home” e produz o seguinte resultado.

Da mesma forma, você pode criar outra rota para aboutAction() também.