Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Laravelにおけるコントローラクラスを理解しよう

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

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

 本連載ではPHPフレームワークのひとつであるLaravelを紹介していきます。Laravelは、「Web職人のためのフレームワーク」というキャッチコピーのもと、ここ数年で人気がうなぎ上りのフレームワークです。連載を通して、その人気の秘密を味わっていただこうと思います。第3回である前回は、Laravelで本格的なHTML画面を表示させるための仕組みである、テンプレートエンジンBladeを紹介しました。今回は、コントローラクラスを扱います。コントローラクラスを導入すると、ルーティング登録のコールバック関数中に記述した処理コードを別のクラスにまとめることができます。

目次

シングルアクションコントローラ

 実際にコントローラクラスを作成する前に、これまでのサンプルにおける、問題点の確認から始めることにします。

コントローラクラスとは

 前回まで紹介してきたサンプルは、全ての処理をルーティング登録のコールバック関数内に記述してきました。記述したコードはあくまでサンプルなので、大した量ではありません。それでも、web.phpは肥大化していきます。ましてや、実際のアプリとなると、処理コードの量はサンプルの比ではなく、web.phpに記述しているとメンテナンス性が著しく低下します。

 そこで、コールバック関数内に記述していた処理コードを別のクラスとして独立させ、ルーティング登録とは別に管理できる仕組みがLaravelには備わっています。この処理コードを記述したクラスのことを「コントローラクラス」と言います。

[Note]MVCのC

 システムやアプリの設計を語ろうとした時によく出てくる言葉に、MVCモデルがあります。かなり昔から使われているモデルなので、ご存じの方も多いと思います。これは、Model、View、Controllerの頭文字をとったものです。MVCをきっちり説明しようとすると、それだけで連載となってしまう内容なので、ここでは簡易的に、以下のようにとらえてください。

  • Model:データ処理を担う部分。
  • View:画面表示処理を担う部分。
  • Controller:MやVの制御を行いながら中心となる処理を担う部分。

 実は、前回紹介したBladeは、LaravelにおけるVと言えます。一方、今回紹介するコントローラクラスは、その名称が示す通り、Cと言えるでしょう。今後の連載中にデータベースとのやり取りの方法を紹介する予定です。これが、Mにあたります。

1処理1クラスのコントローラ

 それでは、実際にコントローラクラスの作り方を紹介していきます。ここでは、まず、前回、画面に「こんにちは! 武者小路さん!」を表示させたリスト3の処理をクラス化してみましょう。

 Laravelでは、コントローラクラスはapp/Http/Controllersディレクトリに作成する約束になっているので、このディレクトリ内にリスト1のHelloBladeWithDataController.phpファイルを作成してください。

[リスト1]app/Http/Controllers/HelloBladeWithDataController.php
<?php
namespace App\Http\Controllers;  // (1)

use App\Http\Controllers\Controller;  // (2)

class HelloBladeWithDataController extends Controller  // (3)
{
	public function __invoke()  // (4)
	{
		$data["name"] = "武者小路";  // (5)
		return view("helloWithData", $data);  // (5)
	}
}

 コントローラクラスを作成する場合、先述の通り、

app/Http/Controllers

 とディレクトリ内に作成する必要があります。それに伴い、クラスの名前空間もこのディレクトリに合わせ、

\App\Http\Controllers

 とする必要があります。それを記述しているのが(1)です。

 また、必須ではありませんが、このコントローラクラスは、以下のクラスを継承した方が、便利なことが多いです。

App\Http\Controllers\Controller

 こうすることで、ミドルウェアの登録メソッドであるmiddleware()やバリデーションを設定するvalidate()メソッドなど、便利なメソッドが使えるようになります。なお、ミドルウェアは次回紹介します。また、バリデーションもこの連載中で扱っていきます。

 便利になるようにControllerクラスを継承する形で記述したのがリスト1の(3)であり、事前にこのクラスを利用できるようにuse宣言しているのが(2)です。

 さて、こうして作成したコントローラクラスに、実際に処理を記述していきます。それは、PHPのマジックメソッドである__invoke()に記述します。それが、リスト1の(4)であり、実際の処理が(5)です。(5)は前回のリスト3のコールバック関数内に記述したものと全く同じです。

 なお、__invoke()メソッドとは、PHPオブジェクトを関数のように扱えるメソッドのことです。詳細は割愛しますが、より詳しい解説は、拙記事「PHPの「マジックメソッド」とは――「__set()」「__get()」「__invoke()」の使い方」を参照してください。

 以上で、コントローラクラスの作成が完了しました。この__invoke()メソッドを利用したコントローラクラスのことを、「シングルアクションコントローラ」と言います。なぜ「シングル」かは後述します。

シングルアクションコントローラのルーティング登録

 次に、作成したシングルアクションコントローラクラスをルーティング登録し、実際に表示させましょう。リスト1のコントローラクラスをルーティング登録するには、リスト2のコードになります。

[リスト2]routes/web.php
Route::get("/chap4/helloBladeWithData", "HelloBladeWithDataController");

 ルート登録メソッドの第2引数に、コールバック関数の代わりにリスト1で作成したコントローラクラスのクラス名文字列を記述するだけです。

 実際に、以下のURLにアクセスしてみます。

  • http://localhost/firstlaravel/public/chap4/helloBladeWithData

 すると、前回の図3と同じ図1の画面が表示され、無事、コントローラクラスで処理が行われたのがわかります。

図1:コントローラクラスを使って表示された画面
図1:コントローラクラスを使って表示された画面

  • ブックマーク
  • 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-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5