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 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ạ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
,middleware
vàBlade
...
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ậ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_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ácclass
vàfunction
được định nghĩa trong composer và đượcrequire
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.
- Ở đây
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 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
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ượ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ề
Response
choResquest
đó.
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.