Laravelのアプリケーションの理解①(ライフサイクル)


本記事ではLaravelのアプリケーションを理解し、より良い設計・アーキテクチャを構築できるように学習したことを簡潔にまとめています。

目次

1.Laravelのアーキテクチャ
2.アプリケーションのアーキテクチャ
3.HTTPリクエストとレスポンス
4.データベース
5.認証と許可
6.イベントとキューによる処理の分離
7.コンソールアプリケーション
8.テスト
9.エラーハンドリングとログの活用
10.テスト駆動開発の実践

1.Laravelのアーキテクチャ

1-1.ライフサイクル

laravelアプリケーションのHTTPリクエストからHTTPレスポンス返却までの流れを以下に示す。


HTTPリクエスト
→①エントリーポイント(public/index.php)
→②HTTPカーネル(app/Http/Kernel.php)
→③ルータ(Illuminate\Routing\Router\routers/web.php)
→④各ミドルウェア→⑤5コントローラ、クロージャ
→⑥各ミドルウェア→⑦ルータ→⑧HTTPカーネル→⑨エントリーポイント
→HTTPレスポンス


①エントリーポイント

pulic/index.phpが該当し、アプリケーションの起点となる。

//①オートローダの読み込み
define('LARAVEL_START', microtime(true));
require __DIR__.'/../vendor/autoload.php';

//②フレームワークの起動
$app = require_once __DIR__.'/../bootstrap/app.php';

//③アプリケーション実行およびHTTPレスポンスの送信
$kernel = $app->make(Kernel::class);
$response = tap($kernel->handle(
  $request = Request::capture()
))->send();

//④ 終了処理
$kernel->terminate($request, $response);

<コード解説>
①オートローダの読み込み。これによりフレームワーク内のクラスをrequireしなくても利用できる

②bootstrap/app.phpにフレームワークをセットするコードが含まれており、実行結果として、Illuminate\Foundation\Application(サービスコンテナの中核)のインスタンスを返す。

③生成されたサービスコンテナを利用し、HTTPカーネルを生成してhandle()を実行してアプリケーションを実行している。Illuminate\Http\Request::capture()でHTTPリクエストからRequestを生成している。

②HTTPカーネル

App\Http\Kernelクラスはミドルウェア設定を、Illuminate\Foundation\Http\Kernelクラスにはアプリケーションのセットアップの処理が記載。

// HTTPカーネルのhandleメソッド(Illuminate\Foundation\Http\Kernel)
public function handle($request)
{
  try {
       $request->enableHttpMethodParameterOverride();
       //①ルータの実行
       $response = $this->sendRequestThroughRouter($request);
  } catch (Throwable $e) {
       $this->reportException($e);
       $response = $this->renderException($request, $e);
  }

  //②イベント発火
  $this->app['event']->dispatch(
       new Events\RequestHandled($request, $response)
  );
  return $response;
}

<コード解説>
①sendRequestThrouchRouterの引数でRequestを受け取り、ルータにRequestを渡して実行する。

②Events\RequestHandledイベントが発火されるため、これに対するリスナーを設定すればこの時点で呼び出される。
(dispatchはジョブをキューに登録するメソッド)

③ルータ

定義されたルートの中からRequestにマッチするルートを探して、ルートに定義されたコントローラやアクション、クロージャを実行する。

④ミドルウェア

ミドルウェアでは、ルートで指定された処理の前後に任意の処理を実行できる。
具体的には、RequestやResponseに含まれる値の変更や暗号化(復号)やセッション実行、認証処理など。

下記にCookieの暗号化や複合を行うIlluminate\Coocke\Middleware\EncryptCookieクラスのhandleメソッドを示す。

<?php 
namespace Illuminate\Cookie\Middleware;

class EncryptCookies
{
  public function handle($request, Closure $next)
  {
     //①descryptメソッドで暗号化されたCookieを復号してRequestを取得
     //②次のミドルウェアを実行して、Responseを取得
     //③encryptメソッドでResponseを暗号化して返す
     return $this->encrypt($next($this->decrypt($request)));
   }
}

<コード解説>
引数のClosure $nextには次に実行するミドルウェアが、なければコントローラが入る。

⑤コントローラ

HTTPリクエストに対応する処理を実行する。処理が完了すれば、Responseを生成して戻り値として返す。