SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

人気のPHPフレームワークLaravelを習得しよう

Laravelにおけるサービスコンテナを理解しよう

人気のPHPフレームワークLaravelを習得しよう 第6回

Laravelのサービスコンテナの働き(2)

クラスをnewする代わり

 PHP(だけではないですが)では、あるクラスから別のクラスを利用しようとすると、原則そのクラスをnewしてインスタンスを生成する必要があります。リスト2ではBookクラスをnewすることで、利用できるようになります。

 ところが、Laravelではこのnewそのもの、つまりインスタンスの生成をLaravelに任せることができます。それは、次のようなコードです。リスト4のnewBook2()メソッドをChap6Controllerクラスに追記してください。

[リスト4]app/Http/Controllers/Chap6Controller.php
<?php
〜省略〜
class Chap6Controller extends Controller
{
	〜省略〜
	public function newBook2()
	{
		$book = resolve("App\Chap6\Book");  // (1)
		return "<p>newBook2()メソッドが実行されました。</p>";
	}
}

 動作確認を行うために、このメソッドnewBook2()をルーティング登録しましょう。ルーティングパターンは/chap6/newBook2とします。routes/web.phpにリスト5のコードを追記してください。

[リスト5]routes/web.php
Route::get("/chap6/newBook2", "Chap6Controller@newBook2");

 その後、以下のURLにアクセスしてください。

  • http://localhost/firstlaravel/public/chap6/newBook2

 すると、図2の画面が表示されます。

図2:newせずにBookクラスインスタンスが生成されたのを確認する画面
図2:newせずにBookクラスインスタンスが生成されたのを確認する画面

 実行結果画面を見ると、確かにnewBook2()が呼び出され、Bookクラスのインスタンスが生成されているのがわかります。ところが、そのnewBook2()メソッド内では全くBookクラスをnewしていません。その代わりをしているのがリスト4の(1)のresolve()関数です。

 このresolve()関数は、グローバル関数としてLaravel内で登録されており、この関数に引数としてクラスの完全修飾名を渡すと、該当クラスを探し出し、そのインスタンスをリターンしてくれる仕組みとなっているのです。その役割を担っているのがサービスコンテナ、つまりLaravelの中心となるApplicationインスタンスなのです。

サービスコンテナによるメソッドインジェクション

 このように、サービスコンテナは、Laravelアプリ内に存在するクラスというクラスを管理し、必要とあれば、その時点でそのクラスのインスタンスを渡せるようになっているのです。それを手動で行う関数がresolve()です。一方、自動で行う方法もあります。それが、メソッドインジェクションと呼ばれるものです。

 実際にコードで確認していきましょう。リスト6のnewBook3()メソッドをChap6Controllerクラスに追記してください。

[リスト6]app/Http/Controllers/Chap6Controller.php
<?php
〜省略〜
class Chap6Controller extends Controller
{
	〜省略〜
	public function newBook3(Book $book)
	{
		return "<p>newBook3()メソッドが実行されました。</p>";
	}
}

 動作確認を行うために、このメソッドnewBook3()をルーティング登録しましょう。ルーティングパターンは/chap6/newBook3とします。routes/web.phpにリスト7のコードを追記してください。

[リスト7]routes/web.php
Route::get("/chap6/newBook3", "Chap6Controller@newBook3");

 その後、以下のURLにアクセスしてください。

  • http://localhost/firstlaravel/public/chap6/newBook3

 すると、図3の画面が表示されます。

図3:メソッドインジェクションを確認する画面
図3:メソッドインジェクションを確認する画面

 この実行結果画面を見ると、Bookクラスのインスタンスは確かに生成されているのですが、リスト6のnewBook3()メソッド内には、Bookクラスをnewするコードも、resolve()でインスタンスを取得するコードも存在しません。ここでポイントとなるのはnewBook3()メソッドの引数です。

 Laravelでは、コントローラクラスのメソッドの引数として型指定を行うと、その型に該当するクラスを探し出し、インスタンスを渡す仕組みがあります。これもサービスコンテナの働きです。

サービスコンテナによるコンストラクタインジェクション

 引数を使ってインスタンスを渡すこの仕組みは、コントローラクラスのメソッドだけでなく、コンストラクタにも有効です。例えば、リスト8のようなコードです。

[リスト8]app/Http/Controllers/Chap6Controller.php
<?php
〜〜省略
use App\Chap6\Magazine;

class Chap6Controller extends Controller
{
	private $magazine;
	public function __construct(Magazine $magazine)
	{
		$this->magazine = $magazine;
	}
	〜省略〜
}

 Chap6Controllerにリスト8の太字のuse文と、プロパティ、コンストラクタを追記してください。ここで利用しているMagazineクラスは、例えば、リスト9のようなクラスです。

[リスト9]app/Chap6/Magazine.php
<?php
namespace App\Chap6;

class Magazine
{
	public function __construct()
	{
		print("<p>Magazineクラスのコンストラクタが実行されました。</p>");
	}
}

 追記、クラスファイルの作成が終了したら、前項でアクセスした以下のURLにもう一度アクセスしてください。

  • http://localhost/firstlaravel/public/chap6/newBook3

 すると、今度は図4の画面が表示されます。

図4:コンストラクタインジェクションを確認する画面
図4:コンストラクタインジェクションを確認する画面

 図3と見比べると表示が1行増えており、これがまさにMagazineクラスのインスタンスが生成されたことを物語っています。そのMagazineクラスはChap6Controllerクラスのコンストラクタの引数として記述されています。このように、コントローラクラスのコンストラクタに型指定された引数がある場合、Laravelのサービスコンテナは、そのインスタンスを自動生成して渡してくれる仕組みとなっているのです。

次のページ
Laravelのサービスプロバイダ

この記事は参考になりましたか?

人気のPHPフレームワークLaravelを習得しよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11865 2019/12/26 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー