[PHP]Slim FrameworkでGETとPOSTの両方処理できるルーティングを書く方法

カテゴリ: SlimFramework

PHPのSlim Frameworkでは、$app->get($pattern, $callable)や、$app->post($pattern, $callable)でそれぞれGET/POSTリクエストが来た時の処理を定義することができます。
今回は、複数の種類のリクエストを一度に定義する方法をいくつか紹介します。

map()メソッドを使う方法

Slim Frameworkの\Slim\Appクラスには、get()やpost()のほかに、map()メソッドが用意されています。
map()メソッドの引数は下記のようになっており、第一引数にarray型で$methodsというパラメータが増えています。

public function map(array $methods, $pattern, $callable)

map()の第一引数に、処理したいリクエストの種類を以下のように列挙することで、GETとPOSTの両方を受付可能です。

$app = new \Slim\App;
$app->map(["GET", "POST"], '/hello', function (Request $request, Response $response) {
    ...
});

ちなみに\Slim\App::get()の実装を見てみると以下のようになっており、単なるmap()メソッドのラッパーです。

// vendor/slim/slim/Slim/App.php
namespace Slim;

class App
{
    public function get($pattern, $callable)
    {
        return $this->map(['GET'], $pattern, $callable);
    }
    ...

map()を使用したときのパラメータ受け取り方法

GETとPOSTを両方受取可能にした場合、リクエストのクエリパラメータはどうやって受けて取ればよいでしょうか?

GETの場合は、クエリストリングは$request->getQueryParams()でパラメータを受け取れます。一方、POSTの場合は、フォームの入力情報を$request->getParsedBody()で受け取り可能です(ちなみにPUTで送信したときもgetParsedBodyで取得できます)。

このため、GETパラメータとPOSTパラメータのどちらで来ても大丈夫なようにするためには、2つの配列をarray_merge()で合体させればよいです。下記のコードで2つのパラメータを合わせることができます。両者で同じ名前のパラメータが重複した場合は、POSSTパラメータのほうが優先されます。

$app->map(["GET", "POST"], '/hello', function (Request $request, Response $response) {
    $getParams = $request->getQueryParams() ?? [];
    $postPutParams = $request->getParsedBody() ?? [];
    $allParams = array_merge($getParams, $postPutParams);

    $body = "ReceivedParam =" . json_encode($allParams);
    return $response->getBody()->write($body);
});

GET, POST以外のすべてのリクエストを一括処理したいとき

HTTPのリクエスト種別にはGET, POSTの他に限らずPUTやDELETE、さらにはPATCH,DELETEなどがあります。すべてのリクエストを受け付けたい場合のために$app->any()が用意されています。

全ての種類のパラメータを受け付けたい場合は、mapの第一引数にリクエストタイプを列挙しなくても、$app->any()メソッドを利用できます。

$app->any('/hello2', function (Request $request, Response $response) {
    $getParams = $request->getQueryParams() ?? [];
    $postPutParams = $request->getParsedBody() ?? [];
    $allParams = array_merge($getParams, $postPutParams);

    $body = "ReceivedParam =" . json_encode($allParams);
    return $response->getBody()->write($body);
});

ちなみにany()の実装を見てみると以下のようになっており、こちらもmap()メソッドのラッパーです。

public function any($pattern, $callable)
{
    return $this->map(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], $pattern, $callable);
}
こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。