PHP
HTTP
Slim3
middleware

Slim 3 Framework のGET,POSTパラメータを利用しやすい形にする.

はじめに

PHPは好きでも嫌いでもないけど,触れてから早3年経ちました.
Webアプリケーション開発を行う際,私はよくLaravelを利用しています.

ですが,開発規模が小さい場合,フルスタックフレームワークのLaravelを使うのはオーバースペックだったりします.
そこで,目をつけたのは軽量フレームワークのSlim3です.

必要な機能は後から注入していけばいいので非常に使い勝手が良いです.

本題

さて,本題です.

このSlim3ですが,Laravelを使ってきた私からすると,
GETやPOSTのパラメータへアクセスするのに手間がかかるのが何とも言い難い気持ちになります.

ちなみに公式によるGET,POSTへのアクセス方法は以下の通りです.

$app->map(['GET', 'POST'], '/test', function ($request, $response, $args) {
    // GET
    $getParams = $request->getQueryParams();
    // POST
    $postParams = $request->getParsedBody();
    // 値の取り出し
    foreach($getParams as $key => $param){
      echo $param;
    }
});

$app->run();

解決策の提案

Slim3はMiddlewareの概念を取り入れています.

そこで,Middlewareを使ってパラメータを取り出しやすい形に加工しましょう.

// ミドルウェア
$mw = function($req, $res, $args){
        $params = [];
        $params['get'] = $req->getQueryParams();
        $params['post'] = $req->getParsedBody();

        // 連想配列をオブジェクトに変換して,'params'というkeyに登録
        $req = $req->withAttribute('params', json_decode(json_encode($params)));

        $response = $next($req, $res);
        return $response;
};

// App
$app->map(['GET', 'POST'], '/test', function ($request, $response, $args) {
    // 'params'の取得
    $params = $request->getAttribute('params');
    // GET parameters
    $getParams = $params->get;
    // POST parameters
    $postParams = $params->post;
    // 値の取り出し
    echo $getParams->test;
})->add($mw);

$app->run();

終わりに

関数を呼び出すよりはまともになったのではないでしょうか.
もっといい呼び出し方があればいいのですが,現状はミドルウェアをうまく利用していくのがいいのかと思います.

また,今回はjson_decode(json_encode($params))により連想配列をオブジェクトへ変換していますが,連想配列のままでいい人はこれを付けない形にすれば大丈夫です.

以上!

Dependency Injection って響きが好き