基本の部分(Laravel)

【Laravel初心者向け】DIとサービスコンテナについて徹底解説

DIとサービスコンテナについて

Laravelでは、様々な機能をコントローラーに手軽に取り込み、利用をすることができます。ただ、この機能は普通はあり得ないことでしょう。「必要なクラスのインスタンスが自動的に引数として用意される機能」が実現されているのは、Laravelに標準実装されている「サービスコンテナ」という機能のおかげとなります。

Laravel公式 サービスコンテナ

サービスコンテナとは

サービスコンテナは、あるクラスと依存関係にあるクラスのインスタンスを管理する機能を提供することとなります。

コントローラーのコンストラクタやアクションメソッドに引数が用意されている場合、サービスコンテナはその引数に設定されたクラスのインスタンスを必要に応じて渡します。

新たにインスタンスを用意する場合もあれば、実際にインスタンスが用意されている場合、探して渡す場合もあります。

このような機能を依存性注入と呼びます。英語ではDependency Injection 略してDIと呼びます。

上記に伴い、サービスコンテナとは、Laravelに用意されているDI機能を実装したクラスということが分かりますね。

サービスコンテナの基本的な使い方

では、サービスコンテナを実際に使用してみましょう。

まずは簡単なクラスを用意します。

「app」フォルダの中に「TestClasses」というフォルダを作成し、その中に「TestService.php」というファイルを作成・以下のコードを記述してください。

2つのプロパティとコンストラクタ・各プロパティを返却するメソッドからなる簡単なクラスです。

アクションから TestService を利用

では、HelloControllerを/app/Http/Controller/へ作成し、以下の様に記述してください。

/helloへアクセスした際にindexアクションが実行されるようにルート情報にindexアクションメソッドを/helloに割り当てておきましょう。

また、/resources/views/hello/index.blade.phpをテンプレートとして用意してください。

以下、bodyのみ記載致します。

/helloにアクセスしてみてください。

下記の様に表示されていたら、無事サービスコンテナを使用することができていると思います。

TestServiceからsay()・data()メソッドを取得した結果をテンプレート側にそのまま表示しています。

HelloController@indexで引数$testserviceに、testserviceクラスのインスタンスが渡され、メソッドをそこから呼び出し、値を取り出しているということですね。

このようにメソッドの引数にクラスを指定するだけでインスタンスが使用できるようになる機能を「メソッドインジェクション」と呼びます。

インスタンスを明示的に生成

上記で説明した依存性注入では、「引数をただ用意しただけ」で自動的にインスタンスを生成し、値を渡します。

しかし、引数を使用せずにメソッド内で必要なインスタンスを取得したい場合もあります。

app関数

laravelに標準実装されているappというヘルパ関数があります。これは引数なしのシンプルな関数です。このapp関数は引数を使用せずにサービスコンテナのインスタンスを返します。

また、app関数で取得したサービスコンテナから「make」メソッドで呼び出すことでインスタンスを取得することも可能です。こちらも引数にクラス名を記述します。

resolve関数

このほか、サービスコンテナから依存性を解決するインスタンスを取得する専用関数としてresolve関数も用意されています。

これらを使用することで、引数を使用せずに必要な場面で明示的にインスタンスを取得することができます。

これからLaravelを始めるならこれが最適!!


今までLaravelに関しての良書はほとんどなく、あっても内容が古かったり分かりにくいのばかりで、先駆者達は苦労したのではないでしょうか?

そんな中で発売されたこの本は、現在の日本国内にて唯一のLaravelの良書と言い切っても良いかと思います。PHP中級者以上なら苦労することなく読めるでしょう。Laravelは高機能ゆえ、全機能を説明してはいませんが、この本をとっかかりにすれば自ずとLaravelをマスターすることができると思います。