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.