コントローラクラスのルーティング登録
コントローラクラスが作成できたところで、次にこのクラスをルーティング登録しましょう。まず、この回で扱うルーティング情報を記載したファイルとしてroutes6.phpを読み込むコードをindex.phpに記述しましょう。これは、リスト2の太字の部分になります。
<?php
〜省略〜
require_once("../routes5.php");
require_once("../routes6.php"); // (4)
$app->run();
次に、このroutes6.phpをリスト3の内容で作成しましょう。
<?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のエラー画面が表示されてしまいます。
[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の太字の部分を追記してください。
{
"require": {
〜省略〜
},
"autoload": {
"psr-4": {
"CodeZineSlim\\FirstSlim\\": "classes/"
}
}
}
追記した部分が、classesフォルダ内に作成した自作クラスを読み込むためのオートロード設定部分です。まず、autoloadキーを追記します。これがオートロードに関する設定部分を表します。
続く値の部分にどのようなオートロード構文なのかを記述します。ここでは、PSR-4(※)に従った記述を表すキーであるpsr-4を記述し、その値として、名前空間のベンダプレフィックスとフォルダの関係を記述します。構文としてまとめると以下のようになります。
"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の画面が表示されます。
