+9

Tìm hiểu về Laravel lifecycle

Chào mọi người, hôm nay mình muốn chia sẻ với mọi người về laravel lifecycle. Với kiến thức của một người đang tìm hiểu kỹ hơn về laravel như mình.

Cùng bắt đầu thôi nào!!!!

laravel là gì?

  • Đi qua lịch sử phát triển một tý thì: laravel được phát triển bởi Taylor Otwell và ra mắt vào tháng 6 năm 2011. Và sau 12 năm phát triển thì hiện tại laravel đã cho ra mắt phiên bản laravel 10.
  • Nó là một framework mã nguồn mở và được dùng để phát triển web dựa trên ngôn ngữ PHP. Và tất nhiên là nó cũng hỗ trợ các tính năng để phát triển web như RESTful routing, middlewareBlade...

Laravel lifecycle

image.png

Hình minh họa Laravel Lifecycle

  • Nói về lifecycle của laravel thì nó gồm 5 giai đoạn chính:
    • Khởi tạo ứng dụng.
    • Xử lý yêu cầu (Request).
    • Xử lý middleware.
    • Phản hồi (Response).
    • Kết thúc.

Khởi tạo ứng dụng

  • Như trên hình minh họa thì khi user gửi một Request đến ứng dụng thì file đầu tiên tiếp nhận Request đó là public/index.php. Vậy nó có gì?
<?php

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

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

/*
|--------------------------------------------------------------------------
| Check If Application Is Under Maintenance
|--------------------------------------------------------------------------
*/

if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
    require __DIR__.'/../storage/framework/maintenance.php';
}

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
*/

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

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
*/

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

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

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

$kernel->terminate($request, $response);
  • Như bạn thấy thì ở đây laravel đã định nghĩa ra một biến là LARAVEL_START và sau đó kiểm tra xem ứng dụng có đang được bảo trì hay không.

Đăng ký cơ chế autoload

  • Tiếp đó là đăng ký autoload:
    • Ở đây __DIR__ là biến của PHP dùng để trỏ đến thư mục hiện tại.
    • Còn autoload.php là file chứa các classfunction được định nghĩa trong composer và được require vào ứng dụng.
    • Mục đích là để tải các tệp tin phụ thuộc vào trong ứng dụng.

Bắt đầu khởi tạo ứng dụng

  • Sau khi đăng ký cơ chế autoload xong laravel bắt đầu gọi đến file bootstrap/app.php.
  • Mở file này bạn sẽ thấy cách các thành phần app được khởi tạo:
/*
* Create The Application
*/
$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

/*
* Bind Important Interfaces
*/
$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
);

/*
* Return The Application
*/

return $app;
  • Khởi tạo đối tượng ứng dụng -> Đăng ký các Interfaces quan trọng -> trả về đối tượng ứng dụng đã khởi tạo.

Xử lý Request

  • Sau khi nhận được đối tượng $app thì laravel sẽ khởi tạo đối tượng Kernel để xử lý các Request.
$app = require_once __DIR__.'/../bootstrap/app.php';

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

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

$kernel->terminate($request, $response);
  • Cuối cùng là trả về Response cho Resquest đó.

HTTP/Console Kernel

Bạn có bao giờ thắc mặc vậy làm sao mà larravel biết được Request đó cần được chuyển đến đâu để xử lý và tại sao nó lại điều hướng được Request đó.

Khi Request được gửi đến ứng dụng thì dựa vào các Route đã được định nghĩa trong ứng dụng mà các request được điều hướng đến các nới xử lý tương ứng với yếu cầu.

Và trước khi đến được với nơi xử lý yêu cầu thì Request phải vượt qua được các kiểm tra mặc định của HTTP/Console kernel tùy thuộc vào yêu cầu của Request đó. Như kiểm tra middleware, xác thực CSRF, thao tác với HTTP session...

HTTP/Console kernel hoạt động như một hộp đen với cơ chế là nhận Request và trả Response và các cuộc kiểm tra đối với Resquest cũng được thực hiện ở trong chiếc hộp đen này.

Service providers

Như bạn thấy ở trong hình minh họa thì có một bước đi quá service providers nhưng tại sao trong quá trình khởi tạo ứng dụng mình không nhắc đến nó. Vậy thì nó được chạy vào lúc nào 🤔🤔

Trong quá trình HTTP Kernel được chạy thì một trong những việc quan trong nhất của nó là tải tất cả các service providers được cấu hình trong file config/app.php.

Quá trình đó bao gồm việc Đăng kýkhởi động. Các service providers sẽ phụ trách việc khởi động các thành phần của ứng dụng như: database, router,...

Router

Tiếp theo đó là router nơi mà Request đi đến sau khi các service providers được khởi tạo.

Công việc của phần này rất đơn giản đó là đưa các Request đến với middleware tương ứng (nếu có) rồi sau đó phân bổ về với Controller/Action tương ứng.

Middleware

Như ở trên có đề cập thì có những Request sẽ được phân bổ tới Middleware trước khi đến với nới xử lý. Nên mình sẽ nói một chút về middleware ở đây.

Công việc chính của middleware là xử lý logic rằng buộc nào đó để quyết định Request đó có được đi tiếp hay không.

Ví dụ như một chức năng yêu cầu user phải có quyền là admin mới có thể thực hiện thì ở middleware sẽ kiểm tra xem user gửi request có quyền admin không còn ở trong phần xử lý sẽ không phải quan tâm việc user gửi request có phải admin hay không mà chỉ cần xử lý theo logic là được.

Cuối cùng là xử lý và trả về

Sau khi Request đã đi qua hết các bước trên thì chỉ cần xử lý yêu cầu và trả về cho người dùng kết quả (Response) tương ứng.

Kết thúc

Như vậy mình đã giới thiệu với các bạn những gì mình tìm hiểu được về laravel lifecycle rồi đấy.

Nếu trong bài viết có chỗ nào chưa đúng thì mình mong mọi người có thể góp ý để mình chỉnh sửa lại nhé 😁😁

Cảm ơn mọi người đã đọc bài viết của mình.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.