Routing trong CakePHP

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

Routing là quá trình xác định và xử lý các yêu cầu HTTP, ánh xạ chúng đến các controller và hành động tương ứng. CakePHP cung cấp một hệ thống routing mạnh mẽ, giúp lập trình viên dễ dàng định nghĩa các tuyến đường (routes) cho ứng dụng. Các tuyến đường này xác định cách thức người dùng truy cập các trang của ứng dụng, đồng thời hỗ trợ tùy chỉnh URL theo nhu cầu của dự án.

Khai báo route cơ bản (routes.php)

Trong CakePHP, các tuyến đường được khai báo trong tệp config/routes.php. Tệp này chứa các quy tắc ánh xạ từ URL vào controller và hành động (action) của ứng dụng.

  1. Route mặc định
    Khi CakePHP khởi động, hệ thống sẽ tìm kiếm tệp routes.php trong thư mục config để định nghĩa các tuyến đường. Một route cơ bản trong CakePHP có thể trông như sau:

    // config/routes.php
    use Cake\Routing\Router;
    
    Router::defaultRouteClass('DashedRoute'); // Cấu hình route mặc định
    
    // Định nghĩa route cơ bản
    Router::connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    

    Trong ví dụ trên:

    • Router::connect() ánh xạ URL / (trang chủ) tới controller Pages và hành động display với tham số home.
    • Khi người dùng truy cập vào trang chủ của ứng dụng, CakePHP sẽ gọi hành động display của controller Pages và hiển thị trang home.
  2. Route cơ bản với controller và action
    Bạn có thể định nghĩa các route khác bằng cách sử dụng phương thức Router::connect(). Ví dụ, để định nghĩa một route cho trang "about":

    Router::connect('/about', ['controller' => 'Pages', 'action' => 'display', 'about']);
    

    Trong trường hợp này, khi người dùng truy cập /about, CakePHP sẽ gọi controller Pages và hành động display với tham số about.


Routing động với tham số

CakePHP hỗ trợ routing động, cho phép bạn khai báo các route có tham số trong URL. Điều này rất hữu ích khi bạn muốn xử lý các URL có dữ liệu động như ID hoặc tên.

  1. Route với tham số đơn
    Một ví dụ điển hình là việc định nghĩa một route để xem chi tiết bài viết theo ID. Bạn có thể khai báo route như sau:

    Router::connect('/posts/view/:id', ['controller' => 'Posts', 'action' => 'view'], ['pass' => ['id']]);
    

    Trong ví dụ trên:

    • URL /posts/view/123 sẽ ánh xạ tới controller Posts và hành động view.
    • Tham số 123 sẽ được truyền vào hành động view như một tham số $id.
    • ['pass' => ['id']] chỉ định rằng tham số id sẽ được chuyển đến hành động trong controller.

    Ở phía controller, bạn có thể xử lý tham số này như sau:

    // src/Controller/PostsController.php
    public function view($id)
    {
        $post = $this->Posts->get($id);
        $this->set('post', $post);
    }
    
  2. Route với nhiều tham số
    Nếu bạn cần truyền nhiều tham số trong URL, bạn có thể khai báo như sau:

    Router::connect('/posts/:action/*', ['controller' => 'Posts']);
    

    Với route này, các URL như /posts/view/1 hay /posts/edit/2 sẽ ánh xạ tới controller Posts và các hành động tương ứng (viewedit), đồng thời truyền tham số ID vào hành động.

Tùy chỉnh URL (Custom Route)

CakePHP cung cấp khả năng tùy chỉnh URL theo yêu cầu của bạn, giúp tạo các tuyến đường có dạng URL dễ hiểu hoặc tối ưu cho SEO.

  1. Tùy chỉnh URL với đoạn chuỗi cố định
    Bạn có thể dễ dàng thay đổi cấu trúc URL để phù hợp với nhu cầu của ứng dụng. Ví dụ, bạn có thể tạo một route cho bài viết mà không sử dụng ID, mà thay vào đó là slug:

    Router::connect('/posts/:slug', ['controller' => 'Posts', 'action' => 'view'], ['pass' => ['slug']]);
    

    URL /posts/introducing-cakephp sẽ ánh xạ đến controller Posts và hành động view với tham số slug. Trong controller, bạn có thể xử lý tham số slug như sau:

    public function view($slug)
    {
        $post = $this->Posts->findBySlug($slug);
        $this->set('post', $post);
    }
    
  2. Tùy chỉnh URL với miền con hoặc đoạn đường khác
    Nếu bạn muốn sử dụng miền con (subdomain) hoặc một cấu trúc URL phức tạp hơn, bạn có thể tùy chỉnh theo cách sau:

    Router::connect('/:language/posts/view/:slug', ['controller' => 'Posts', 'action' => 'view'], ['pass' => ['slug']]);
    

    Với route này, URL có thể là /en/posts/view/introducing-cakephp, trong đó en là tham số ngôn ngữ và introducing-cakephp là slug của bài viết.

    Ở controller, bạn có thể xử lý tham số language như sau:

    public function view($slug)
    {
        $language = $this->request->getParam('language');
        $post = $this->Posts->findBySlug($slug)->first();
        $this->set('post', $post);
    }
    

Kết luận

Routing trong CakePHP giúp bạn dễ dàng xác định cách các yêu cầu HTTP được ánh xạ đến các controller và hành động tương ứng. Với khả năng khai báo các route cơ bản, hỗ trợ tham số động và khả năng tùy chỉnh URL, CakePHP cung cấp một hệ thống routing linh hoạt và mạnh mẽ. Việc hiểu và sử dụng đúng cách các route sẽ giúp ứng dụng của bạn dễ dàng mở rộng và tối ưu hóa URL cho các mục đích SEO hoặc yêu cầu đặc biệt khác.

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ệ