Laravel: Yêu cầu về vòng đời (Request Lifecycle)
Giới thiệu
Khi sử dụng bất kỳ công cụ nào trong “thế giới thực”, bạn cảm thấy tự tin hơn nếu bạn hiểu cách thức hoạt động của công cụ đó. Phát triển ứng dụng không có gì khác biệt. Khi bạn hiểu các công cụ phát triển của mình hoạt động như thế nào, bạn sẽ cảm thấy thoải mái và tự tin hơn khi sử dụng chúng.
Mục tiêu của tài liệu này là cung cấp cho bạn một cái nhìn tổng quan tốt, ở cấp độ cao về cách hoạt động của framework Laravel. Bằng cách hiểu rõ hơn về framework tổng thể, mọi thứ cảm thấy bớt "ảo diệu" hơn và bạn sẽ tự tin hơn khi xây dựng các ứng dụng của mình. Nếu bạn không hiểu tất cả các thuật ngữ ngay lập tức, đừng ngại! Chỉ cần cố gắng nắm bắt cơ bản về những gì đang diễn ra và kiến thức của bạn sẽ phát triển khi bạn khám phá các phần khác của tài liệu.
Tổng quan về vòng đời
Những bước đầu tiên
Điểm đầu vào cho tất cả các yêu cầu đối với ứng dụng Laravel là file public/index.php
. Tất cả các yêu cầu được chuyển hướng đến tệp này bởi cấu hình máy chủ web (Apache/Nginx) của bạn. File index.php
không chứa nhiều code. Đúng hơn, nó là một điểm khởi đầu để tải phần còn lại của framework.
File index.php
tải Composer tạo định nghĩa trình tải tự động, và sau đó lấy một thể hiện của ứng dụng Laravel từ bootstrap/app.php
. Hành động đầu tiên do chính Laravel thực hiện là tạo một thể hiện của vùng ứng dụng / bộ chứa dịch vụ.
Nhân HTTP/Console
Tiếp theo, yêu cầu đến sẽ được gửi đến nhân HTTP hoặc nhân giao diện Console, tùy thuộc vào loại yêu cầu đang nhập vào ứng dụng. Hai nhân này đóng vai trò là vị trí trung tâm mà tất cả các yêu cầu đều chạy qua. Hiện tại, chúng ta hãy chỉ tập trung vào nhân HTTP, được đặt trong app/Http/Kernel.php
.
Nhân HTTP mở rộng từ lớp Illuminate\Foundation\Http\Kernel
, lớp này định nghĩa một mảng các bootstrappers
sẽ được chạy trước khi yêu cầu được thực thi. Các bootstrappers này định cấu hình xử lý lỗi, cấu hình ghi nhật ký, phát hiện môi trường ứng dụng và thực hiện các tác vụ khác cần được thực hiện trước khi yêu cầu thực sự được xử lý. Thông thường, các lớp này xử lý cấu hình Laravel nội bộ mà bạn không cần phải lo lắng.
Nhân HTTP cũng xác định danh sách Middleware HTTP mà tất cả các yêu cầu phải truyền qua trước khi được ứng dụng xử lý. Các phần mềm trung gian này xử lý việc đọc và ghi phiên HTTP, xác định xem ứng dụng có đang ở chế độ bảo trì hay không, xác minh mã thông báo CSRF và hơn thế nữa. Chúng tôi sẽ nói thêm về những điều này sau.
Chữ ký phương thức cho phương thức handle
của nhân HTTP khá đơn giản: nó nhận một Request
và trả về một Response
. Hãy coi kernel như một hộp đen lớn đại diện cho toàn bộ ứng dụng của bạn. Cung cấp cho nó các yêu cầu HTTP và nó sẽ trả về các phản hồi HTTP.
Các nhà cung cấp dịch vụ
Một trong những hành động khởi động kernel quan trọng nhất là tải các nhà cung cấp dịch vụ cho ứng dụng của bạn. Tất cả các nhà cung cấp dịch vụ cho ứng dụng được định cấu hình trong mảng config/app.php
của tệp cấu hình providers
.
Laravel sẽ duyệt qua danh sách các nhà cung cấp này và khởi tạo từng nhà cung cấp đó. Sau khi khởi tạo các nhà cung cấp, phương thức register
này sẽ được gọi trên tất cả các nhà cung cấp. Sau đó, khi tất cả các nhà cung cấp đã được đăng ký, phương thức boot
sẽ được gọi trên mỗi nhà cung cấp. Điều này là do các nhà cung cấp dịch vụ có thể phụ thuộc vào mọi ràng buộc vùng chứa được đăng ký và khả dụng vào thời điểm phương thức boot
của chúng được thực thi.
Các nhà cung cấp dịch vụ chịu trách nhiệm khởi động tất cả các thành phần khác nhau của framework, chẳng hạn như cơ sở dữ liệu, hàng đợi, xác thực và các thành phần định tuyến (route). Về cơ bản, mọi tính năng chính do Laravel cung cấp đều được khởi động và cấu hình bởi nhà cung cấp dịch vụ. Vì chúng khởi động và cấu hình rất nhiều tính năng được cung cấp bởi khung công tác, nên các nhà cung cấp dịch vụ là khía cạnh quan trọng nhất của toàn bộ quy trình khởi động Laravel.
Routing (Định tuyến)
Một trong những nhà cung cấp dịch vụ quan trọng nhất trong ứng dụng của bạn là App\Providers\RouteServiceProvider
. Nhà cung cấp dịch vụ này tải các tệp định tuyến có trong thư mục ứng dụng routes
của bạn. Hãy tiếp tục mở mã RouteServiceProvider
và xem nó hoạt động như thế nào!
Sau khi ứng dụng đã được khởi động và tất cả các nhà cung cấp dịch vụ đã được đăng ký, ứng dụng Request
sẽ được giao cho bộ định tuyến để gửi. Bộ định tuyến sẽ gửi yêu cầu đến một route hoặc controller, cũng như chạy bất kỳ middleware cụ thể nào của route.
Middleware cung cấp một cơ chế thuận tiện để lọc hoặc kiểm tra các yêu cầu HTTP đi vào ứng dụng của bạn. Ví dụ: Laravel bao gồm một middleware xác minh xem người dùng ứng dụng của bạn có được xác thực hay không. Nếu người dùng không được xác thực, thì middleware sẽ chuyển hướng người dùng đến màn hình đăng nhập. Tuy nhiên, nếu người dùng được xác thực, middleware sẽ cho phép yêu cầu tiến sâu hơn vào ứng dụng. Một số middleware được gán cho tất cả các route trong ứng dụng, như những phần mềm được xác định trong thuộc tính $middleware
của nhân HTTP của bạn, trong khi một số phần mềm chỉ được gán cho các route hoặc nhóm route cụ thể. Bạn có thể tìm hiểu thêm về middleware bằng cách đọc tài liệu đầy đủ về middleware.
Nếu yêu cầu đi qua tất cả middleware được chỉ định của route phù hợp, phương thức route hoặc controller sẽ được thực thi và phản hồi do route hoặc phương thức controller trả về sẽ được gửi lại thông qua chuỗi middleware của route.
Kết thúc
Sau khi phương thức route hoặc controller trả về một phản hồi, phản hồi sẽ truyền ngược ra ngoài thông qua middleware của route, tạo cơ hội cho ứng dụng sửa đổi hoặc kiểm tra phản hồi gửi đi.
Cuối cùng, khi phản hồi quay trở lại qua middleware, phương thức handle
của nhân HTTP sẽ trả về đối tượng phản hồi và file index.php
gọi phương thức send
trên phản hồi được trả về. Phương thức send
gửi nội dung đáp ứng với trình duyệt web của người dùng. Đến đây ta đã kết thúc (hoành thành) hành trình của mình trong toàn bộ vòng đời yêu cầu Laravel!
Tập trung vào các nhà cung cấp dịch vụ
Các nhà cung cấp dịch vụ thực sự là chìa khóa để khởi động ứng dụng Laravel. Phiên bản ứng dụng được tạo, các nhà cung cấp dịch vụ được đăng ký và yêu cầu được chuyển đến ứng dụng khởi động. Nó thực sự đơn giản!
Việc nắm chắc cách một ứng dụng Laravel được xây dựng và khởi động thông qua các nhà cung cấp dịch vụ là rất có giá trị. Các nhà cung cấp dịch vụ mặc định cho ứng dụng của bạn được lưu trữ trong thư mục app/Providers
.
Theo mặc định, AppServiceProvider
là khá trống. Nhà cung cấp này là một nơi tuyệt vời để thêm liên kết vùng chứa dịch vụ và khởi động ứng dụng của riêng bạn. Đối với các ứng dụng lớn, bạn có thể muốn tạo một số nhà cung cấp dịch vụ, mỗi nhà cung cấp dịch vụ có cấu trúc khởi động chi tiết hơn cho các dịch vụ cụ thể được ứng dụng của bạn sử dụng.