Hướng dẫn dùng apache lifecycle trong PHP

Lời nói đầu.

Khi sử dụng bất kỳ công cụ nào , chúng ta đều cảm thấy tự tin hơn nếu chúng ta có thể hiểu cách công cụ đó hoạt động. Việc phát triển ứng dụng cũng vậy. Khi bạn hiểu các công cụ phát triển hoạt động như thế nào, bạn cảm thấy thoải mái và tự tin hơn khi sử dụng chúng.

Mục đích của bài viết này là cung cấp cho bạn một cái nhìn tổng quan cách hoạt động của Laravel. Bằng cách có 1 cái nhìn tổng thể hơn,bạn sẽ cảm thấy mọi thứ cảm thấy ít "huyền diệu" hơn và tự tin hơn khi xây dựng các ứng dụng của mình. Ok, Let start !

Lifecycle Overview

First Things

Giống như mọi loại framework khác, mọi request của một ứng dụng Laravel đều được bắt đầu từ file public/index.php. Tất cả các request chuyển đến file này đều được chuyển đến từ Web Server của bạn [Apache / Nginx]. Trong file index.php sẽ không bao gồm nhiều đoạn code . Thay vào đó nó là điểm khởi đầu để loading phần còn lại của framework.

Nhìn vào source code của file này chúng ta sẽ thấy nó sẽ load ra 3 phần :

  • bootstrap/autoload.php ==> Khởi tạo Auto Loader để load ra các package được install từ composer
  • bootstrap/app.php ==> Khợi tạo bộ khung làm việc của framwork bao gồm
    • Http Kernel => xử lý các request từ brower lên server
    • Console Kernel => xử lý các request từ các lệnh comand [Vd : php artisan, php artisan migrate , .v.v....v]
    • ExceptionHandler => xử lý lỗi.
  • Khởi tạo ra Kernel để làm tiếp tục đi tiếp

HTTP / Console Kernels

Tiếp theo, các request sẽ được gửi đến Http Kernel hoặc Console Kernel tùy thuộc vào loại yêu cầu đang cập nhật ứng dụng [Dùng browser hay command]. 2 Kernel này sẽ như là trung tâm điều khiển mà tất cả các yêu cầu sẽ phải đi qua tuy nhiên trong bài viết này chúng ta hãy chỉ tập trung vào tìm hiểu Http Kernel thôi nhé . Vị trí của nó nằm ở app/Http/Kernel.php.

  • Http Kernel được extends từ class Illuminate\Foundation\Http\Kernel. Nó định nghĩa một mảng bootstrapper sẽ được chạy trước khi request được thực thi. Những bootstrappers cấu hình việc xử lý lỗi, cấu hình logs ,phát hiện môi trường ứng dụng [develop, staging, 'production`] 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ý.

  • Http Kernel cũng định nghĩa một danh sách HTTP middleware mà tất cả các request phải đi qua trước khi được ứng dụng xử lý. Các HTTP middleware này xử lý việc đọc và ghi HTTP session, xác định xem ứng dụng có đang ở chế độ bảo trì hay không, xác minh token CSRF và hơn thế nữa.

  • Hãy suy nghĩ về Http Kernel như là một trung tâm điều hành đại diện cho toàn bộ ứng dụng của bạn. Cung cấp cho nó các request HTTP và nó sẽ trả về các response HTTP.

Service Providers

  • Một trong những hành động khởi động hạt nhân quan trọng nhất là tải các Service Providers 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 cấu hình trong config / app.php trong mảng providers. Đầu tiên, phương thức register sẽ được gọi trên tất cả các providers sau đó, khi tất cả cácproviders đã được đăng ký, phương thức boot sẽ được gọi để nap tất cả các providers

  • Các Service Providers chịu trách nhiệm khởi động tất cả các thành phần khác nhau của Framework như : database, queue, validation và các thành phần định tuyến [routing]. Vì chúng khởi động và cấu hình mọi tính năng được cung cấp bởi framework nên Service Providers` là thành phần quan trọng nhất của toàn bộ quá trình khởi động Laravel.

Dispatch Request

Khi ứng dụng đã được khởi động xong và tất cả các Service Providers đã được khởi tạo thành công. Các Request sẽ được đưa đến các bộ định tuyến [ router]. Ở đây, các yêu cầu sẽ được được kiểm tra xem có tồn tại hay không , có cần chạy qua HTTP middleware đặc biệt nào hay không và cuối cùng sẽ được điểu chuyển đến các Controller hoặc router [Các function tự định nghĩ trong router]

Đến đây thì chắc mình không cần viết thêm chúng nó tiếp tục chạy ntn nữa rồi nhỉ, vì ai cũng biết rồi =]] .

Kêt luận.

Ok, vậy là trên đây là mình đã miêu tả vòng đời của request nó như thế nào rồi. Mong rằng bài viết sẽ hữu ích với các bạn. Thank you for read!

Tài liệu tham khảo

//laravel.com/docs/5.4/lifecycle

Bài viết sau nói về vòng đời của một Request trong Laravel 8. Hi vọng bài viết sẽ giúp bạn có thêm cái nhìn tổng quan tốt hơn về kiến trúc của framework tuyệt vời này! Let's dive into the sea!

First step

Điểm bắt đầu của tất cả request trong một ứng dụng Laravel là tệp public / index.php. Tất cả các request được chuyển hướng đến tệp này bởi web server [Apache / Nginx] của bạn. Tệp 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. Cùng xem trong tệp này có gì nhé

require __DIR__.'/../bootstrap/autoload.php';

Đầu tiên, nó sẽ include composer autoload [tệp này sẽ tự động tạo lớp loader cho ứng dụng].

$app = require_once __DIR__.'/../bootstrap/app.php';

Sau đó truy xuất một instance 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 ứng dụng / service container.

HTTP / Console Kernels

Tiếp theo, request sẽ được xử lý bởi kernel. Có hai loại kernel trong Laravel là HTTP kernel và Console kernel. Tùy thuộc vào loại request sẽ được gửi đến kernel nào. Hai kernel này đóng vai trò là vị trí trung tâm mà tất cả các request đều chạy qua. Bây giờ, chúng ta hãy chỉ tập trung vào HTTP kernel, nằm trong app / Http / Kernel.php.

$kernel = $app->make[Illuminate\Contracts\Http\Kernel::class];

$response = $kernel->handle[
    $request = Illuminate\Http\Request::capture[]
];

$response->send[];

$kernel->terminate[$request, $response];

HTTP kernel kế thừa lớp Illuminate\Foundation\Http\Kernel , lớp này định nghĩa một mảng bootstrappers sẽ được chạy trước khi request được thực thi. Các bootstrappers này cấu hình error handling, logging, tìm môi trường của ứng dụng và thực hiện các tác vụ cần thiết khác trước khi request 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.

HTTP kernel cũng xác định danh sách HTTP middleware mà các request phải đi qua trước khi được ứng dụng xử lý. Các middleware này xử lý việc đọc và ghi HTTP session, xác định xem ứng dụng có đang ở chế độ duy trì hay không, xác minh CSRF token,...

Chữ ký của phương thức handle trong HTTP kernel khá đơn giản: nó nhận một Request và trả về một Response.

Service Providers

Một trong những nhiệm vụ quan trọng nhất của kernel bootstrapping là tải các service providers cho ứng dụng. Tất cả service providers cho ứng dụng đều được định cấu hình trong mảng providers của tệp cấu hình config / app.php.

Laravel sẽ duyệt qua danh sách providers này và khởi tạo từng provider. Sau khi khởi tạo các providers, phương thức register sẽ được gọi trên tất cả các providers rồi đến phương thức boot. Bằng cách gọi phương thức register của mọi nhà cung cấp dịch vụ trước, các nhà cung cấp dịch vụ có thể phụ thuộc vào mọi container binding đang được đăng ký và khả dụng vào thời điểm phương thức boot được thực thi.

Service providers chịu trách nhiệm khởi động tất cả các components khác nhau của framework, như database, queue, validation và routing. 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. Do đó, đây là khía cạnh quan trọng nhất của toàn bộ quá trình bootstrap.

Routing

Một trong những service provider quan trọng nhất là App \ Providers \ RouteServiceProvider. Service provider này tải các file route có trong thư mục routes của ứng dụng. Hãy mở code của RouteServiceProvider và xem nó hoạt động như thế nào!

Khi ứng dụng đã được khởi động và tất cả service providers đã được đăng ký, Request sẽ được chuyển đến router để gửi. Router sẽ gửi request đến một route hoặc controller route middleware được chỉ định.

Middleware cung cấp một cơ chế thuận tiện để lọc hoặc kiểm tra các HTTP request gửi đến ứng dụng của bạn. Ví dụ: Laravel include 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, 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 đi sâu hơn vào ứng dụng.

Nếu request đi qua tất cả middleware được chỉ định, phương thức route hoặc controller sẽ được thực thi và gửi lại response thông qua chuỗi middleware của route.

Finishing Up

Khi route hoặc controller trả về một response, response sẽ truyền ngược ra ngoài thông qua middleware, tạo cơ hội cho ứng dụng sửa đổi hoặc kiểm tra response. Cuối cùng, khi response qua middleware, phương thức handle của HTTP kernel sẽ trả về đối tượng response và tệp index.php gọi phương thức send. Phương thức send sẽ gửi response đến trình duyệt web của người dùng. Kết thúc một request lifecycle trong Laravel!

Tài liệu tham khảo

Tham khảo tại //laravel.com/docs/8.x/lifecycle#focus-on-service-providers

Chủ Đề