はじめに
今回の記事は、PHPのフルスタックフレームワークであるLaravelの簡単な概要とライフサイクルなどの基礎的な知識となります。
こちらの記事にもある通り、先日からPHPを勉強していおり、今回は続きを書こうと思っていたのですが、並行して勉強しているLaravelを記事にした方が勉強になるかなと思ったので、こちらを記事にすることにしました。
Laravelの概要
LaravelはPHPのいわゆるフルスタックフレームワークです。ルーティング、DB関連の機能(マイグレーションやORMなど)、テンプレートエンジン(Blade)などのWebアプリケーションに必要な一通りの機能を提供します。
Laravelの特徴としてはいくつか挙げられますが、注目すべき点は下記の3つだと思います。
- 学習コストが低い
- Symfonyがベース
- DIを積極的に活用している
学習コストが低い
公式でもうたっている通り、比較的に学習の難度は低いと思います。Laravelでは様々な機能をFacadeとして提供しており、容易に複雑な機能を利用できるようになっています。例えばセッションを扱いたい場合は下記のようになります。
1 | $userId = \Session::get("user_id"); |
Symfonyがベース
Laravelではコア部分にSymfonyのコンポーネントを利用しています。Symfonyは古くからPHPで使用されている実績のあるフレームワークであり、Laravelの信頼性に寄与します。
DIを積極的に活用している
Laravelではサービスコンテナという機能でDI(Dependency Injection)を実現しています。さらに、このサービスコンテナとコントラクト(インタフェース)を利用することで、Laravel自体のカスタマイズ(暗号化方式を変更するなど)も容易に行えるようになっています。
ディレクトリ構成
Laravelは拡張性の高いフレームワークなので、ディレクトリ構成を柔軟に変更することができます。ここでは、プロジェクト作成時のディレクトリ構成にそって説明します。ディレクトリ構成は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | . ├── 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<code> |
app
Console、Exceptions、Http、Providersなどのフォルダがあります。アプリケーションの処理はこのディレクトリ以下に配置します。
bootstrap
アプリケーションの初期化処理やオートローディングの設定ファイルが置かれます。
config
アプリケーションの設定ファイルが置かれます。
database
マイグレーションファイルやSEEDファイルが置かれます。
public
index.phpの他に画像、CSS、JavaScriptといったそのまま公開できるファイルが置かれます。index.phpはアプリケーションに送られる全てのリクエストを処理するエントリーポイントとなるファイルです。
resources
ViewのテンプレートファイルやLESS、SASS、TypeScriptなどのファイルが置かれます。
routes
web.phpやapi.phpなどのルート定義ファイルが置かれます。
storage
ログファイルやキャッシュファイルなどのLaravelが作成するファイルが置かれます。
tests
テストコード関連のファイルが置かれます。
vendor
Laravel本体やSymfonyのコンポーネントが置かれています。他にもcomposerでダウンロードされるパッケージもここに置かれます。
ライフサイクル
Laravelがリクエストを処理する流れは下記のとおりです。レスポンスはリクエストと逆の流れで処理されます。
- エントリーポイント
- HTTPカーネル
- ルータ
- ミドルウェア
- コントローラ
エントリーポイント
Laravelでは全てのリクエストをエントリーポイントであるindex.phpで受ける必要があります。index.phpのコードを見ながら処理の流れを追ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // オートローダを読み込む 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カーネルはアプリケーションのセットアップやミドルウェアの設定を行います。その後、ルータにリクエストをディスパッチします。HTTPカーネルでは他にも例外処理やイベントリスナーの設定も行います。
ルータ
ルータではリクエストにマッチするルートを探して実行します。コントローラやアクションクラスの他に、クロージャを直接定義することもできるので、簡単な処理であればルータに記述することもできます。
ルートの定義はweb.phpもしくはapi.phpに記述します。ルート定義の例をは下記のとおりです。
1 2 3 4 5 6 7 8 | // /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の基礎知識として特徴、ディレクトリ構成、ライフサイクルについて紹介しました。