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

CodeZine / 2019年5月22日 11時0分

 本連載では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ファイルを作成してください。
<?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の画面が表示され、無事、コントローラクラスで処理が行われたのがわかります。
図1:コントローラクラスを使って表示された画面

WINGSプロジェクト 齊藤 新三[著]

【関連記事】
SlimとテンプレートエンジンTwigを連携させてみよう
PHPフレームワーク「Laravel」におけるビューの使い方を理解しよう
さまざまなHTTPメソッドに対応した、Slimルーティングの登録方法を知ろう
PHPフレームワーク「Laravel」における処理の流れと、ルーティングを理解しよう
はじめてのSlimアプリで「Hello World」を表示させよう~動作原理を理解する

■記事全文へ

この記事に関連するニュース

トピックスRSS

ランキング