シングルアクションコントローラ
実際にコントローラクラスを作成する前に、これまでのサンプルにおける、問題点の確認から始めることにします。
コントローラクラスとは
前回まで紹介してきたサンプルは、全ての処理をルーティング登録のコールバック関数内に記述してきました。記述したコードはあくまでサンプルなので、大した量ではありません。それでも、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ファイルを作成してください。
<?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のコードになります。
Route::get("/chap4/helloBladeWithData", "HelloBladeWithDataController");
ルート登録メソッドの第2引数に、コールバック関数の代わりにリスト1で作成したコントローラクラスのクラス名文字列を記述するだけです。
実際に、以下のURLにアクセスしてみます。
- http://localhost/firstlaravel/public/chap4/helloBladeWithData
すると、前回の図3と同じ図1の画面が表示され、無事、コントローラクラスで処理が行われたのがわかります。