Định tuyến cơ bản và nâng cao trong Symfony
Routing (định tuyến) là bước đầu tiên trong việc xử lý một request HTTP. Symfony sử dụng hệ thống định tuyến linh hoạt để ánh xạ các URL tới các controller cụ thể. Trong bài học này, bạn sẽ tìm hiểu cách định nghĩa route một cách cơ bản và nâng cao, bao gồm cách sử dụng tham số động, ràng buộc giá trị, phương thức HTTP, prefix nhóm route và annotation. Nắm vững routing giúp bạn xây dựng ứng dụng logic, linh hoạt và dễ bảo trì.

1. Định nghĩa route cơ bản (YAML)
Symfony định nghĩa các route trong file: config/routes.yaml
# config/routes.yaml
hello:
path: /hello
controller: App\Controller\HelloController::index
-
hello
: tên định danh của route. -
path
: URL người dùng sẽ truy cập. -
controller
: phương thức xử lý yêu cầu.
2. Route với tham số động
product_show:
path: /product/{id}
controller: App\Controller\ProductController::show
-
{id}
là tham số động – tự động truyền vào controller.
Controller:
public function show(int $id): Response
{
return new Response("Product ID: " . $id);
}
3. Ràng buộc tham số (requirements)
product_show:
path: /product/{id}
controller: App\Controller\ProductController::show
requirements:
id: '\d+'
- Đảm bảo
{id}
chỉ là số.
4. Định nghĩa phương thức HTTP
contact_submit:
path: /contact
controller: App\Controller\ContactController::submit
methods: [POST]
- Route chỉ chấp nhận request POST.
5. Gán giá trị mặc định
article:
path: /article/{page}
controller: App\Controller\ArticleController::index
defaults:
page: 1
6. Route với annotation (PHP Attributes)
Trong Symfony 6+, có thể định nghĩa route ngay trong controller với thuộc tính PHP:
use Symfony\Component\Routing\Attribute\Route;
#[Route('/about', name: 'about_page')]
public function about(): Response
{
return new Response("About us page");
}
Cấu hình annotation được bật trong
config/routes/annotations.yaml
7. Nhóm route theo tiền tố (prefix)
admin:
resource: ../src/Controller/Admin/
type: attribute
prefix: /admin
- Tất cả route trong thư mục
Admin
sẽ có tiền tố/admin
.
8. Kiểm tra danh sách route
Sử dụng lệnh CLI:
php bin/console debug:router
Ví dụ cụ thể
a. Tạo controller ArticleController
// src/Controller/ArticleController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/{slug}', name: 'article_show')]
public function show(string $slug): Response
{
return new Response("Viewing article: " . $slug);
}
}
- Truy cập:
http://localhost:8000/article/hello-world
- Kết quả:
Viewing article: hello-world
Kết luận
Routing trong Symfony là hệ thống cực kỳ linh hoạt và mạnh mẽ, cho phép bạn dễ dàng:
- Xây dựng URL có cấu trúc rõ ràng, thân thiện.
- Kiểm soát chặt chẽ phương thức, tham số.
- Gắn route với controller bằng YAML, PHP attribute hoặc annotation.
Việc hiểu rõ routing là nền tảng quan trọng để xây dựng ứng dụng RESTful, xử lý form, gọi API và phát triển giao diện frontend hiệu quả. Trong bài tiếp theo, bạn sẽ học cách gửi dữ liệu qua URL, query string và form để xử lý trong controller.

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.
Xem thêm

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.
Liên hệ công việc qua email dưới đây.
lhvuctu@gmail.com