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