CodeZine(コードジン)

特集ページ一覧

さまざまなHTTPメソッドに対応した、Slimルーティングの登録方法を知ろう

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2019/03/11 11:00
目次

複数のHTTPメソッドに対応できるルーティング登録

 ルーティング登録用のAppクラスのメソッドには、複数のHTTPメソッドに対応したものが2個あります。次にそれを紹介します。

全てのメソッドに対応したany()

 1つ目は、どのHTTPメソッドでも処理を行うルーティングを登録するany()メソッドです。引数はget()やpost()と同じです。実際にany()を使った処理をindex.phpに追記してみましょう。追記するのは、リスト3の太字の部分です。

[リスト3]firstslim/src/public/index.php
<?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です。

図4:「/helloAny」にPostmanを使ってアクセスした結果画面
図4:「/helloAny」にPostmanを使ってアクセスした結果画面

 DELETEメソッドでアクセスしてもちゃんと処理が行われています。さらに、アクセスしてきたHTTPメソッドも表示させています。これを可能にしているのが、リスト3の(2)です。前回紹介したように、ルーティング登録のコールバック関数の第1引数である$requestは、Psr\Http\Message\ServerRequestInterfaceインスタンスであり、このメソッドgetMethod()を使うとアクセスしてきたHTTPメソッドを取得できます。

 他のHTTPメソッドでアクセスしても同様の処理が可能となっています。

アクセスするHTTPメソッドを選べるmap()

 2つ目は、HTTPメソッドを選択できるmap()メソッドです。map()メソッドは引数が1個増え、以下の構文となります。

[構文]map()によるルーティング登録
$app->map(HTTPメソッドの配列, ルーティングパターン, 対応するコールバック関数);

 サンプルを作成してみましょう。index.phpにリスト4の太字の部分を追記してください。

[リスト4]firstslim/src/public/index.php
<?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の画面が表示され、無事処理が行われています。

図5:「/helloMap」にブラウザでアクセスした結果画面
図5:「/helloMap」にブラウザでアクセスした結果画面

 一方、Postmanを使ってPOSTとGET以外のメソッドでアクセスした結果が図6です。

図6:「/helloMap」にPUTメソッドでアクセスした結果画面
図6:「/helloMap」にPUTメソッドでアクセスした結果画面

 処理が許可されていないことがわかります。

ルーティングプレースホルダ

 ルーティングの登録方法を一通り紹介したところで、次にURLにパラメータを埋め込む方法を紹介します。

ルーティングプレースホルダの設定

 例えば、何かの商品の詳細情報を表示する画面を表す以下のURLがあるとします。

 このURLでは「/showDetail/35」がルーティングパターンとなりますが、このうち、「/showDetail」が詳細画面を表示する処理を表し、「/35」は商品のIDを表すとします。このURLに対応する処理では、商品IDを表す35というパラメータを使って詳細情報を取得、表示するような処理になります。このように、URL中にIDなどのパラメータを含めたいことが多々あります。Slimのルーティング処理ではこのURL中のパラメータをサポートしており、プレースホルダという記述方法をとります。それは、以下の構文のように「/{…}」と波括弧を使います。

[構文]プレースホルダを使ったルーティングパターン
/…/{プレースホルダ名}

 サンプルで見てみましょう。index.phpにリスト5の太字の部分を追記してください。

[リスト5]firstslim/src/public/index.php
<?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の画面が表示されれば成功です。

図7:プレースホルダを使った処理の結果画面
図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}]]

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

もっと読む

著者プロフィール

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

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きた...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5