+2

Series Kiến trúc MVC Cơ bản | Bài 2: Vòng đời của một Request - Chuyến du hành từ URL đến màn hình

Chào anh em! Ở Bài 1, chúng ta đã mường tượng MVC giống như một nhà hàng với anh Bồi bàn (Controller), ông Đầu bếp (Model) và Bàn ăn (View).

Nhưng nếu khách hàng cứ đứng ở ngoài cửa nhà hàng thì bồi bàn cũng không biết phục vụ thế nào. Người dùng phải bước vào, gọi món (gửi Request), và nhận lại món ăn (nhận Response). Toàn bộ quá trình từ lúc người dùng gõ phím Enter trên trình duyệt cho đến khi trang web hiện ra được gọi là Vòng đời Request/Response.

Hôm nay, chúng ta sẽ theo chân một Request để xem nó đi qua các tầng MVC như thế nào.

1. Người gác cổng thầm lặng: Router (Định tuyến)

Trước khi chạm đến MVC, có một thành phần cực kỳ quan trọng mà framework nào cũng phải có: Router.

Router giống như cô lễ tân đứng ở cửa nhà hàng. Khi người dùng gõ URL https://ten-website.com/users/1, cô lễ tân này sẽ nhìn vào địa chỉ đó và dò trong sổ tay (file routes) xem ai là người phụ trách phục vụ.

// Ví dụ trong file routes/web.php
Route::get('/users/{id}', [UserController::class, 'show']);

Dòng code trên nghĩa là: "Cô lễ tân ơi, nếu có khách yêu cầu đường dẫn /users/1, hãy giao cho anh bồi bàn tên là UserController, bảo anh ấy thực hiện nhiệm vụ show nhé."

2. Luồng chạy 6 bước kinh điển

Khi Request đã vượt qua cửa Router, chuyến du hành qua MVC chính thức bắt đầu theo thứ tự sau:

Bước 1: Controller tiếp nhận Request

Hàm show($id) trong UserController được gọi. Controller lúc này nhận được cái ID (ví dụ ID = 1) mà người dùng truyền lên. Nó bắt đầu phân tích: "À, khách này muốn xem thông tin của User có ID là 1".

Bước 2: Controller "nhờ vả" Model

Controller không tự ý bới móc database. Nó gọi ông đầu bếp UserModel và ra lệnh: "Lấy cho tôi dữ liệu của User số 1".

Bước 3: Model chọc xuống Database

UserModel dịch yêu cầu đó thành câu lệnh SQL (SELECT * FROM users WHERE id = 1) và gửi thẳng xuống hệ quản trị cơ sở dữ liệu (MySQL, PostgreSQL...).

Bước 4: Database trả kết quả cho Model

Database tìm thấy dữ liệu (ví dụ: Tên là Hiếu, Email là hieu@example.com) và trả về. Model đóng gói đống dữ liệu thô này thành một Object (đối tượng) gọn gàng rồi ném ngược lại cho Controller.

Bước 5: Controller "nhồi" dữ liệu vào View

Anh bồi bàn Controller sau khi nhận được món ăn từ đầu bếp (Model), anh ta mang món ăn đó đặt lên chiếc đĩa trang trí tuyệt đẹp là View.

// Controller bưng dữ liệu $user ra View tên là 'profile'
return view('profile', ['user' => $userData]);

Bước 6: Trả Response về cho trình duyệt (Hoàn tất)

View sẽ trộn mã HTML tĩnh kết hợp với dữ liệu động (Tên, Email) để biên dịch thành một trang HTML hoàn chỉnh. Cuối cùng, trang HTML này (Response) được gửi ngược lại qua Internet, hiển thị lên màn hình trình duyệt của người dùng.

3. Tại sao phải đi luồng phức tạp như vậy?

Nhiều anh em mới học thắc mắc: "Tại sao không cho thẳng file View kết nối database lấy dữ liệu cho lẹ, đi lòng vòng mất thời gian?"

Hãy nhớ lại nguyên lý Separation of Concerns (Tách biệt mối quan tâm). Giả sử dự án của anh em ban đầu chỉ có giao diện Web (trả về View HTML). Nửa năm sau, công ty làm thêm App Mobile. App Mobile không đọc được giao diện HTML, nó chỉ cần chuỗi dữ liệu JSON thô.

Nhờ cấu trúc luồng MVC, anh em không cần đụng một chữ nào vào Model hay Database. Anh em chỉ cần viết thêm một cái Controller mới (API Controller), gọi lại cái Model cũ, và ở Bước 5, thay vì trả ra View HTML, anh em trả ra JSON:

return response()->json($userData);

Code được tái sử dụng tối đa, hệ thống mở rộng cực kỳ dễ dàng mà không phá vỡ logic cũ!

Tổng kết Bài 2

Vòng đời Router -> Controller -> Model -> Controller -> View chính là xương sống của mọi Web Framework hiện đại (như Laravel, Spring, Django, Express.js...). Dù sau này anh em có học thêm bao nhiêu công nghệ mới, thì bản chất luồng dữ liệu vào/ra của môi trường Web vẫn luôn hoạt động trên nền tảng này.

Để khép lại series cơ bản này một cách trọn vẹn ở Bài 3, bạn muốn mình viết về chủ đề "Fat Model, Skinny Controller" (Cách chia nhỏ logic nghiệp vụ tránh Controller quá mập) hay một bài thực hành code mẫu xây dựng chức năng CRUD (Thêm/Sửa/Xóa) đơn giản chuẩn MVC?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí