Laravel ライフサイクル 調べてみた

Laravelライフサイクル の流れ

Laravelのライフサイクルは以下の流れになっています。

①エントリポイント(public/index.php)

②HTTPカーネル(Illuminate/Fundation/Http/Karnel)

③ルータ

④ミドルウェア

⑤コントローラー

⑥ミドルウェア

⑦ルータ

⑧HTTPカーネル

⑨エントリポイント

 

エントリポイント

Laravelではhttpリクエストを受け取ると最初に、public/index.phpを見にいきます。

これがLaravelのエントリポイントになります。

index.php

<?phpuse Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

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

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

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

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

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

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

$kernel->terminate($request, $response);

①メンテナンスの表示

/storage/framework/maintenance.phpがあれば、アプリケーション内のどの画面であってもmaintenance.php内の情報を表示します。

②オートローダの読み込み

フレームワーク内で使用されるクラスやインターフェイスなどを一括で読み込む仕組みです。

これにより、クラスファイルなどのrequire文が不要になります。

③サービスコンテナの作成

/bootstrap/app.phpを読み込むことで、フレームワークがセットアップされ、最終的にサービスコンテナであるIlluminate\Fundation\Applicationのインスタンスが返されます。

④カーネルの作成

サービスコンテナを利用してカーネル(デフォルトではHTTPカーネル)がインスタンス化されます。

⑤リクエストの受け渡し、レスポンスの返却

HTTPカーネルにリクエストを受け渡して、レスポンスが返されます。

 

HTTPカーネル

HTTPカーネルでは、アプリケーションのセットアップやミドルウェアの設定などを行い、ルータを実行します。

大切なのは、HTTPカーネルがルータを実行しているということです。

以下、HTTPカーネルの正体であるIlluminate\Fundation\Http\Karnel内の、ルータを実行しているコードを記載します。

Illuminate\Fundation\Http\Karnel.php

public function handle($request)
{
    try {
        $request->enableHttpMethodParameterOverride();
        $response = $this->sendRequestThroughRouter($request); ・・・①
    } catch (Throwable $e) {
        $this->reportException($e);

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

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

    return $response;
}

protected function sendRequestThroughRouter($request)
{
    $this->app->instance('request', $request);

    Facade::clearResolvedInstance('request');

    $this->bootstrap();

    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);
    };
}

①でsendRequestThroughRouterが実行され、ルータにリクエストを渡し、レスポンスが返される処理をしています。

 

ルータ

渡されたリクエストをもとに、定義されたルートの中から該当の処理を実行します。

以下、routes/web.phpに定義された例になります。

routes/web.php

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

上記の例では、/homeのURLに対してApp\Http\Controllers\HomeControllerのindexメソッドを実行しています。

 

ミドルウェア

ルータの処理の前後に実行する処理になります。

値の暗号化など複数の場面で使用される処理はミドルウェアとして実装されるケースがあります。

以下ルータ内でのミドルウェアの使用例になります。

routes/web.php

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->middeware('auth')->name('home');

上記の例では、コントローラーの処理を実行する前に、ユーザーがログインしているかどうかを確認する認証のミドルウェアを入れ込んでいます。

このようにルータ内でミドルウェアを使用するにはmiddleware(名前)を挿入することで使用できます。

 

コントローラー

MVCモデルを使用している場合は、ルータから指定されたコントローラーを実行し、モデルやビューなどを実行して、レスポンスを作成します。

 

以上!!!!!!!