SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

軽量PHPフレームワークSlimを習得しよう

ルーティング処理をまとめた、Slimのコントローラクラスを使ってみよう

軽量PHPフレームワークSlimを習得しよう 第6回

コントローラクラスのルーティング登録

 コントローラクラスが作成できたところで、次にこのクラスをルーティング登録しましょう。まず、この回で扱うルーティング情報を記載したファイルとしてroutes6.phpを読み込むコードをindex.phpに記述しましょう。これは、リスト2の太字の部分になります。

[リスト2]firstslim/src/public/index.php
<?php
〜省略〜
require_once("../routes5.php");
require_once("../routes6.php");  // (4)
$app->run();

 次に、このroutes6.phpをリスト3の内容で作成しましょう。

[リスト3]firstslim/src/routes6.php
<?php
use CodeZineSlim\FirstSlim\controllers\no6\HelloController;  // (1)

$app->any("/no6/helloWithInvokableController", HelloController::class);  // (2)

 リスト3の(2)がコントローラクラスをルーティング登録している記述です。ルーティング登録メソッドのコールバック関数が記述されていた第2引数に、コントローラクラス名に::classを付与したコードを記述します。これだけです。ルーティング登録メソッドとしてany()を例に構文としてまとめると以下のようになります。

[構文]コントローラクラスのルーティング登録
$app->any(ルーティングパターン, コントローラクラス名::class);

 このように、コントローラクラスを使ったルーティング登録では、クラスそのものを引数として指定するために、事前にuseでクラスを読み込んでおく必要があります。リスト2では(1)がそのコードです。

 ここまで記述できたら実際に以下のURLにアクセスしてみてください。

  • http://localhost/firstslim/src/public/no6/helloWithInvokableController

 特に記述ミスなどなければ、前回の図1と同じ画面が表示されそうですが、実は図1のエラー画面が表示されてしまいます。

図1:リスト1を表示させようとしてエラーになった画面
図1:リスト1を表示させようとしてエラーになった画面

[Note]PHPエラーの場合の画面

 SlimではPHPの実行エラーが発生した場合、Slim本体がそれをキャッチし、専用の画面を表示するようになっています。図1がその画面です。しかし、この画面では、どういったエラーが発生したかわかりません。そこで、エラー内容の詳細を表示する方法があります。これについては、次回、紹介します。

オートロードの設定

 Noteでも紹介したように、図1ではエラーの詳細がわかりませんが、エラーの詳細を表示させた場合、これは、以下の内容となります。

CodeZineSlim\FirstSlim\controllers\no6\HelloController does not exist

 つまり、HelloControllerクラスが読み込めていないことになります。リスト3では(1)のように確実にuseを記述して読み込んでいるのに、これはどういうことでしょうか。

 これは、index.phpの最初に読み込んでいるautoload.phpに問題があります。このautoload.phpについては、第2回で解説しました。その解説中で、autoload.phpはComposerによって自動生成されたファイルであり、それを読み込んでいることを述べました。

 ただ、このautoload.phpでは、Composerコマンドによってvendorフォルダ内にダウンロードされたクラスしか読み込まない設定になっています。HelloControllerのように自作したクラスはこのautoload.phpの読み込み対象には含まれていません。

 そこで、自作クラス類が格納されたclassesフォルダ内のクラスをautoload.phpの読み込み対象とするように変更します。といってもautoload.phpを手動で変更するのではありません。というのは、このautoload.phpはComposerによって作成されたものだからです。変更もComposerによって行います。そのため、まずcomposer.jsonを変更します。リスト4の太字の部分を追記してください。

[リスト4]firstslim/src/composer.json
{
	"require": {
		〜省略〜
	},
	"autoload": {
		"psr-4": {
			"CodeZineSlim\\FirstSlim\\": "classes/"
		}
	}
}

 追記した部分が、classesフォルダ内に作成した自作クラスを読み込むためのオートロード設定部分です。まず、autoloadキーを追記します。これがオートロードに関する設定部分を表します。

 続く値の部分にどのようなオートロード構文なのかを記述します。ここでは、PSR-4(※)に従った記述を表すキーであるpsr-4を記述し、その値として、名前空間のベンダプレフィックスとフォルダの関係を記述します。構文としてまとめると以下のようになります。

[構文]composer.jsonへのオートロード設定
"autoload": {
	"psr-4": {
		"名前空間のベンダプレフィックス": "アプリ内で対応するフォルダ"
	}
}

 今回の自作アプリでは、ベンダプレフィックスであるCodeZineSlim\FirstSlim以下の階層構造がアプリ内のフォルダclasses以下の階層構造と一致していますので、リスト4の記述となります。ただし、名前空間の\(バックスラッシュ)は、JSON中ではエスケープする必要があるため、\\と2個重ねます。

(※)PSRについては、前回、紹介しています。そのうち、No.4がオートロードと名前空間に関する規約が記述されたものです。

 これで、オートロードの設定ができたので、この設定を元にautoload.phpを作り直します。これはComposerコマンドで行います。srcフォルダで、以下のコマンドを実行してください。

composer dump-autoload

 その上で、再度以下のURLにアクセスしてみてください。

  • http://localhost/firstslim/src/public/no6/helloWithInvokableController

 今度は無事、前回の図1と同じ図2の画面が表示されます。

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

次のページ
複数処理のコントローラクラス

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

軽量PHPフレームワークSlimを習得しよう連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11750 2019/10/09 11:00

イベント

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

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

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

メールバックナンバー