Quay lại

Tổng Quan Về Vòng Đời Của Request Trong Laravel Chuyên mục PHP và Laravel    2024-05-01    21 Lượt xem    20 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Tổng Quan Về Vòng Đời Của Request Trong Laravel

Hi! Xin chào các bạn, hôm nay chúng ta sẽ cùng nhau đi hiểu vòng đời của một Laravel Application dựa trên Request Lifecycle Doc của laravel nhé! Chúng ta sẽ cùng nhau đi bóc tách và hiểu từng Lifecycle nó hoạt động như thế nào.

  1. Entry Point (public/index.php)
  2. HTTP/Console Kernels
  3. Service Providers
  4. Routing
  5. Middlewares
  6. Controller/Route Handling
  7. Sending Response

Entry Point: public/index.php

Trong vòng đời của một request trong Laravel, điểm vào (Entry Point) đóng vai trò khởi đầu toàn bộ quá trình xử lý request. Điểm vào này chính là tệp public/index.php, nơi tất cả các request được chuyển hướng tới bởi cấu hình của máy chủ web (như Apache hoặc Nginx). Đây là nơi Laravel bắt đầu tải và khởi động ứng dụng của bạn. Chúng ta sẽ đi chi tiết từng bước trong quá trình này.

  1. Khởi Tạo Bộ Định Thời Gian

    define('LARAVEL_START', microtime(true));​

    Dòng này định nghĩa một hằng số LARAVEL_START để ghi lại thời gian bắt đầu của request. Điều này hữu ích cho việc đo lường hiệu suất và thời gian xử lý của ứng dụng.

  2. Tải Autoloader Của Composer

    require __DIR__.'/../vendor/autoload.php';​

    Đây là bước tải autoloader do Composer tạo ra. Autoloader này chịu trách nhiệm tự động tải các class PHP cần thiết khi chúng được sử dụng, thay vì phải tải thủ công từng tệp một.

  3. Khởi Tạo Ứng Dụng Laravel

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

    Dòng này yêu cầu và khởi động tệp bootstrap/app.php. Tệp này trả về một instance của ứng dụng Laravel. Đây là bước mà service container của Laravel được khởi tạo. service container là trung tâm của Laravel, nơi chứa và quản lý tất cả các thành phần và dịch vụ của ứng dụng.

  4. Tạo Instance của HTTP Kernel

    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);​

    Dòng này tạo một instance của HTTP kernel từ service container. Kernel là trung tâm của toàn bộ quá trình xử lý request, chịu trách nhiệm cho việc khởi động tất cả các thành phần cần thiết để xử lý request và trả về response.

  5. Xử Lý Request và Trả Về Response

    $response = $kernel->handle(
        $request = Illuminate\Http\Request::capture()
    )->send();​
    • Illuminate\Http\Request::capture(): Phương thức này tạo một instance của Illuminate\Http\Request từ dữ liệu request hiện tại (như dữ liệu GET, POST, cookies, v.v.).
    • handle($request): Kernel nhận request và bắt đầu quá trình xử lý thông qua hệ thống middleware và route của ứng dụng. Nó sẽ trả về một instance của Illuminate\Http\Response.
    • send(): Phương thức này gửi nội dung của response đến trình duyệt của người dùng.
  6. Hoàn Thành Request

    $kernel->terminate($request, $response);​

    Sau khi response đã được gửi tới trình duyệt của người dùng, phương thức terminate được gọi để thực hiện bất kỳ công việc nào cần thiết sau khi response đã được gửi đi (như ghi log hoặc giải phóng tài nguyên).

Tóm Tắt

Tệp public/index.php là điểm vào cho tất cả các request tới ứng dụng Laravel. Nó chịu trách nhiệm khởi tạo các thành phần cần thiết và bắt đầu quá trình xử lý request. Quá trình này bao gồm:

  1. Ghi lại thời gian bắt đầu của request.
  2. Tải autoloader của Composer.
  3. Khởi tạo ứng dụng Laravel từ tệp bootstrap/app.php.
  4. Tạo một instance của HTTP kernel.
  5. Xử lý request thông qua kernel và gửi response tới trình duyệt.
  6. Hoàn thành request với các công việc hậu kỳ cần thiết.

Dưới đây là tệp public/index.php đầy đủ:

<?php

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

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

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

$kernel = $app->make(Kernel::class);

$response = $kernel->handle(
    $request = Request::capture()
)->send();

$kernel->terminate($request, $response);​

Quá trình này giúp Laravel có thể xử lý và response các request một cách nhanh chóng và hiệu quả, đảm bảo rằng ứng dụng của bạn hoạt động trơn tru và bảo mật.

HTTP/Console Kernels

Trong vòng đời của một request trong Laravel, các HTTP/Console Kernels đóng vai trò quan trọng trong việc xử lý và quản lý request. Chúng là trung tâm của hệ thống Laravel, chịu trách nhiệm khởi tạo và cấu hình các thành phần quan trọng cũng như điều phối luồng request/response. Dưới đây là cách chúng hoạt động chi tiết.

Laravel có hai loại kernel chính:

  • HTTP Kernel: xử lý các request HTTP.
  • Console Kernel: xử lý các lệnh console (artisan commands).

Chúng ta sẽ tập trung vào HTTP Kernel, vì nó thường được sử dụng để xử lý các request từ người dùng.

HTTP Kernel

HTTP Kernel được định nghĩa trong app/Http/Kernel.php. Nó mở rộng lớp Illuminate\Foundation\Http\Kernel.

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    // Danh sách các middleware toàn cục
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];

    // Danh sách các middleware group
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:api',
            'bindings',
        ],
    ];

    // Danh sách các route middleware
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
}​

Quá Trình Xử Lý của HTTP Kernel

  1. Nhận Request

    • Khi một request đến ứng dụng, nó được chuyển tới HTTP Kernel thông qua phương thức handle của kernel.
    • Request được tạo từ Illuminate\Http\Request::capture().
    $response = $kernel->handle(
        $request = Illuminate\Http\Request::capture()
    )->send();​
  2. Khởi Động Các Bootstrappers

    • HTTP Kernel sẽ khởi động các bootstrappers. Đây là các lớp thực hiện các công việc như xử lý lỗi, cấu hình logging, và xác định môi trường ứng dụng.
    protected $bootstrappers = [
        \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
        \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
        \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
        \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
        \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
        \Illuminate\Foundation\Bootstrap\BootProviders::class,
    ];​
  3. Xử Lý Middleware Toàn Cục

    • Request sẽ đi qua các middleware toàn cục, được định nghĩa trong thuộc tính $middleware.
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        // Các middleware khác...
    ];​
  4. Xử Lý Middleware Nhóm

    • Sau đó, request sẽ đi qua các middleware nhóm, chẳng hạn như nhóm web hoặc api.
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            // Các middleware khác...
        ],
        'api' => [
            'throttle:api',
            'bindings',
        ],
    ];​
  5. Xử Lý Route Middleware

    • Cuối cùng, request sẽ đi qua các route middleware. Các middleware này được áp dụng cho các route cụ thể.
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        // Các middleware khác...
    ];

Console Kernel

Console Kernel chịu trách nhiệm xử lý tất cả các lệnh Artisan (console commands) trong ứng dụng Laravel. Dưới đây là các trách nhiệm chính của Console Kernel:

  1. Đăng Ký Các Lệnh Artisan:

    • Console Kernel đăng ký tất cả các lệnh Artisan mà ứng dụng hỗ trợ.
    protected $commands = [
        \App\Console\Commands\SomeCommand::class,
        // Các lệnh khác...
    ];​
  2. Định Nghĩa Lịch Trình:

    • Console Kernel định nghĩa các lệnh sẽ được chạy định kỳ.
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('inspire')->hourly();
        // Các lệnh khác...
    }​
  3. Xử Lý Các Lệnh Artisan:

    • Khi một lệnh Artisan được gọi, Console Kernel sẽ xử lý lệnh đó.
    public function handle($input, $output)
    {
        return $this->artisan->run($input, $output);
    }

Service Providers

Sau khi HTTP Kernel hoàn thành các bước xử lý ban đầu, hệ thống sẽ chuyển sang giai đoạn của Service Providers. Service Providers có trách nhiệm chính trong việc khởi tạo và cấu hình tất cả các thành phần của framework. Dưới đây là chi tiết về cách Service Providers hoạt động và trách nhiệm của chúng trong request lifecycle của Laravel:

Trách Nhiệm của Service Providers

  1. Khởi Tạo (Instantiation):

    • Sau khi HTTP Kernel hoàn thành các bước xử lý ban đầu, Laravel sẽ bắt đầu khởi tạo các Service Providers đã được liệt kê trong cấu hình của ứng dụng.
    • Các Service Providers được khai báo trong mảng providers của tệp config/app.php.
    'providers' => [
        // Các service provider của framework
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        // ...
        
        // Các service provider của ứng dụng
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // ...
    ],​
  2. Đăng Ký (Register):

    • Sau khi khởi tạo, Laravel sẽ gọi phương thức register trên mỗi Service Provider.
    • Phương thức register chịu trách nhiệm ràng buộc các dịch vụ vào container của ứng dụng. Điều này cho phép ứng dụng có thể sử dụng Dependency Injection để lấy các dịch vụ cần thiết.
    public function register()
    {
        $this->app->singleton('SomeService', function ($app) {
            return new SomeService();
        });
    }​
  3. Khởi Động (Boot):

    • Sau khi tất cả các Service Providers đã được đăng ký, Laravel sẽ gọi phương thức boot trên từng Service Provider.
    • Phương thức boot chịu trách nhiệm thực hiện các tác vụ khởi động cần thiết sau khi tất cả các dịch vụ đã được đăng ký và có sẵn trong container.
    public function boot()
    {
        // Thực hiện các công việc khởi động, như đăng ký sự kiện, routes, hoặc middleware
        $this->loadRoutesFrom(__DIR__.'/../routes/web.php');
    }​
  4. Các Tác Vụ Chính:

    • Database: Đăng ký các kết nối cơ sở dữ liệu và các dịch vụ liên quan đến cơ sở dữ liệu.
    • Queue: Đăng ký và cấu hình các dịch vụ hàng đợi.
    • Authenlication: Cấu hình các dịch vụ xác thực người dùng và ủy quyền truy cập.
    • Routing: Đăng ký các routes và các middleware liên quan.
    • Validation: Cấu hình và đăng ký các dịch vụ kiểm tra dữ liệu.
    • Các Dịch Vụ Khác: Bất kỳ dịch vụ nào khác mà ứng dụng request đều được cấu hình và khởi tạo tại đây.

Tóm Tắt Trách Nhiệm

  • Khởi tạo và đăng ký các dịch vụ: Service Providers chịu trách nhiệm đăng ký tất cả các dịch vụ cần thiết vào container của ứng dụng.
  • Khởi động các dịch vụ: Sau khi đăng ký, Service Providers khởi động các dịch vụ và thực hiện các thiết lập cần thiết.
  • Cấu hình các thành phần của framework: Mỗi thành phần của framework, như cơ sở dữ liệu, hàng đợi, routing, xác thực, v.v., đều được cấu hình bởi các Service Providers.
  • Đảm bảo các dịch vụ sẵn sàng: Đảm bảo rằng tất cả các dịch vụ cần thiết đã được đăng ký và sẵn sàng sử dụng trong suốt vòng đời của request.

Sau khi tất cả các Service Providers đã được khởi tạo và khởi động, request sẽ tiếp tục được xử lý thông qua các route và controller, với tất cả các dịch vụ cần thiết đã được cấu hình và sẵn sàng sử dụng.

Routing

Trong vòng đời của một request trong Laravel, sau khi Service Providers đã hoàn thành việc cấu hình ứng dụng, quy trình sẽ tiếp tục với giai đoạn của Routing. Dưới đây là trách nhiệm và cách hoạt động của Routing sau khi bước Service Providers đã được hoàn thành:

Trách Nhiệm của Routing

  1. Nhận và Phân Loại request (Request):

    • Sau khi Service Providers đã hoàn thành việc cấu hình, request từ client sẽ được gửi đến ứng dụng Laravel.
    • Routing sẽ nhận request và tiến hành phân loại request này để xác định xem nó phù hợp với route nào trong ứng dụng.
  2. Định Tuyến (Routing):

    • Routing sẽ ánh xạ request đến các route tương ứng dựa trên URI và phương thức HTTP (GET, POST, PUT, DELETE, v.v.).
    • Laravel sử dụng các tệp route được định nghĩa trong thư mục routes của ứng dụng, chẳng hạn như routes/web.php hoặc routes/api.php.
    Route::get('/users', 'UserController@index');
    Route::post('/users', 'UserController@store');​
  3. Middleware:

    • Mỗi route có thể được gán với một hoặc nhiều middleware. Middleware cung cấp một cơ chế thuận tiện để lọc hoặc kiểm tra request HTTP trước khi chúng được xử lý bởi các controller hoặc logic ứng dụng khác.
    • Middleware có thể kiểm tra xác thực người dùng, kiểm tra CSRF token, thực hiện ghi log, v.v.
  4. Thực Hiện Route hoặc Controller:

    • Sau khi request đã vượt qua các middleware, nó sẽ được định tuyến đến route hoặc controller tương ứng.
    • Route có thể trực tiếp thực hiện một hành động cụ thể hoặc chỉ định một controller để xử lý request.
    Route::get('/users', 'UserController@index');​

    Trong đoạn mã trên, khi request /users được nhận, nó sẽ được gửi đến phương thức index trong controller UserController.

  5. Xử Lý và Trả Về response:

    • Controller hoặc route sẽ xử lý request và trả về một response.
    • response này sẽ được truyền qua lại các middleware nếu có, cho phép chúng can thiệp vào hoặc chỉnh sửa response trước khi được trả về cho client.

Tóm Tắt

  • Định Tuyến request: Routing xác định route tương ứng cho mỗi request dựa trên URI và phương thức HTTP.
  • Middleware: Middleware được sử dụng để lọc và kiểm tra request trước khi chúng được xử lý bởi các controller hoặc route.
  • Xử Lý request: Sau khi vượt qua các middleware, request sẽ được xử lý bởi các controller hoặc route, thực hiện hành động tương ứng.
  • Trả Về response: Kết quả của xử lý sẽ được trả về client qua lại các middleware nếu có, trước khi được trả về hoàn toàn.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday