Tìm hiểu về Laravel lifecycle
Bài đăng này đã không được cập nhật trong 2 năm
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ởiTaylor Otwellvà ra mắt vào tháng 6 năm 2011. Và sau 12 năm phát triển thì hiện tạilaravelđã cho ra mắt phiên bảnlaravel 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,middlewarevàBlade...
Laravel lifecycle
- Nói về
lifecyclecủ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ậnRequestđó 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_STARTvà 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.phplà file chứa cácclassvàfunctionđược định nghĩa trong composer và đượcrequirevào ứng dụng. - Mục đích là để tải các tệp tin phụ thuộc vào trong ứng dụng.
- Ở đây
Bắt đầu khởi tạo ứng dụng
- Sau khi đăng ký cơ chế
autoloadxong laravel bắt đầu gọi đến filebootstrap/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
Interfacesquan 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
$appthì laravel sẽ khởi tạo đối tượngKernelđể xử lý cácRequest.
$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ề
ResponsechoResquestđó.
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ý và 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
