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() также.