Skip to content

Commit

Permalink
docs(guide): add Routing functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
mttk2004 committed Jan 14, 2025
1 parent 41d5829 commit 4198178
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 23 deletions.
112 changes: 97 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
`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`,
Expand All @@ -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**

Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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 hình MVC - Vòng đời của request**
### **1. Luồng hoạt động và 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ữ
Expand All @@ -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
<?php

use Core\Http\Router;


$router = new Router();

// TODO: Define routes here
$router->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_
10 changes: 2 additions & 8 deletions app/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();

0 comments on commit 4198178

Please sign in to comment.