Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

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

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2019/12/26 11:00

 本連載ではPHPフレームワークのひとつであるLaravelを紹介していきます。Laravelは、「Web職人のためのフレームワーク」というキャッチコピーのもと、ここ数年で人気がうなぎ上りのフレームワークです。連載を通して、その人気の秘密を味わっていただこうと思います。第5回である前回は、リクエスト処理の前後に処理を挿入できるミドルウェアを紹介しました。今回は、Laravelのサービスコンテナとサービスプロバイダを紹介します。

目次

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ディレクトリ内に作成してください。

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

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

 ソースコードの内容としては特に解説は不要でしょう。このクラスをコントローラクラス内で利用してみます。コントローラクラスは第6回用のコントローラクラスということで、クラス名をChap6Controllerとし、app/Http/Controllersディレクトリ内に作成します。まず、リスト2の内容のファイルを作成してください。

[リスト2]app/Http/Controllers/Chap6Controller.php
<?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のコードを追記してください。

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

 ファイル作成や追記が終了した時点で、動作確認を行っておきましょう。以下のURLにアクセスしてください。

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

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

図1:Bookクラスがnewされたのを確認する画面
図1:Bookクラスがnewされたのを確認する画面

 表示された画面で、1行目に表示されたメッセージは、リスト1の(1)のコンストラクタの中に記述した表示メッセージそのものです。つまり、リスト2の(1)でBookクラスをnewすることで表示されるメッセージであり、この段階でクラスインスタンスの生成が行われているのがわかります。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

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

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きた...

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:人気のPHPフレームワークLaravelを習得しよう
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5