diff --git a/README.md b/README.md index cf03c17..dd205af 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ phpure là một framework MVC đơn giản được viết bằng PHP để gi --- -## **Gặp Gỡ phpure** ✌️ +## **Gặp Gỡ `phpure`** ✌️ Trong quá trình phát triển ứng dụng web, bạn sẽ nhanh chóng nhận ra rằng việc tổ chức mã nguồn một cách có cấu trúc là điều không thể thiếu. Ban đầu, bạn có thể bắt đầu với những file PHP đơn @@ -17,22 +17,36 @@ framework ngay từ đầu, rất có thể bạn sẽ tự mình xây dựng m vấn đề tổ chức và tái sử dụng mã nguồn – về bản chất, bạn đang tự tạo ra framework của riêng mình. -Ngoài kia, có rất nhiều framework PHP mạnh mẽ như Laravel, Symfony, CodeIgniter, Zend, Yii và nhiều framework khác nữa. Những công cụ này mang đến vô vàn tính năng hữu ích, giúp việc phát triển ứng dụng web trở nên nhanh chóng và dễ dàng hơn bao giờ hết. Tuy nhiên, đối với những người mới bắt đầu học PHP, việc tiếp cận các framework lớn thường là một thử thách không nhỏ. Các khái niệm phức tạp và hệ thống tính năng đồ sộ đôi khi có thể khiến họ cảm thấy choáng ngợp, thậm chí làm giảm hứng thú học tập. Bản thân tôi cũng từng trải qua cảm giác này khi lần đầu làm quen với [Laravel](https://laravel.com). Với một người mới như tôi thời điểm đó, Laravel dường như là một thế giới đầy "phép thuật" khó hiểu và đòi hỏi nhiều nỗ lực để chinh phục. +Ngoài kia, có rất nhiều framework PHP mạnh mẽ như Laravel, Symfony, CodeIgniter, Zend, Yii và nhiều +framework khác nữa. Những công cụ này mang đến vô vàn tính năng hữu ích, giúp việc phát triển ứng +dụng web trở nên nhanh chóng và dễ dàng hơn bao giờ hết. Tuy nhiên, đối với những người mới bắt đầu +học PHP, việc tiếp cận các framework lớn thường là một thử thách không nhỏ. Các khái niệm phức tạp +và hệ thống tính năng đồ sộ đôi khi có thể khiến họ cảm thấy choáng ngợp, thậm chí làm giảm hứng thú +học tập. Bản thân tôi cũng từng trải qua cảm giác này khi lần đầu làm quen với +[Laravel](https://laravel.com). Với một người mới như tôi thời điểm đó, Laravel dường như là một thế +giới đầy "phép thuật" khó hiểu và đòi hỏi nhiều nỗ lực để chinh phục. Vào đầu năm 2025, khi bước vào học kỳ mới, tôi có cơ hội tham gia một môn học rất thú vị mang tên "Lập trình Web và Ứng dụng nâng cao". Một trong những yêu cầu quan trọng của môn học là xây dựng một ứng dụng web PHP thuần túy (Pure PHP) theo mô hình MVC mà không được sử dụng bất kỳ framework lớn nào như Laravel. Đây là một bài tập có ý nghĩa nhằm giúp chúng tôi hiểu rõ cách -các thành phần của ứng dụng web hoạt động từ gốc rễ. Nhận thấy đây là cơ hội tuyệt vời để học hỏi và thử nghiệm, tôi đã quyết định bắt tay vào phát triển `phpure` — **một framework PHP đơn giản, gọn nhẹ nhưng đủ mạnh mẽ** để hỗ trợ người mới bắt đầu dễ dàng nắm bắt cách xây dựng ứng dụng web theo mô hình MVC. +các thành phần của ứng dụng web hoạt động từ gốc rễ. Nhận thấy đây là cơ hội tuyệt vời để học hỏi và +thử nghiệm, tôi đã quyết định bắt tay vào phát triển `phpure` — **một framework PHP đơn giản, gọn +nhẹ nhưng đủ mạnh mẽ** để hỗ trợ người mới bắt đầu dễ dàng nắm bắt cách xây dựng ứng dụng web theo +mô hình MVC. -Tôi là [Mai Trần Tuấn Kiệt](https://github.com/mttk2004), một sinh viên chuyên ngành Phát triển Web, và `phpure` chính là dự án mã nguồn mở đầu tay của tôi. Tôi rất vui mừng được chia sẻ dự án này với cộng đồng. +Tôi là [Mai Trần Tuấn Kiệt](https://github.com/mttk2004), một sinh viên chuyên ngành Phát triển Web, +và `phpure` chính là dự án mã nguồn mở đầu tay của tôi. Tôi rất vui mừng được chia sẻ dự án này với +cộng đồng. Điều đặc biệt ở `phpure` là nó **được thiết kế hướng đến đối tượng người mới học**. Framework này mang tính đơn giản, trực quan, dễ hiểu và dễ sử dụng. Nếu bạn đang tìm hiểu về PHP hoặc muốn hiểu cách hoạt động của một ứng dụng web theo mô hình MVC, `phpure` chắc chắn sẽ là một công cụ hữu ích. Hơn nữa, nếu sau này bạn có ý định học các framework lớn như Laravel, việc hiểu rõ cách vận hành của `phpure` sẽ giúp bạn có nền tảng vững chắc để tiếp cận những khái niệm nâng cao hơn. -Thật vậy, `phpure` được **lấy cảm hứng từ cấu trúc của Laravel** nhưng được tối giản hóa để phù hợp hơn với những người mới bắt đầu. Là một người yêu thích Laravel, tôi đã cố gắng mang những yếu tố tinh tế nhất của framework này vào `phpure` để mang đến trải nghiệm học tập và lập trình tốt nhất. +Thật vậy, `phpure` được **lấy cảm hứng từ cấu trúc của Laravel** nhưng được tối giản hóa để phù hợp +hơn với những người mới bắt đầu. Là một người yêu thích Laravel, tôi đã cố gắng mang những yếu tố +tinh tế nhất của framework này vào `phpure` để mang đến trải nghiệm học tập và lập trình tốt nhất. Không chỉ giới hạn ở các ứng dụng web đơn giản, `phpure` còn có **khả năng mở rộng và tùy chỉnh linh hoạt** để phù hợp với nhu cầu phát triển của bạn. Tôi tin rằng, với một công cụ như `phpure`, @@ -44,7 +58,7 @@ Hãy thử khám phá `phpure` ngay hôm nay và cùng nhau tạo nên những ## **Bắt Đầu** ⛹️ -### **1. Cài Đặt** 📥 +### **1. Cài đặt** 📥 #### **Yêu cầu hệ thống** @@ -74,7 +88,7 @@ Sau khi hoàn thành bước này, bạn đã sẵn sàng tiếp tục với cá --- -### **2. Cấu Hình** ⚙️ +### **2. Cấu hình** ⚙️ Để `phpure` hoạt động chính xác, bạn cần thực hiện một số bước cấu hình cơ bản sau khi tải mã nguồn. @@ -138,7 +152,7 @@ Phinx là một phần quan trọng trong việc quản lý cơ sở dữ liệu Hoàn thành các bước trên, bạn đã sẵn sàng để bắt đầu hành trình phát triển với `phpure`! 🚀 -### **3. Cấu Trúc Thư Mục** 📂 +### **3. Cấu trúc thư mục** 📂 Tiếp theo, hãy tìm hiểu cấu trúc thư mục của `phpure` để hiểu rõ hơn về cách tổ chức và quản lý dự án. @@ -280,7 +294,7 @@ Tại thờ điểm này, có thể cấu trúc thư mục của `phpure` vẫn Để thực sự hiểu rõ và tận dụng tối đa `phpure`, bạn cần hiểu rõ một số khái niệm cơ bản và cách hoạt động của framework. Đầu tiên là **vòng đời của request**. -### **1. Luồng hoạt động của framework và mô hình MVC - Vòng đời của request** +### **1. Luồng hoạt động và Mô hình MVC - Vòng đời của request** 🔄 `phpure` hoạt động dựa trên mô hình MVC (Model-View-Controller), một kiến trúc phổ biến trong phát triển web giúp tách biệt rõ ràng các phần của ứng dụng. **Model** chịu trách nhiệm quản lý dữ @@ -297,35 +311,103 @@ hoạt động của framework. Đầu tiên là **vòng đời của request**. #### **Router phân tích request:** - Sau khi khởi động, router chịu trách nhiệm ánh xạ URL từ request đến các route được định nghĩa trước trong file `routes.php`. Router kiểm tra xem URL yêu cầu có khớp với bất kỳ route nào đã đăng ký không. Nếu không tìm thấy, nó sẽ trả về lỗi 404. + Sau khi khởi động, router chịu trách nhiệm ánh xạ URL từ request đến các route được định nghĩa + trước trong file `routes.php`. Router kiểm tra xem URL yêu cầu có khớp với bất kỳ route nào đã + đăng ký không. Nếu không tìm thấy, nó sẽ trả về lỗi 404. #### **Xử lý middleware:** Trước khi router gọi controller, middleware được kích hoạt nếu như route có gắn middlware. - Middleware là các lớp xử lý trung gian, dùng để kiểm tra hoặc thay đổi request trước khi chuyển tiếp. Ví dụ, middleware có thể kiểm tra xem người dùng đã đăng nhập chưa (auth) hoặc đảm bảo rằng chỉ khách chưa đăng nhập mới có thể truy cập một số trang nhất định (guest). Nếu middleware phát hiện lỗi, request sẽ bị dừng lại và trả về phản hồi ngay tại đó. + Middleware là các lớp xử lý trung gian, dùng để kiểm tra hoặc thay đổi request trước khi chuyển + tiếp. Ví dụ, middleware có thể kiểm tra xem người dùng đã đăng nhập chưa (auth) hoặc đảm bảo rằng + chỉ khách chưa đăng nhập mới có thể truy cập một số trang nhất định (guest). Nếu middleware phát + hiện lỗi, request sẽ bị dừng lại và trả về phản hồi ngay tại đó. #### **Gọi controller:** - Sau khi vượt qua middleware, router gọi controller được chỉ định cùng với action (phương thức cụ thể). Controller nhận các thông tin từ request, xử lý logic nghiệp vụ, và chuẩn bị dữ liệu để truyền cho View. Ví dụ, một controller có thể lấy dữ liệu người dùng từ cơ sở dữ liệu hoặc kiểm tra điều kiện nghiệp vụ trước khi tiếp tục. + Sau khi vượt qua middleware, router gọi controller được chỉ định cùng với action (phương thức cụ + thể). Controller nhận các thông tin từ request, xử lý logic nghiệp vụ, và chuẩn bị dữ liệu để + truyền cho View. Ví dụ, một controller có thể lấy dữ liệu người dùng từ cơ sở dữ liệu hoặc kiểm + tra điều kiện nghiệp vụ trước khi tiếp tục. #### **Kết nối với View thông qua Twig:** Sau khi xử lý, controller thường kết thúc bằng việc gọi một template để hiển thị giao diện. `phpure` sử dụng Twig, một công cụ template mạnh mẽ, để kết hợp dữ liệu từ controller và các - template HTML đã định nghĩa. Twig cung cấp nhiều tính năng hữu ích như vòng lặp, kiểm tra điều kiện, và kế thừa layout, giúp việc xây dựng giao diện dễ dàng và linh hoạt. + template HTML đã định nghĩa. Twig cung cấp nhiều tính năng hữu ích như vòng lặp, kiểm tra điều + kiện, và kế thừa layout, giúp việc xây dựng giao diện dễ dàng và linh hoạt. #### **Trả về response:** - Sau khi Twig tạo ra giao diện hoàn chỉnh (HTML), framework gửi nội dung đó trở lại trình duyệt dưới dạng response. Người dùng sẽ thấy trang web được hiển thị, hoàn chỉnh với dữ liệu đã được xử lý từ controller. + Sau khi Twig tạo ra giao diện hoàn chỉnh (HTML), framework gửi nội dung đó trở lại trình duyệt + dưới dạng response. Người dùng sẽ thấy trang web được hiển thị, hoàn chỉnh với dữ liệu đã được + xử lý từ controller. #### **Tóm lại** Vòng đời của một request trong `phpure` bao gồm các bước từ tiếp nhận URL, phân tích và ánh xạ -route, kiểm tra middleware, xử lý logic trong controller, và cuối cùng là render giao diện thông qua Twig. Kiến trúc MVC đảm bảo mỗi phần của ứng dụng có nhiệm vụ rõ ràng, giúp mã nguồn dễ hiểu, dễ bảo trì và mở rộng. Với luồng hoạt động mạch lạc này, ngay cả người mới bắt đầu cũng có thể nhanh chóng hiểu được cách ứng dụng hoạt động và bắt tay vào phát triển các tính năng mới. +route, kiểm tra middleware, xử lý logic trong controller, và cuối cùng là render giao diện thông +qua Twig. Kiến trúc MVC đảm bảo mỗi phần của ứng dụng có nhiệm vụ rõ ràng, giúp mã nguồn dễ hiểu, +dễ bảo trì và mở rộng. Với luồng hoạt động mạch lạc này, ngay cả người mới bắt đầu cũng có thể +nhanh chóng hiểu được cách ứng dụng hoạt động và bắt tay vào phát triển các tính năng mới. Tôi khuyên bạn nên đọc qua mã nguồn của `phpure` để hiểu rõ hơn về cách hoạt động của framework. Đây là cách tốt nhất để học hỏi và nắm vững kiến thức. +### **2. Các chức năng cốt lõi** 🎯 + +#### **Routing** + +Routing là một phần quan trọng trong việc xác định cách ứng dụng xử lý các yêu cầu từ người dùng. +`phpure` sử dụng router để ánh xạ URL đến các controller và action tương ứng. Tất cả các route của +ứng dụng được định nghĩa trong file `app/routes.php`. Để định nghĩa một route, bạn +cần chỉ định URL, phương thức HTTP, controller và action tương ứng. Dưới đây là một ví dụ: + +```php +get('', ['HomeController', 'index']); // Thêm dòng này + +$router->dispatch(); +``` + +Khi dòng `$router->get('', ['HomeController', 'index']);` được thêm vào, nó sẽ ánh xạ URL rỗng +(`/`) đến phương thức `index` của controller `HomeController`. Điều này có nghĩa +là khi người dùng truy cập trang chủ của ứng dụng, controller `HomeController` sẽ được gọi và +phương thức `index` sẽ được thực thi. + +Một số phương thức routing phổ biến khác được tích hợp trong `phpure` bao gồm `post`, `put`, +`patch`, `delete`, ... để xử lý các HTTP request khác nhau. `phpure` cũng hỗ trợ định nghĩa route +với tham số động, giúp xử lý các URL động một cách dễ dàng. Ví dụ `'/posts/{id}'` sẽ ánh xạ +URL `/posts/1`, `/posts/2`, ... đến cùng một controller và action nhưng với tham số `id` khác nhau, +để bạn truy xuất dữ liệu dựa trên tham số đó. Xem ví dụ dưới đây: + +```php +$router->get('/posts/{id}', ['PostController', 'show']); +``` + +Với route này, URL `/posts/1` sẽ gọi phương thức `show` của controller `PostController` và truyền +tham số `1` vào phương thức đó. + +Ngoài ra, router còn hỗ trợ middleware, middleware ngăn chặn hoặc xử lý yêu cầu trước khi chúng +đến controller. Điều này giúp bạn kiểm tra quyền truy cập, xác thực người dùng, hoặc thực hiện các +tác vụ trước khi xử lý logic chính. Ví dụ: + +```php +$router->get('/admin', ['AdminController', 'index'], ['auth']); +``` + +Trong đoạn mã trên, middleware `auth` sẽ được kích hoạt trước khi yêu cầu đến controller +`AdminController`. Middleware này có thể kiểm tra xem người dùng đã đăng nhập chưa, nếu chưa sẽ +chuyển hướng người dùng đến trang đăng nhập. Nếu đã đăng nhập, yêu cầu sẽ được chuyển tiếp đến +controller để xử lý. + --- _Last updated: January 14, 2025_ diff --git a/app/routes.php b/app/routes.php index 44b9f53..cbc12e9 100644 --- a/app/routes.php +++ b/app/routes.php @@ -2,16 +2,10 @@ use Core\Http\Router; + $router = new Router(); // TODO: Define routes here -$router->get('', ['HomeController', 'index']); -$router->get('about', ['HomeController', 'about'])->middleware('auth'); -$router->get('users', ['UserController', 'register']); -$router->post('users/store', ['UserController', 'store']); -$router->get('login', ['HomeController', 'login'])->middleware('guest'); -$router->post('files/upload', ['FileController', 'upload']); -$router->get('files/delete/{filename}', ['FileController', 'delete']); -$router->get('files', ['FileController', 'listFiles']); + $router->dispatch();