Routing trong CakePHP
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.
-
Route mặc định
Khi CakePHP khởi động, hệ thống sẽ tìm kiếm tệproutes.php
trong thư mụcconfig
để đị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 controllerPages
và hành độngdisplay
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 controllerPages
và hiển thị tranghome
.
-
-
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ứcRouter::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 controllerPages
và hành độngdisplay
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.
-
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 controllerPosts
và hành độngview
. - Tham số
123
sẽ được truyền vào hành độngview
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); }
- URL
-
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 controllerPosts
và các hành động tương ứng (view
vàedit
), đồ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.
-
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 controllerPosts
và hành độngview
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); }
-
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.

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