Slimの動作原理
無事「Hello World!」が表示されたところで、リスト2の内容を解説しながら、Slimの動作原理を紹介していきます。
autoload.phpの読み込み
PHPによるシステム開発の場合、今ではクラスを利用しないことの方がまれです。ましてやフレームワークを利用するならなおさらです。Slimを利用する場合も同様に、さまざまなクラスを使います。これらのクラスは、通常は名前空間が付与されており、ファイルの上部でuse宣言を記述します。さらに、それらのクラスが記述されたファイル類を自動で読み込むための「オートロード」を利用します※。
※PHPの名前空間とオートロードに関しては、拙記事「PHPの名前空間とクラス名のエイリアス、オートロード 」を参照してください
実は、Composerを利用した場合、このオートロードのためのファイルautoload.phpがvendorフォルダ直下に自動生成されるようになっています。そのため、まずはこのautoload.phpをrequire_onceします。それがリスト2の(1)にあたる以下のコードです。
require_once("../vendor/autoload.php"); // (1)
Slimによる実行はAppクラスのrun()メソッド
Slimによるアプリ実行の大原則は、以下の2ステップです。
- SlimのAppクラスをnewする。
- Appクラスのrun()メソッドを実行する。
1.に対応するのがリスト2の(2)にあたる以下のコードです。
$app = new App(); // (2)
Appクラスというのは、完全修飾名では
\Slim\App
であり、Slimを使ったアプリにおいて一番中心となるクラスです。すべての処理がこのAppクラスを通して行われます。このクラスを、事前にAppという別名でuse宣言しておき、(2)でnewし、$appという変数に格納しています。
2.に対応するのが、リスト2の(6)にあたる以下のコードです。
$app->run(); // (6)
Appをnewした変数$appに対してメソッドrun()を実行することで、Slimが処理を行い、レスポンスが返されます。
Slimのルーティング登録方法
Slimを使ったアプリでは、.htaccessの設定によって、どのURLもindex.phpが実行される仕組みとなっています。では、URLの違いにより処理を変える仕組みはどのようになっているのでしょうか。
Slimでは、Appクラスをnewし、run()メソッドを実行する間、リスト2で言えば、(2)と(6)の間に、URLに対応して実行する関数を登録する処理を記述する約束となっています。これがルーティングの登録です。これは、以下の構文です。
$app->get(ルーティングパターン, 対応するコールバック関数);
リスト2ではルーティングパターンとして
/hello
を登録します。そのコードが(3)にあたる以下のコードです。
$app->get("/hello", // (3)
:
);
このパターンは、このindex.phpが実行されるポイントからの相対パスで記述します。index.phpが実行されるURLは
- http://localhost/firstslim/src/public/
です。これに上記ルーティングパターンを付与したURLである
- http://localhost/firstslim/src/public/hello
へのアクセスがあった場合、続くコールバック関数が実行される仕組みです。リスト2では(4)にあたる以下のコードがコールバック関数にあたります。
function(Request $request, Response $response, array $args): void // (4)
{
:
}
ここでは無名関数として記述しています。コールバック関数のシグネチャは、以下の通りです。
function(Request $request, Response $response, array $args): void または function(Request $request, Response $response, array $args): Response
シグネチャとして2種類ありますが、引数は共通して表1の3個です。
| 引数名 | 引数の型 | 内容 | |
|---|---|---|---|
| 第1 | $request | Psr\Http\Message\ServerRequestInterface | 現在のHTTPリクエストに関する情報を含んだオブジェクト。 |
| 第2 | $response | Psr\Http\Message\ResponseInterface | 現在のHTTPレスポンスに関する情報を含んだオブジェクト。 |
| 第3 | $args | array | ルーティングにおいてプレースホルダ(次回以降解説)を使用する場合、その情報が含まれた配列。 |
シグネチャの違いは、戻り値の違いです。戻り値は原則不要ですが、\Psr\Http\Message\ResponseInterfaceを戻り値としてもかまいません。リスト2では戻り値の不要なパターンを紹介していますが、連載中には戻り値が必要なパターンも紹介していきます。
リスト2のコールバック関数内の処理は(5)にあたる以下のコードです。
print("<h1>Hello World!</h1>"); // (5)
URL http://localhost/firstslim/src/public/hello にアクセスがあった場合に実際に実行される処理がこの(5)の1行であり、これがブラウザに「Hello World!」と表示させている本体です。
Slimの動作原理のまとめ
ここまでの説明、つまり、Slimの動作原理を図としてまとめると図4になります。
Appクラスをnewした$appに対して、get()メソッドを使って、ルーティングパターンとそれに対応するコールバック関数を登録します。その上で、あるURLでアクセスがあった場合、run()メソッド実行時に該当するURLに対応するコールバック関数が実行される仕組みなのです。
ですので、run()メソッド実行までに、必要なルーティングパターンはすべて登録しておく必要があります。もし登録のないURLでアクセスがあった場合、Slimは404エラーとして、図5のような画面を表示します。
これは、試しにURL http://localhost/firstslim/src/public/goodevening でアクセスした場合の画面です。このような画面が表示された場合は、get()メソッドを使ってルーティング登録を行っている箇所を見直してください。
まとめ
今回は、実際にSlimを動作させるためのプロジェクトの作成と、初めてのSlimアプリとして「Hello World!」の表示を行いました。さらに、そのサンプルを使ってSlimの動作原理、特にルーティング登録を紹介しました。
次回は、このルーティング登録のバリエーションを増やしていきます。ルーティング登録はget()メソッド以外にもさまざまな方法があります。それらを紹介していきます。
