Symfony - Định tuyến
Bản đồ định tuyến yêu cầu URI tới phương thức của bộ điều khiển cụ thể. Nói chung, bất kỳ URI nào cũng có ba phần sau:
- Phân đoạn tên máy chủ
- Đoạn đường dẫn
- Phân đoạn truy vấn
Ví dụ: trong URI / URL, http://www.tutorialspoint.com/index?q=data, www.tutorialspoint.comlà phân đoạn tên máy chủ, chỉ mục là phân đoạn đường dẫn và q = data là phân đoạn truy vấn. Nói chung, định tuyến kiểm tra phân đoạn trang dựa trên một tập hợp các ràng buộc. Nếu bất kỳ ràng buộc nào phù hợp, thì nó trả về một bộ giá trị. Một trong những giá trị chính là bộ điều khiển.
Chú thích
Chú thích đóng một vai trò quan trọng trong cấu hình của ứng dụng Symfony. Chú thích đơn giản hóa cấu hình bằng cách khai báo cấu hình trong chính mã. Chú thích không có gì khác ngoài việc cung cấp thông tin meta về lớp, phương thức và thuộc tính. Định tuyến sử dụng chú thích rộng rãi. Mặc dù có thể thực hiện định tuyến mà không cần chú thích, nhưng chú thích đơn giản hóa việc định tuyến ở một mức độ lớn.
Sau đây là một chú thích mẫu.
/**
* @Route(“/student/home”)
*/
public function homeAction() {
// ...
}
Khái niệm định tuyến
Hãy xem xét lớp StudentController được tạo trong dự án "sinh viên".
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() {
}
}
Ở đây, định tuyến thực hiện hai bước. Nếu bạn đi đến/student/home, tuyến đường đầu tiên được kết hợp sau đó homeAction()được thực thi. Ngược lại, nếu bạn đi đến/student/about, tuyến đường thứ hai được so khớp và sau đó aboutAction() được thực thi.
Thêm định dạng ký tự đại diện
Hãy xem xét, bạn có một danh sách hồ sơ học sinh được phân trang với các URL như / student / 2 và / student / 3 cho trang 2 và 3 tương ứng. Sau đó, nếu bạn muốn thay đổi đường dẫn của tuyến đường, bạn có thể sử dụng các định dạng ký tự đại diện.
Thí 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) {
// ...
}
}
Đây, \d+ là một biểu thức chính quy khớp với một chữ số có độ dài bất kỳ.
Chỉ định Trình giữ chỗ
Bạn có thể chỉ định giá trị trình giữ chỗ trong định tuyến. Nó được định nghĩa như sau.
// 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) {
// ...
}
}
Ở đây, nếu bạn truy cập / student, student_about route sẽ phù hợp và $page sẽ mặc định có giá trị là 1.
Chuyển hướng đến một trang
Nếu bạn muốn chuyển hướng người dùng đến một trang khác, hãy sử dụng redirectToRoute() và redirect() các phương pháp.
public function homeAction() {
// redirect to the "homepage" route
return $this->redirectToRoute('homepage');
// redirect externally
\return $this->redirect('http://example.com/doc');
}
Tạo URL
Để tạo một URL, hãy xem xét một tên tuyến đường, student_name và tên ký tự đại diện, student-namesđược sử dụng trong đường dẫn cho tuyến đường đó. Danh sách đầy đủ để tạo URL được xác định như sau.
class StudentController extends Controller {
public function aboutAction($name) {
// ...
// /student/student-names
$url = $this->generateUrl(
‘student_name’,
array(‘name’ =>
’student-names’)
);
}
}
StudentController
Hãy xem xét một ví dụ đơn giản về định tuyến trong lớp StudentController như sau.
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>'
);
}
}
Bây giờ, hãy yêu cầu url,”http://localhost:8000/student/home” và nó tạo ra kết quả sau.
Tương tự, bạn có thể tạo một tuyến đường khác cho aboutAction() cũng.