SHOEISHA iD

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

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

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

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

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

コントローラクラスとは

 前回まで紹介してきたサンプルは、全ての処理をルーティング登録のコールバック関数内に記述してきました。記述したコードはあくまでサンプルなので、大した量ではありません。それでも、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:コントローラクラスを使って表示された画面

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
コントローラクラスの名前空間

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
人気のPHPフレームワークLaravelを習得しよう連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11524 2019/11/11 19:16

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング