Khi sử dụng bất kỳ công cụ nào trong thế giới thực, bạn sẽ 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 cũng không có gì khác. Khi bạn hiểu cách hoạt động của các công cụ phát triển, bạn sẽ cảm thấy thoải mái và tự tin hơn khi sử dụng các công cụ đó.
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 về cách thức hoạt động của Laravel framework. Bằng cách hiểu rõ về tổng quan của framework, mọi thứ sẽ bớt "magic" hơn và bạn sẽ tự tin hơn khi xây dựng ứng dụng của bạn. Nếu bạn không hiểu tất cả, thì cũng đừng nản lòng! Chỉ cần cố gắng nắm bắt cơ bản 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.
Điểm vào đầu tiên cho tất cả các request tới application Laravel là file public/index.php. Tất cả các request được điều hướng đến file này theo cấu hình web server (Apache / Nginx) của bạn. File index.php không chứa nhiều code. Thay vào đó, nó là nơi khởi đầu để load các phần còn lại của framework.
File index.php sẽ load các định nghĩa từ Composer generated autoloader, và sau đó lấy instance application Laravel từ bootstrap/app.php. Sau đó, là thực hiện tạo một instance của application / service container.
Tiếp theo, request sẽ được gửi đến HTTP kernel hoặc console kernel, sử dụng các phương thức handleRequest hoặc handleCommand của instance application, tùy thuộc vào loại request đi vào application. Hai kernel này đóng vai trò là vị trí trung tâm mà qua đó tất cả các request đều phải đi qua. Hiện tại, chúng ta hãy tập trung vào HTTP kernel, là một instance của Illuminate\Foundation\Http\Kernel.
HTTP kernel định nghĩa một danh sách bootstrappers sẽ được chạy trước khi request được xử lý. Các bootstrappers này sẽ cấu hình xử lý lỗi, cấu hình logging, xác định môi trường của application, và thực hiện các tác vụ khác cần được thực hiện trước khi request thực sự được xử lý. Thông thường, các class này xử lý cấu hình nội bộ tring Laravel mà bạn không cần phải lo lắng.
HTTP kernel cũng chịu trách nhiệm chuyển request qua middleware stack của ứng dụng. Các middleware này sẽ xử lý việc đọc ghi HTTP session, kiểm tra nếu application đang ở trong chế độ maintenance, kiểm tra CSRF token, và hơn thế nữa. Chúng ta sẽ nói thêm về những điều này sớm.
Cấu trúc của phương thức handle trong HTTP kernel khá đơn giản: nó nhận vào một Request và trả về một Response. Hãy nghĩ đơn giản Kernel như là một hộp đen chứa toàn bộ code xử lý của application của bạn. Cung cấp cho nó một HTTP request và nó sẽ trả về một HTTP response.
Một trong những hành động khởi động Kernel quan trọng nhất là load các service providers cho application của bạn. Các service provider 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 routing.
Laravel sẽ lặp danh sách của các provider này và khởi tạo từng provider một trong số họ. Sau khi khởi tạo các provider, phương thức register sẽ được gọi trên tất cả các provider đó. Và sau đó, khi tất cả các provider đã được đăng ký, phương thức boot sẽ được gọi trên mỗi provider. Điều này là do các service provider có thể phụ thuộc vào các liên kết container đang được đăng ký và khả dụng vào thời điểm phương thức boot của nó được thực thi.
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 service provider. Vì nó khởi động và cấu hình rất nhiều tính năng được cung cấp bởi framework, nên các service provider là khía cạnh quan trọng nhất của toàn bộ quy trình khởi động Laravel.
Mặc dù bên trong framework có sử dụng hàng chục service provider, nhưng bạn cũng có tùy chọn để tạo service provider của riêng mình. Bạn có thể tìm thấy danh sách các service provider dành cho người dùng định nghĩa hoặc dành cho bên thứ ba mà ứng dụng của bạn đang sử dụng trong file bootstrap/providers.php.
Khi application đã được khởi động và tất cả các service providers đã được đăng ký, Request sẽ được gửi đến router để được gửi đi. Route sẽ gửi request đến một route hoặc controller khác, cũng như chạy bất kỳ middleware nào nếu cần thiết.
Middleware cung cấp một cơ chế thuận tiện để lọc hoặc kiểm tra các request HTTP đi vào ứng dụng của bạn. Ví dụ: Laravel có chứa một middleware dùng để xác minh xem người dùng ứng dụng của bạn có được xác thực hay chưa. Nếu người dùng chưa được xác thực, 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 request tiến sâu hơn vào ứng dụng của bạn. Một số middleware được gán cho tất cả các route trong ứng dụng, giống như PreventRequestsDuringMaintenance, trong khi một số middleware khác chỉ được gán cho một số route hoặc nhóm route cụ thể. Bạn có thể tìm hiểu thêm về các middleware này bằng cách đọc tài liệu middleware đầy đủ.
Nếu request được pass qua tất cả middleware được chỉ định cho route đó, phương thức route hoặc controller sẽ được thực thi và response 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.
Sau khi phương thức route hoặc controller trả về một response, thì response đó sẽ được truyền ngược ra ngoài thông qua middleware của route, tạo ra cơ hội cho phép ứng dụng của bạn sửa hoặc kiểm tra trước khi response được gửi đi.
Cuối cùng, sau khi response quay trở lại thông qua middleware, phương thức handle của HTTP kernel sẽ trả về đối tượng response đó cho phương thức handleRequest của instance application, và phương thức này gọi phương thức send trên response được trả về. Phương thức send sẽ gửi nội dung của response đến trình duyệt web của người dùng. Chúng ta đã hoàn thành hành trình của mình trong toàn bộ vòng đời request của Laravel!
Service provider là chìa khóa để khởi động một apllication Laravel. Đầu tiên, instance application sẽ được khởi tạo, sau đó các service provider sẽ được đăng ký và request sẽ được xử lý bởi application đã được khởi tạo. Nó thực sự đơn giản!
Nắm vững cách thức một ứng dụng Laravel được xây dựng và được khởi động thông qua các service providers là rất có giá trị. Các service providers do người dùng định nghĩa cho application của bạn sẽ được lưu trữ trong thư mục app/Providers.
Mặc định, AppServiceProvider là trống. Provider này là một nơi tuyệt vời để thêm phần khởi động dành riêng cho application của bạn và các service container bindings. Đối với các ứng dụng lớn, bạn có thể muốn tạo nhiều service providers, mỗi loại lại có cách khởi động cho các service cụ thể được ứng dụng của bạn sử dụng.
entry