Laravel và giải pháp kiến trúc cho ứng dụng quy mô lớn
Maintaining một ứng dụng quy mô lớn chưa bao giờ là dễ dàng. Chúng ta hãy bắt đầu tìm hiểu thiết kế kiến trúc cho các ứng dụng lớn với Laravel.
Thiết kế kiến trúc cho ứng dụng quy mô lớn với Laravel
Laravel là một framework PHP phổ biến nhất hiện nay. Cấu trúc thư mục tốt, cách tổ chức tuyệt vời, được định nghĩa rõ ràng và dễ dàng tiếp cận. Làm việc với với kiến trúc mặc định của Laravel là hoàn toàn tốt đẹp với một ứng dụng nhỏ hoặc vừa. Nhưng khi nó là một ứng dụng lớn với hơn 50 Models khác nhau, chúng ta sẽ bắt đầu cảm thấy "lực bất tòng tâm" khi vật lộn với mớ code của chúng ta.
Maintaining cho một ứng dụng quy mô lớn (ở bất kỳ ngôn ngữ nào) đều không phải là trò đùa, đặc biệt là khi nó không được tổ chức đúng đắn. Cấu trúc mặc định của Laravel chắc chắn không hữu ích lắm trong trường hợp này. Bạn nên nhớ rằng một framework được xây dựng nên sẽ phục vụ cho hầu hết người dùng ở mức độ không quá phức tạp.
Nhưng đầu tiên chúng ta sẽ "mổ xẻ" Laravel mặc định và những gì sẽ xảy ra khi áp dụng cho ứng dụng quy mô lớn.
Cấu trúc mặc định của Laravel tựa như thế này:
|- app/
|- Console/
|- Commands/
|- Events/
|- Exceptions/
|- Http/
|- Controllers/
|- Middleware/
|- Jobs/
|- Listeners/
|- Providers/
|- User.php
|- database/
|- factories/
|- migrations/
|- seeders
|- config/
|- routes/
|- resources/
|- assets/
|- lang/
|- views/
Khá khô thoáng, sạch sẽ phải không nào?
Nhưng khi chúng ta làm việc với các ứng dụng lớn, chúng ta thường áp dụng một số design patterns như Transformer
, Repository
,... và thư mục của chúng ta sẽ trông như thế này:
|- app/
|- Console/
|- Commands/
|- Criteria
|- Events/
|- Exceptions/
|- Http/
|- Controllers/
|- Middleware/
|- Jobs/
|- Listeners/
|- Mails
|- Models/
|- Presenters/
|- Providers/
|- Repositories/
|- Services/
|- Transformers/
|- Validators/
|- Support
|- database/
|- factories/
|- migrations/
|- seeders
|- config/
|- routes/
|- resources/
|- assets/
|- lang/
|- views/
Đây vẫn là một kiến trúc tốt. Chúng ta hãy bắt đầu nhìn vào thư mục Models
.
|- app/
|- Models/
|- User.php
|- Role.php
|- Permission.php
|- Merchant.php
|- Store.php
|- Product.php
|- ProductAttribute.php
|- ProductOption.php
|- Category.php
|- Tag.php
|- Client.php
|- Delivery.php
|- Invoice.php
|- Wallet.php
|- Payment.php
|- Report.php
|- Comment.php
|- Contact.php
|- Page.php
|- StaticBlock.php
|- CustomField.php
|- CustomFieldItem.php
|- Media.php
|- MediaConfig.php
Không tệ. Chúng ta cũng sẽ có thêm các Services
để xử lí các Business Logic. Chúng ta còn có thêm Repositories
, Transformers
, Validators
,... với số lượng tập tin tương tự hoặc hơn nhiều so với Models
. Mỗi lần làm việc với một entity nào đó, bạn sẽ cần mở file tương ứng lên. Với nhiều người, điều đó khá mệt mỏi, nhưng đa số thì cảm thấy bình thường.
Vấn đề không nằm ở việc nhảy qua nhảy lại giữa các thư mục khác nhau, mà là maintaining và liên lạc giữa các Services với nhau.
Chúng ta cùng phân tích code base và tổng hợp lại những gì chúng ta cảm thấy:
- Đây là một ứng dụng nguyên khối
- Hơi gây khó khăn cho các developer khi làm việc với chúng
- Khó khăn khi mở rộng
May mắn là chúng ta đã có một giải pháp - HMVC. Chia các thành phần của ứng dụng thành từng phần nhỏ hơn, nơi mà bên trong chúng gói gọn cấu trúc giống như một ứng dụng Laravel mặc định của bạn.
|- platform/
|- users
|- config/
|- helpers/
|- resources/
|- routes/
|- src/
|- Models/
|- User.php
|- Role.php
|- Permission.php
|- Http
|- Controllers/
|- Requests/
|- ViewComposers
|- Providers/
|- Services/
|- Support/
composer.json
|- customers
|- config/
|- helpers/
|- resources/
|- routes/
|- src/
|- Models/
|- Merchant.php
|- Client.php
|- Delivery.php
|- Http
|- Controllers/
|- Requests/
|- ViewComposers
|- Providers/
|- Services/
|- Support/
composer.json
|- catalog
|- config/
|- helpers/
|- resources/
|- routes/
|- src/
|- Models/
|- Store.php
|- Product.php
|- ProductAttribute.php
|- ProductOption.php
|- Category.php
|- Tag.php
|- Http
|- Controllers/
|- Requests/
|- ViewComposers
|- Providers/
|- Services/
|- Support/
composer.json
|- payments
|- config/
|- helpers/
|- resources/
|- routes/
|- src/
|- Models/
|- Invoice.php
|- Wallet.php
|- Payment.php
|- Report.php
|- Http
|- Controllers/
|- Requests/
|- ViewComposers
|- Providers/
|- Services/
|- Support/
composer.json
...
Thiết kế này có các ưu điểm:
- Chia ứng dụng thành các phần nhỏ hơn, dễ dàng hơn trong quá trình maintaining
- Mỗi modules đảm nhiệm từng nhiệm vụ cụ thể, code trở nên sạch sẽ và dễ hiểu hơn
- Các modules được phân tách rõ ràng và kết nối thông qua composer. Các modules độc lập này có thể dễ dàng chia sẻ cho các dự án khác nhau khi cần thiết.
Nhưng bên cạnh đó cũng sẽ có những nhược điểm như:
- Bạn phải suy nghĩ nhiều hơn về việc giữ độc lập và tránh phụ thuộc lẫn nhau giữa các modules.
- Không thích hợp cho người mới bắt đầu
- Túm lại là nhiều folders hơn =]]~
Trong bài viết kế tiếp, mình sẽ hướng dẫn bạn bắt đầu xây dựng một ứng dụng HMVC với Laravel, và tận dụng sức mạnh của Composer khi quản lí modules.