+1

Tìm hiểu về lifecycle của Laravel

Giới thiệu

  • Khi code bất kì ngôn ngữ hay framwork bất kỳ nào, bạn sẽ tự tin hơn khi hiểu cách thức hoạt động của nó. Mục tiêu của bài viết này sẽ giúp bạn có cái nhìn tổng quan hơn về Laravel nói chung và vòng đời của Laravel nói riêng.
  • Nếu trong vài lần đọc đầu tiên mà bạn chưa hiểu rõ bản chất của vòng đời Laravel thì cũng đừng nản lòng nhé vì theo mình kiến thức cho phần này cũng khá nâng cao 😃

Lifecycle

Điểm đầu: public/index.php

  • Là điểm đầu tiên nhận request từ client gửi lên và được cấu hình bởi web server Apache/Nginx.
  • File này không chứa nhiều code mà thay vào đó sẽ là điểm đầu để load các thành phần khác của framwork Laravel.

1. Load autoload

  • Đầu tiên sẽ load autoload.php được tạo ra từ Composer.

2. bootstrap/app.php

  • Tiếp theo sẽ load và truy xuất vào bootstrap/app.php
  • Thực hiện bindding giữa các interface và các class implement interface đó (hay còn gọi là service container)
$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

3. HTTP / Console Kernels

  • Tiếp theo, request sẽ được gửi đến Http/Kernel hoặc Console/Kernel tùy thuộc vào loại request đang gửi vào ứng dụng.
  • Cả 2 file Kernel trên đều được coi là điểm trung tâm mà tất cả các request đều đi qua, nhưng ở đây mình sẽ chỉ đề cập đến file Http/Kernel.
  • Http/Kernel extend Illuminate\Foundation\Http\Kernel class mà ở đây sẽ định nghĩa ra 1 array bootstrappers sẽ được chạy trước khi request được thực thi. bootstrappers sẽ cấu hình LoadEnvironmentVariables, LoadConfiguration, HandleExceptions, RegisterFacades, RegisterProviders, BootProviders.
  • Http/Kernel cũng sẽ định nghĩa danh sách các middleware mà tất cả các request sẽ phải đi qua để có thể thực thi logic.

    Path: vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
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,
];

protected function syncMiddlewareToRouter()
    {
        $this->router->middlewarePriority = $this->middlewarePriority;

        foreach ($this->middlewareGroups as $key => $middleware) {
            $this->router->middlewareGroup($key, $middleware);
        }

        foreach ($this->routeMiddleware as $key => $middleware) {
            $this->router->aliasMiddleware($key, $middleware);
        }
    }
  • Http/Kernel khá đơn giản, nhận request và trả về response.

    Path: public/index.php
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();
  • Và cuối cùng sẽ kết thúc 1 vòng đời request tới hệ thống.

    Path: public/index.php
$kernel->terminate($request, $response);

4. Service Providers

5. Routing

Link tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí