Bỏ qua đến nội dung chính

Vòng đời của Laravel: request lifecycle từng bước

Giải thích request lifecycle trong Laravel bản hiện hành theo tài liệu chính thức: index.php, HTTP kernel, service provider, router, middleware và response.

Tan Hien
Founder
Cập nhật 5 phút đọc
Chia sẻ:
Vòng đời của Laravel: request lifecycle từng bước
Nội dung bài viết
  1. 1.Các bước trong vòng đời request của Laravel
  2. 1.1Bước 1: public/index.php, điểm vào duy nhất
  3. 1.2Bước 2: HTTP kernel và các bootstrapper
  4. 1.3Bước 3: Service provider
  5. 1.4Bước 4: Router, middleware và controller
  6. 1.5Bước 5: Response quay ngược và được gửi đi
  7. 2.Cấu hình vòng đời ở đâu trong Laravel bản mới?
  8. 3.Hiểu vòng đời giúp gì khi viết code?
  9. 3.1Kinh nghiệm từ Hozitech

Vòng đời của Laravel (request lifecycle) là chuỗi bước một HTTP request đi qua từ lúc vào ứng dụng đến khi response trả về trình duyệt: public/index.php → ứng dụng tạo từ bootstrap/app.php → HTTP kernel chạy bootstrapper → nạp service provider (register rồi boot) → router và middleware → controller → response đi ngược qua middleware và được gửi đi.

Hiểu vòng đời giúp bạn biết nên đặt code ở đâu (service provider, middleware hay controller) và gỡ lỗi nhanh hơn. Nội dung dưới đây bám theo tài liệu Request Lifecycle của Laravel 13 (truy cập 01/10/2026).

Sơ đồ 5 bước vòng đời request trong Laravel: public/index.php, HTTP kernel, service provider, router và middleware, response
Vòng đời request của Laravel bản hiện hành, tóm tắt theo tài liệu chính thức.

Các bước trong vòng đời request của Laravel

Bước 1: public/index.php, điểm vào duy nhất

Web server (Nginx, Apache) chuyển mọi request vào file public/index.php. File này rất ngắn: nạp autoloader do Composer sinh ra, lấy instance ứng dụng từ bootstrap/app.php rồi giao request cho ứng dụng xử lý. Việc đầu tiên Laravel làm là tạo instance ứng dụng, cũng chính là service container.

<?php
// public/index.php (rút gọn)
use Illuminate\Http\Request;

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

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

$app->handleRequest(Request::capture());

Bước 2: HTTP kernel và các bootstrapper

Ứng dụng gửi request tới HTTP kernel (qua handleRequest) hoặc console kernel (qua handleCommand khi chạy Artisan). HTTP kernel là instance của Illuminate\Foundation\Http\Kernel, thuộc framework; từ Laravel 11 bạn không còn file app/Http/Kernel.php trong dự án.

Trước khi xử lý request, kernel chạy danh sách bootstrapper: phát hiện môi trường, nạp cấu hình, cấu hình log và xử lý lỗi. Kernel cũng đưa request qua stack middleware toàn cục (bảo trì, kích thước dữ liệu POST, cắt khoảng trắng…). Có thể coi kernel là một "hộp đen": nhận Request, trả về Response.

Bước 3: Service provider

Đây là bước quan trọng nhất của quá trình khởi động. Laravel khởi tạo từng service provider, gọi phương thức register trên tất cả provider trước, sau đó mới gọi boot trên từng provider. Nhờ vậy, khi boot chạy, mọi binding trong container đã sẵn sàng. Database, queue, validation, routing… đều được khởi động bởi provider.

Provider do bạn viết hoặc của gói bên thứ ba được liệt kê trong bootstrap/providers.php; dự án mới chỉ có App\Providers\AppServiceProvider.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        // Đăng ký binding vào service container
    }

    public function boot(): void
    {
        // Chạy sau khi mọi provider đã register
    }
}

Bước 4: Router, middleware và controller

Khi ứng dụng đã khởi động xong, request được giao cho router. Router tìm route khớp với URL và phương thức HTTP, chạy các middleware gắn với route (ví dụ auth kiểm tra đăng nhập, nhóm web khởi động session và chống CSRF), rồi gọi closure hoặc phương thức controller.

// routes/web.php
use App\Http\Controllers\DashboardController;

Route::get('/dashboard', [DashboardController::class, 'index'])
    ->middleware(['auth', 'verified']);

Nếu request không vượt qua một middleware (chưa đăng nhập, sai token…), middleware có thể trả response ngay (chuyển hướng, lỗi 403) mà không tới controller. Xem cách viết middleware ở bài middleware trong Laravel và cách khai báo route ở bài route trong Laravel.

Bước 5: Response quay ngược và được gửi đi

Response do controller trả về đi ngược qua chuỗi middleware của route, cho phép middleware sửa hoặc kiểm tra response (thêm header, ghi log…). Cuối cùng, phương thức handle của kernel trả response cho handleRequest của ứng dụng, và ứng dụng gọi send() để gửi nội dung về trình duyệt.

Nếu middleware có phương thức terminate và máy chủ chạy PHP qua FastCGI (PHP-FPM), phương thức này được gọi sau khi response đã gửi đi, phù hợp cho việc ghi log hoặc dọn dẹp không làm chậm người dùng.

Cấu hình vòng đời ở đâu trong Laravel bản mới?

Từ Laravel 11, những gì trước đây nằm rải rác trong app/Http/Kernel.php, RouteServiceProvider và app/Exceptions/Handler.php được gom vào bootstrap/app.php:

// bootstrap/app.php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware): void {
        $middleware->append(\App\Http\Middleware\EnsureTokenIsValid::class);
    })
    ->withExceptions(function (Exceptions $exceptions): void {
        //
    })->create();
Việc cần làmLaravel 10 trở về trướcLaravel 11 trở đi
Thêm middleware toàn cục, aliasapp/Http/Kernel.php ($middleware, $routeMiddleware)bootstrap/app.php → withMiddleware()
Khai báo file routeRouteServiceProviderbootstrap/app.php → withRouting()
Xử lý exceptionapp/Exceptions/Handler.phpbootstrap/app.php → withExceptions()
Đăng ký service providerMảng providers trong config/app.phpbootstrap/providers.php
Lập lịch tác vụapp/Console/Kernel.phproutes/console.php với facade Schedule

Xem toàn cảnh các thư mục liên quan ở bài cấu trúc thư mục Laravel.

Hiểu vòng đời giúp gì khi viết code?

  • Đặt code đúng chỗ: binding vào container trong register(); đăng ký view composer, gate, macro trong boot(); kiểm tra quyền truy cập bằng middleware; logic nghiệp vụ trong controller hoặc service.
  • Gỡ lỗi nhanh hơn: lỗi 419 thường do middleware chống CSRF; lỗi 404 khi model không tìm thấy do route model binding (middleware SubstituteBindings).
  • Tối ưu hiệu năng: tránh truy vấn database trong register() hay boot() vì chạy ở mọi request; dùng php artisan optimize khi triển khai để cache cấu hình và route.

Kinh nghiệm từ Hozitech

Website Hozitech chạy trên Laravel. Khi một trang Laravel chậm bất thường, cách dò hiệu quả là đi lần lượt theo vòng đời: provider có làm việc nặng ở mọi request không, middleware nào chạy trên route đó, rồi mới tới controller và truy vấn. Cách dò theo thứ tự này thường nhanh hơn việc đoán mò trong controller. Để nắm nền tảng trước, hãy đọc Laravel là gì và mô hình MVC.

Tan Hien

Về tác giả

Founder

Xin chào mình là Hiền hiện đang là Founder của Hozitech. Mình là kỹ sư phần mềm có hơn 9+ năm kinh nghiệm trong lĩnh vực thiết kế website, ứng dụng di động... Gần đây mình đang nghiên cứu thêm về lĩnh vực marketing. Mình rất vui khi được chia sẽ những kiến thức và kinh nghiệm của mình đến mọi người!

Câu hỏi thường gặp

Câu hỏi thường gặp

Sẵn sàng bắt đầu dự án của bạn?

Hãy để chúng tôi giúp bạn biến ý tưởng thành hiện thực. Đăng ký tư vấn miễn phí ngay hôm nay để nhận được giải pháp công nghệ tối ưu cho doanh nghiệp.