1. Định nghĩa Route trong Symfony có 3 cách
a. Dùng Annotations (Symfony 5 hoặc thấp hơn):
use Symfony\Component\Routing\Annotation\Route;
#[Route('/about', name: 'about_page')]
public function about(): Response
{
return $this->render('about.html.twig');
}
Dễ đọc, sát code, nhưng khi nhiều route thì sẽ hơi rối.
b. Dùng YAML (config/routes.yaml):
about_page:
path: /about
controller: App\Controller\PageController::about
c. Dùng PHP routes (Symfony 6+ khuyến khích):
// config/routes.php
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('about_page', '/about')
->controller([App\Controller\PageController::class, 'about']);
};
2. Các thành phần chính của một Route
Thành phần |
Ý nghĩa |
---|---|
path |
Đường dẫn URL |
name |
Tên định danh cho route |
controller |
Lớp và method xử lý request |
defaults |
Giá trị mặc định cho param |
requirements |
Regex ràng buộc tham số |
methods |
Giới hạn HTTP method (GET, POST…) |
Ví dụ:
blog_show:
path: /blog/{slug}
controller: App\Controller\BlogController::show
requirements:
slug: "[a-z0-9\-]+"
methods: [GET]
3. Route có tham số động
Symfony cực kỳ linh hoạt khi bạn dùng:
product_show:
path: /product/{id}
controller: App\Controller\ProductController::show
requirements:
id: \d+
Thêm requirements để không ai nhập /product/abc được nhé!
4. Tạo URL từ route (Reverse Routing)
Trong controller hoặc Twig, bạn không cần viết tay URL:
Trong Twig:
<a href="{{ path('about_page') }}">Giới thiệu</a>
<a href="{{ path('product_show', {id: 42}) }}">Xem sản phẩm</a>
Trong PHP:
$url = $this->generateUrl('product_show', ['id' => 42]);
5. Kiểm tra tất cả Route đang có
Chạy câu lệnh sau:
php bin/console debug:router
Bạn sẽ thấy toàn bộ map như Google Maps dành riêng cho app bạn vậy!
6. Route với _locale, _format
hello:
path: /{_locale}/hello.{_format}
controller: App\Controller\HelloController::index
defaults:
_locale: en
_format: html
Truy cập /vi/hello.json là hoàn toàn hợp lệ.
7. Route và Security
Bạn có thể giới hạn route chỉ cho ROLE cụ thể trong security.yaml:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
Kết luận
Route trong Symfony là “cửa ngõ” của mọi request, và việc hiểu rõ cách khai báo, quản lý, và khai thác route sẽ giúp bạn code Symfony như thần gió.
Symfony không chỉ mạnh mẽ mà còn cực kỳ linh hoạt – nhất là khi bạn hiểu được Route hoạt động ra sao.
Tác giả: Dong Nguyen
BÌNH LUẬN
Địa chỉ email của bạn sẽ không được công khai.