SHOEISHA iD

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

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

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

複数の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}]]

次のページ
ルーティングの外部ファイル化

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
軽量PHPフレームワークSlimを習得しよう連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11401 2019/03/11 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング