今回の記事は、PHPのフルスタックフレームワークであるLaravelの簡単な概要とライフサイクルなどの基礎的な知識となります。
こちらの記事にもある通り、先日からPHPを勉強していおり、今回は続きを書こうと思っていたのですが、並行して勉強しているLaravelを記事にした方が勉強になるかなと思ったので、こちらを記事にすることにしました。
LaravelはPHPのいわゆるフルスタックフレームワークです。ルーティング、DB関連の機能(マイグレーションやORMなど)、テンプレートエンジン(Blade)などのWebアプリケーションに必要な一通りの機能を提供します。
Laravelの特徴としてはいくつか挙げられますが、注目すべき点は下記の3つだと思います。
公式でもうたっている通り、比較的に学習の難度は低いと思います。Laravelでは様々な機能をFacadeとして提供しており、容易に複雑な機能を利用できるようになっています。例えばセッションを扱いたい場合は下記のようになります。
$userId = \Session::get("user_id");
Laravelではコア部分にSymfonyのコンポーネントを利用しています。Symfonyは古くからPHPで使用されている実績のあるフレームワークであり、Laravelの信頼性に寄与します。
Laravelではサービスコンテナという機能でDI(Dependency Injection)を実現しています。さらに、このサービスコンテナとコントラクト(インタフェース)を利用することで、Laravel自体のカスタマイズ(暗号化方式を変更するなど)も容易に行えるようになっています。
Laravelは拡張性の高いフレームワークなので、ディレクトリ構成を柔軟に変更することができます。ここでは、プロジェクト作成時のディレクトリ構成にそって説明します。ディレクトリ構成は下記のとおりです。
.
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.lock
├── config
├── database
├── package.json
├── phpunit.xml
├── public
├── readmy.md
├── resources
├── routes
├── server.php
├── storage
├── tests
├── vendor
└── webpack.mix.js
Console、Exceptions、Http、Providersなどのフォルダがあります。アプリケーションの処理はこのディレクトリ以下に配置します。
アプリケーションの初期化処理やオートローディングの設定ファイルが置かれます。
アプリケーションの設定ファイルが置かれます。
マイグレーションファイルやSEEDファイルが置かれます。
index.phpの他に画像、CSS、JavaScriptといったそのまま公開できるファイルが置かれます。index.phpはアプリケーションに送られる全てのリクエストを処理するエントリーポイントとなるファイルです。
ViewのテンプレートファイルやLESS、SASS、TypeScriptなどのファイルが置かれます。
web.phpやapi.phpなどのルート定義ファイルが置かれます。
ログファイルやキャッシュファイルなどのLaravelが作成するファイルが置かれます。
テストコード関連のファイルが置かれます。
Laravel本体やSymfonyのコンポーネントが置かれています。他にもcomposerでダウンロードされるパッケージもここに置かれます。
Laravelがリクエストを処理する流れは下記のとおりです。レスポンスはリクエストと逆の流れで処理されます。
Laravelでは全てのリクエストをエントリーポイントであるindex.phpで受ける必要があります。index.phpのコードを見ながら処理の流れを追ってみます。
// オートローダを読み込む define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; // フレームワークをセットアップする // 実行結果として Illuminate\Foundation\Applicationのインスタンスが返却される $app = require_once __DIR__.'/../bootstrap/app.php'; // HTTPカーネルを生成してアプリケーションを実行する $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $respones = $kernel->handle( $request = Illuminate\Http\Request::capture() ); // HTTPレスポンスを送信する $response->send(); // HTTPカーネルを終了する $kernel->terminate($request, $response);
HTTPカーネルはアプリケーションのセットアップやミドルウェアの設定を行います。その後、ルータにリクエストをディスパッチします。HTTPカーネルでは他にも例外処理やイベントリスナーの設定も行います。
ルータではリクエストにマッチするルートを探して実行します。コントローラやアクションクラスの他に、クロージャを直接定義することもできるので、簡単な処理であればルータに記述することもできます。
ルートの定義はweb.phpもしくはapi.phpに記述します。ルート定義の例をは下記のとおりです。
// /top宛のリクエストはApp\Http\Controllers\TopControllerクラスのindexメソッドを実行する Route::get('/top', 'TopController@index'); // メソッド名を指定しない場合は__invokeメソッドが実行される Route::post('/users', 'UserController'); // クロージャを実行することもできる Route::get('/version', function (Request $request) { return view('1.0.0'); });
ミドルウェアはコントローラ等でリクエストを処理する前後に任意の処理を行います。ミドルウェアの例としては暗号化(復号化)やセッション管理などがあげられます。
ミドルウェアの実行は数珠つなぎのように連結して行われるので、それぞれのミドルウェアは一つの処理のみを行います。
コントローラではHTTPリクエストに応じて処理を行います。
Laravelの基礎知識として特徴、ディレクトリ構成、ライフサイクルについて紹介しました。