Symfony - Маршрутизация
Маршрутизация сопоставляет URI запроса с методом конкретного контроллера. В общем, любой URI состоит из следующих трех частей:
- Сегмент имени хоста
- Сегмент пути
- Сегмент запроса
Например, в URI / URL, http://www.tutorialspoint.com/index?q=data, www.tutorialspoint.com- это сегмент имени хоста, index - это сегмент пути, а q = data - это сегмент запроса. Как правило, маршрутизация проверяет сегмент страницы на соответствие набору ограничений. Если какое-либо ограничение совпадает, возвращается набор значений. Одна из главных ценностей - это контроллер.
Аннотации
Аннотация играет важную роль в настройке приложения Symfony. Аннотация упрощает конфигурацию, объявляя конфигурацию в самой кодировке. Аннотации - это не что иное, как предоставление метаинформации о классе, методах и свойствах. Маршрутизация широко использует аннотации. Несмотря на то, что маршрутизация может выполняться без аннотаций, аннотации в значительной степени упрощают маршрутизацию.
Ниже приводится образец аннотации.
/**
* @Route(“/student/home”)
*/
public function homeAction() {
// ...
}
Концепции маршрутизации
Рассмотрим класс StudentController, созданный в «студенческом» проекте.
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() {
}
}
Здесь маршрутизация выполняется в два этапа. Если вы пойдете в/student/home, первый маршрут совпадает, затем homeAction()выполняется. В противном случае, если вы перейдете в/student/about, второй маршрут совпадает, а затем aboutAction() выполняется.
Добавление форматов подстановочных знаков
Предположим, у вас есть разбитый на страницы список студенческих записей с URL-адресами типа / student / 2 и / student / 3 для страниц 2 и 3 соответственно. Затем, если вы хотите изменить путь маршрута, вы можете использовать форматы подстановочных знаков.
пример
// 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) {
// ...
}
}
Здесь \d+ регулярное выражение, которое соответствует цифре любой длины.
Назначить заполнитель
Вы можете назначить значение-заполнитель в маршрутизации. Это определяется следующим образом.
// 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) {
// ...
}
}
Здесь, если вы перейдете к / student, student_about route будет соответствовать и $page по умолчанию будет установлено значение 1.
Перенаправление на страницу
Если вы хотите перенаправить пользователя на другую страницу, используйте redirectToRoute() и redirect() методы.
public function homeAction() {
// redirect to the "homepage" route
return $this->redirectToRoute('homepage');
// redirect externally
\return $this->redirect('http://example.com/doc');
}
Создание URL-адресов
Чтобы сгенерировать URL-адрес, рассмотрите имя маршрута, student_name и подстановочное имя, student-namesиспользуется в пути для этого маршрута. Полный список для создания URL-адреса определяется следующим образом.
class StudentController extends Controller {
public function aboutAction($name) {
// ...
// /student/student-names
$url = $this->generateUrl(
‘student_name’,
array(‘name’ =>
’student-names’)
);
}
}
StudentController
Рассмотрим простой пример маршрутизации в классе StudentController следующим образом.
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>'
);
}
}
Теперь запросите URL-адрес,”http://localhost:8000/student/home” и это дает следующий результат.
Точно так же вы можете создать другой маршрут для aboutAction() также.