複数のHTTPメソッドに対応できるルーティング登録
ルーティング登録用のAppクラスのメソッドには、複数のHTTPメソッドに対応したものが2個あります。次にそれを紹介します。
全てのメソッドに対応したany()
1つ目は、どのHTTPメソッドでも処理を行うルーティングを登録するany()メソッドです。引数はget()やpost()と同じです。実際にany()を使った処理をindex.phpに追記してみましょう。追記するのは、リスト3の太字の部分です。
<?php 〜省略〜 $app->post("/helloPost", 〜省略〜 ); $app->any("/helloAny", // (1) function(Request $request, Response $response, array $args): void { $method = $request->getMethod(); // (2) print("<h1>{$method}でメソッドでこんにちは!</h1>"); } ); $app->run();
リスト3の(1)で、$appのany()メソッドを使ってルーティングを登録しています。ルーティングパターンは「/helloAny」ですので、この処理を呼び出すURLは
- http://localhost/firstslim/src/public/helloAny
です。前節のNoteで紹介したPostmanを使ってDELETEメソッドでアクセスした結果が図4です。
DELETEメソッドでアクセスしてもちゃんと処理が行われています。さらに、アクセスしてきたHTTPメソッドも表示させています。これを可能にしているのが、リスト3の(2)です。前回紹介したように、ルーティング登録のコールバック関数の第1引数である$requestは、Psr\Http\Message\ServerRequestInterfaceインスタンスであり、このメソッドgetMethod()を使うとアクセスしてきたHTTPメソッドを取得できます。
他のHTTPメソッドでアクセスしても同様の処理が可能となっています。
アクセスするHTTPメソッドを選べるmap()
2つ目は、HTTPメソッドを選択できるmap()メソッドです。map()メソッドは引数が1個増え、以下の構文となります。
$app->map(HTTPメソッドの配列, ルーティングパターン, 対応するコールバック関数);
サンプルを作成してみましょう。index.phpにリスト4の太字の部分を追記してください。
<?php 〜省略〜 $app->any("/helloAny", 〜省略〜 ); $app->map(["POST", "GET"], "/helloMap", // (1) function(Request $request, Response $response, array $args): void { print("<h1>POSTまたはGETメソッドでこんにちは!</h1>"); } ); $app->run();
リスト4の(1)で、$appのmap()メソッドを使ってルーティングを登録しています。ルーティングパターンは「/helloMap」ですが、この記述が第2引数となっています。第1引数では、["POST", "GET"]と、HTTPメソッドを文字列として列挙した配列を記述しています。ここに記述されたメソッドのみ処理されるようになります。試しに、この処理を呼び出すURLである
にブラウザでアクセスすると、図5の画面が表示され、無事処理が行われています。
一方、Postmanを使ってPOSTとGET以外のメソッドでアクセスした結果が図6です。
処理が許可されていないことがわかります。
ルーティングプレースホルダ
ルーティングの登録方法を一通り紹介したところで、次にURLにパラメータを埋め込む方法を紹介します。
ルーティングプレースホルダの設定
例えば、何かの商品の詳細情報を表示する画面を表す以下のURLがあるとします。
このURLでは「/showDetail/35」がルーティングパターンとなりますが、このうち、「/showDetail」が詳細画面を表示する処理を表し、「/35」は商品のIDを表すとします。このURLに対応する処理では、商品IDを表す35というパラメータを使って詳細情報を取得、表示するような処理になります。このように、URL中にIDなどのパラメータを含めたいことが多々あります。Slimのルーティング処理ではこのURL中のパラメータをサポートしており、プレースホルダという記述方法をとります。それは、以下の構文のように「/{…}」と波括弧を使います。
/…/{プレースホルダ名}
サンプルで見てみましょう。index.phpにリスト5の太字の部分を追記してください。
<?php 〜省略〜 $app->map(["POST", "GET"], "/helloMap", 〜省略〜 ); $app->get("/showDetail/{id}", // (1) function(Request $request, Response $response, array $args): void { $id = $args["id"]; // (2) print("<h1>IDが{$id}の詳細です!</h1>"); } ); $app->run();
追記が終了したら、上記URLでアクセスしてください。図7の画面が表示されれば成功です。
リスト5の(1)の「/{id}」の部分がプレースホルダを使った記述であり、「id」がプレースホルダ名です。こういった記述のルーティングパターンの場合、SlimはURL中の「/{…}」にあたる部分をパラメータとして扱い、コールバック関数の第3引数である配列$argsにURL中の値を自動的に格納してくれます。配列のキーはまさにプレースホルダ名であり、コールバック関数中ではリスト5の(2)のようにプレースホルダ名を指定することでURL中のパラメータを取り出すことができます。
プレースホルダは複数記述できる
これらのプレースホルダはいくつでも使うことができます。例えば、以下のようなルーティングパターンです。
/showList/{categoryId}/{tagId}/{listSize}
この場合は、$args["categoryId"]、$args["tagId"]、$args["listSize"]でそれぞれのパラメータを取得できます。
例えば、URLとして、
- http://localhost/firstslim/src/public/showList/drink/low/50
でアクセスしてきたとしたら、それぞれのパラメータの値は以下のようになります。
$args["categoryId"]→drink $args["tagId"]→low $args["listSize"]→50
オプションプレースホルダ
さらに、パラメータをオプション扱いにすることもできます。例えば、上記URLのうち、listSizeをオプションとし、省略可能だとします。URLの例としては、以下のものが考えられます。
- http://localhost/firstslim/src/public/showList/food/high
このように、省略可能なプレースホルダを記述する場合は「[/{…}]」と角括弧で囲みます。listSizeを省略可能にするルーティングパターンは以下のようになります。
/showList/{categoryId}/{tagId}[/{listSize}]
ここで、上記のように「/」から角括弧で囲む点に注意してください。
複数のプレースホルダをオプションとする場合
さらに、tagIdとlistSizeをオプションとし、省略可能にしたいとします。URLの例としては、前項のものに加えて以下のものが考えられます。
- http://localhost/firstslim/src/public/showList/side
これは、tagIdとlistSizeの両方が省略されたURLです。この場合は、「/{…}」と角括弧を入れ子(ネスト)にします。上記のようにtagIdとlistSizeを省略可能にするルーティングパターンは以下のようになります。
/showList/{categoryId}[/{tagId}[/{listSize}]]