Laravel không đơn giản chỉ là một bộ sưu tập các thư viện; nó là một hệ sinh thái được thiết kế cực kỳ chặt chẽ dựa trên các Design Patterns kinh điển.
#1. Service Container & IoC: Trái tim hệ thống
Laravel sử dụng Service Container như một trung tâm điều phối sự phụ thuộc (IoC).
- Auto-wiring: Laravel không yêu cầu bạn phải cấu hình từng class. Khi bạn type-hint một class trong Controller, Laravel tự động gọi Reflection API để soi constructor, tìm các class phụ thuộc và khởi tạo chúng đệ quy.
- Singleton vs Bind:
singletonđảm bảo một object được giữ trong suốt vòng đời request, trong khibindtạo mới mỗi lần resolve.
#2. Pipeline Pattern: Middleware là “chuỗi lồng nhau”
Middleware không chạy song song, nó chạy lồng nhau theo Onion Model.
Laravel dùng Illuminate\Pipeline\Pipeline. Bên dưới sử dụng array_reduce để tạo ra một chuỗi closure:
// Logic mô phỏng
$pipeline = array_reduce(array_reverse($pipes), function ($next, $pipe) {
return function ($request) use ($next, $pipe) {
return $pipe->handle($request, $next);
};
}, $destination);
#3. Micro-Kernel & Providers
Laravel có kiến trúc Micro-Kernel. Bản thân Framework chỉ có 1 kernel cực nhẹ, mọi chức năng khác (Database, Auth, Cache) đều được “cắm” vào qua Service Providers. Đây là lý do bạn có thể loại bỏ hoàn toàn các provider không dùng đến để làm nhẹ ứng dụng.
#4. Quizz phỏng vấn Senior
Q: Reflection API có ảnh hưởng tới hiệu năng không?
A: Rất nhiều! Đó là lý do Laravel có lệnh php artisan optimize hoặc event:cache. Nó biên dịch các kết nối trong container hoặc event mapping thành mảng PHP thuần, loại bỏ việc Reflection tại runtime.
Q: Tại sao phải tách Register và Boot trong Provider?
A: register chỉ được phép dùng để bind, không được dùng các service khác vì chúng có thể chưa sẵn sàng. boot chỉ chạy sau khi mọi service đã được đăng ký, an toàn để gọi bất kỳ dịch vụ nào.
#5. Kết luận
Xây dựng một framework giống Laravel chính là học cách quản lý Dependency và Request Flow. Hãy bắt đầu bằng việc thử bind các interface vào container thay vì class cụ thể, bạn sẽ hiểu ngay giá trị của IoC.