+1

Series Cấu trúc Modules trong Laravel | Bài 1: Khi MVC truyền thống "hụt hơi" trước dự án lớn

Chào anh em, nếu bạn đang code Laravel, chắc hẳn bạn đã quá quen thuộc với cấu trúc thư mục mặc định: app/Http/Controllers, app/Models, app/Services... Cấu trúc này (MVC) cực kỳ tuyệt vời và gọn gàng cho các dự án vừa và nhỏ.

Tuy nhiên, câu chuyện sẽ hoàn toàn khác khi dự án của bạn phình to ra sau 1-2 năm phát triển. Hãy tưởng tượng bạn đang build một hệ thống lớn (ví dụ: Hệ thống bán vé tự động hoặc một trang thương mại điện tử). Mã nguồn lúc này có thể lên tới hàng trăm Models và Controllers. Việc nhét tất cả vào chung một thư mục sẽ biến project thành một "nồi lẩu thập cẩm", code dính chặt vào nhau và cực kỳ ám ảnh mỗi khi có bug hay cần đập đi xây lại một tính năng.

Trong series này, chúng ta sẽ cùng nhau giải quyết triệt để vấn đề đó bằng Kiến trúc Modules (Modular Architecture) trong Laravel. Ở bài đầu tiên, hãy cùng mổ xẻ xem tại sao chúng ta cần nó và bản chất của Modules là gì.

1. Nỗi đau của cấu trúc thư mục mặc định (Monolithic Structure)

Giả sử hệ thống của bạn có 3 nghiệp vụ chính: Users (Người dùng), Orders (Đơn hàng), và Payments (Thanh toán).

Với cách chia thư mục mặc định của Laravel (chia theo đặc tính kỹ thuật), code của bạn sẽ nằm rải rác như sau:

  • app/Models/User.php, Order.php, Payment.php
  • app/Http/Controllers/UserController.php, OrderController.php, PaymentController.php
  • routes/web.php (chứa hàng trăm route của cả 3 nghiệp vụ trộn lẫn)

Hậu quả là gì?

  1. Thiếu tính gắn kết nghiệp vụ (Low Cohesion): Khi cần sửa logic của tính năng Đơn hàng, bạn phải nhảy qua lại giữa hàng tá thư mục khác nhau (Controllers, Models, Requests, Resources...).
  2. Độ phụ thuộc cao (High Coupling): Controller của Order vô tư gọi trực tiếp Model của Payment. Khi bạn muốn gỡ bỏ hoặc viết lại module Payment, toàn bộ hệ thống Order sẽ "vỡ vụn" theo.
  3. Khó làm việc nhóm (Teamwork Bottleneck): Khi team scale lên nhiều người, việc ai cũng chọc vào chung một file routes/api.php hay app/Providers sẽ dẫn đến những pha merge conflict đi vào lòng đất.

2. Kiến trúc Modules là gì?

Thay vì nhóm các file theo loại kỹ thuật (Controllers ra Controllers, Models ra Models), kiến trúc Modules nhóm các file theo nghiệp vụ (Business Domain).

Mỗi Module sẽ đóng vai trò như một mini-application, độc lập và có đầy đủ các thành phần (Routes, Controllers, Models, Views, Config, Migrations...) của riêng nó.

Cấu trúc mới của chúng ta trông sẽ gọn gàng và phân lập như thế này:

/Modules
    /User
        /Controllers
        /Models
        /Routes
        /Migrations
    /Order
        /Controllers
        /Models
        /Routes
        /Migrations
    /Payment
        /Controllers
        /Models
        /Routes
        /Migrations

3. Lợi ích cực lớn của Modular Architecture

Việc cấu trúc code theo dạng Module mang lại những lợi ích vô giá cho Backend Developer:

  • Dễ dàng bảo trì và mở rộng: Mọi thứ liên quan đến "Payment" đều nằm trong thư mục Modules/Payment. Bạn không cần phải đi bới code khắp project nữa.
  • Encapsulation (Tính đóng gói): Module Order không được phép chọc thẳng vào database của Module Payment. Chúng phải giao tiếp với nhau qua các Service Contracts hoặc Events/Listeners. Điều này giữ cho hệ thống lỏng lẻo (loosely coupled).
  • Bàn đạp để lên Microservices: Nếu một ngày đẹp trời hệ thống chịu tải quá lớn và bạn muốn tách riêng phần Payment ra thành một service độc lập (viết bằng Golang hay Node.js chẳng hạn)? Xin chúc mừng, vì bạn đã chia Module rạch ròi ngay từ đầu, việc bóc tách lúc này dễ dàng hơn bao giờ hết.

Tổng kết

Đừng để cấu trúc mặc định của framework giới hạn tư duy thiết kế hệ thống của bạn. Việc chuyển đổi từ kiến trúc nguyên khối (Monolithic) sang Modules là một bước tiến quan trọng giúp code của bạn "sạch" hơn, dễ thở hơn và chuẩn bị sẵn sàng cho sự tăng trưởng bùng nổ của dự án trong tương lai.

Ở Bài 2, chúng ta sẽ xắn tay áo lên và đi vào thực hành: Setup cấu trúc thư mục Module đầu tiên trong Laravel. Hẹn gặp lại anh em!


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í