圖解Laravel的生命週期

先來張圖大體理解下laravel的生命週期。

下面對應相應的代碼,解釋上圖。

//文件路徑:laravel/public/index.php

/**
 * laravel的啓動時間
 */
define('LARAVEL_START', microtime(true));

/**
 * 加載項目依賴。
 * 現代PHP依賴於Composer包管理器,入口文件經過引入由Composer包管理器。
 * 自動生成的類加載程序,能夠輕鬆註冊並加載所依賴的第三方組件庫。
 */
require __DIR__.'/../vendor/autoload.php';

/**
 * 建立laravel應用實例。
 */
$app = require_once __DIR__.'/../bootstrap/app.php';

// 接受請求並響應
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

// 結束請求,進行回調
$response->send();

// 終止程序
$kernel->terminate($request, $response);
//文件路徑:laravel/boostrap/app.php

//第一部分:建立應用實例
$app = new Illuminate\Foundation\Application(
    realpath(__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
);

return $app;
文件路徑:laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php

class Kernel implements KernelContract
{
    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,                    // 註冊服務提供者boot
    ];

    // 處理請求
    public function handle($request)
    {
        try {
            $request->enableHttpMethodParameterOverride();

            $response = $this->sendRequestThroughRouter($request);
        } catch (Exception $e) {
            $this->reportException($e);

            $response = $this->renderException($request, $e);
        } catch (Throwable $e) {
            $this->reportException($e = new FatalThrowableError($e));

            $response = $this->renderException($request, $e);
        }

        $this->app['events']->dispatch(
            new Events\RequestHandled($request, $response)
        );

        return $response;
    }

    protected function sendRequestThroughRouter($request)
    {
        //1、將$request實例註冊到APP容器
        $this->app->instance('request', $request);

        //2、清除以前的$request實例緩存
        Facade::clearResolvedInstance('request');

        //3、啓動引導程序
        $this->bootstrap();

        //4、發送請求
        return (new Pipeline($this->app)) //建立管道
                    ->send($request)      //發送請求
                    ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)  //經過中間件
                    ->then($this->dispatchToRouter());  //分發到路由
    }

    // 啓動引導程序
    public function bootstrap()
    {
        if (! $this->app->hasBeenBootstrapped()) {
            $this->app->bootstrapWith($this->bootstrappers());
        }
    }
    
    // 路由分發
    protected function dispatchToRouter()
    {
        return function ($request) {
            $this->app->instance('request', $request);

            return $this->router->dispatch($request);
        };
    }

    // 終止程序
    public function terminate($request, $response)
    {
        $this->terminateMiddleware($request, $response);

        $this->app->terminate();
    }
相關文章
相關標籤/搜索