Laravel6リリース
本編のコンテナの話に入る前に、Laravelのアップデートの話を少ししておきます。本連載の第5回が公開されてからしばらくたった2019年9月11日に、Laravelメジャーアップデートであるバージョン6がリリースされました。その後、マイナーアップデートを繰り返し、原稿執筆時点では、6.5.2が最新となっています。
バージョン6での変更点はこちらにまとまっています。その中で一番の変更は、セマンティックバージョニングを採用したところです。このバージョニングは多くのオープンソースで採用されているバージョン付けのルールです。
他にも、次のような変更がされています。
- エラーベージの変更
- 認証時エラーメッセージのカスタマイズ
- ミドルウェアを通じてのジョブの実行
- Lazy Collections
- Eloquentでのサブクエリの機能強化
- フロントエンド向けスキャフォールドの別パッケージ化
なお、第5回までの内容は、バージョン5.8を前提に紹介してきましたが、上記変更点を見てもわかるように、影響されるところはありません。これまで作成したサンプルも、作り方も、6.5で問題なく通用します。
Laravelのサービスコンテナの働き(1)
さて、本編であるサービスコンテナの話をしていきましょう。このサービスコンテナという名称は、実は連載第2回で紹介しています。
そこでは、Laravelの本体クラスである\Illuminate\Foundation\Applicationのインスタンスのことをサービスコンテナと呼び、Laravel内でさまざまな機能を提供する部品を管理し、つなげる役割を果たすとしています。これは、具体的にはどういうことでしょうか。コードを交えながら見ていきましょう。
コントローラクラスで別クラスをnewする
例えば、Laravelアプリ内で使用する「Book」というクラスがあるとします。これは、コントローラやミドルウェアのようにLaravelフレームワークが規定したクラスではなく独自クラスとします。こういったクラスはappディレクトリ配下の任意のディレクトリに作成することになっています。
ここではあくまでサンプルなので、リスト1のコードを想定します。また、連載第6回なので、今回利用するクラス類をapp/Chap6ディレクトリ内に作成していくことにします。実際にリスト1のファイルをapp/Chap6ディレクトリ内に作成してください。
<?php namespace App\Chap6; class Book { public function __construct() { print("<p>Bookクラスのコンストラクタが実行されました。</p>"); // (1) } }
ソースコードの内容としては特に解説は不要でしょう。このクラスをコントローラクラス内で利用してみます。コントローラクラスは第6回用のコントローラクラスということで、クラス名をChap6Controllerとし、app/Http/Controllersディレクトリ内に作成します。まず、リスト2の内容のファイルを作成してください。
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Chap6\Book; class Chap6Controller extends Controller { public function newBook() { $book = new Book(); // (1) return "<p>newBook()メソッドが実行されました。</p>"; } }
最後に、このコントローラクラスのnewBook()メソッドをルーティング登録しましょう。ルーティングパターンは/chap6/newBookとします。routes/web.phpにリスト3のコードを追記してください。
Route::get("/chap6/newBook", "Chap6Controller@newBook");
ファイル作成や追記が終了した時点で、動作確認を行っておきましょう。以下のURLにアクセスしてください。
- http://localhost/firstlaravel/public/chap6/newBook
すると、図1の画面が表示されます。
表示された画面で、1行目に表示されたメッセージは、リスト1の(1)のコンストラクタの中に記述した表示メッセージそのものです。つまり、リスト2の(1)でBookクラスをnewすることで表示されるメッセージであり、この段階でクラスインスタンスの生成が行われているのがわかります。