Định tuyến cơ bản và nâng cao trong Symfony

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 10 tháng 5, 2025

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.

Website Logo

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.

Bình luận

Website Logo

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

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ