無駄と文化

実用的ブログ

Slimフレームワークで整形された JSON レスポンスを返す

f:id:todays_mitsui:20160407012622j:plain


Slim フレームワークは PHP 製のマイクロフレームワークです。

Ruby 製の Sinatra というフレームワークにインスパイアされて作られたもので。リクエストのルーティングと、それに応答する処理を記述するだけで Web アプリが作れる、その名の通り最小限(マイクロ)でシンプルなフレームワークです。

どれくらいシンプルなのか、 Slim フレームワーク公式サイトのトップページ を見てもらうと感じが掴めると思います。


この Slim フレームワーク、昨年2015年の12月に Slim 3.0.0 がリリースされ、バージョン2系列から大幅にパワーアップしました。
最小構成で Web アプリが作れるお手軽さはそのままに、PSR-7 に準拠して他のライブラリとの連携がやりやすくなりました。

個人的には「パワーアップしたな」っていう感想ではなく「カッコ良くなったな」と感じています。


Slim で JSON レスポンスを返す

本題に入ります。とは言っても小ネタですが。

Slimフレームワークは普通の HTML形式(text/html) でレスポンスを返す方法の他に、JSON形式 (application/json) でレスポンスを返す方法も標準でサポートしています。

私が Slim を使うときは手軽に JSON API を構築したいときなので、レスポンスはもっぱら JSON形式ですね。


具体的には Response クラスの withJson() というメソッドを使って、

<?php

$app = new \Slim\App;

$app->get('/hello/{name}', function ($request, $response) {
    $name = $request->getAttribute('name');
    
    $data = [
        "status" => "OK",
        "name" => $name,
    ];

    return $response->withJson($data);
});

とすれば、Content-Type ヘッダーも適切に設定した上で JSON 形式のレスポンスを返してくれます。


ただ、


このやり方で JSON を返すと、結果は

{"status":"OK","name":"foobar"}

というように1行になっていて、開発中に生の JSON レスポンスを見に行ったときなど、非常に読みづらいんです。


Slim で整形された(pretty-print された) JSON レスポンスを返す

JSON レスポンスをいい感じに整形して(pretty-printして) 返してもらう方法です。

結論から言うと、

<?php

$app = new \Slim\App;

$app->get('/hello/{name}', function ($request, $response) {
    $name = $request->getAttribute('name');
    
    $data = [
        "status" => "OK",
        "name" => $name,
    ];

    return $response->withJson($data, 200, JSON_PRETTY_PRINT);
});

このようにします。


withJson() は第3引数にオプションを指定することができます。 オプションは標準関数である json_encode() と同じものを使ってねと公式に書いてあるので、JSON_PRETTY_PRINT を指定することで整形された JSON がレスポンスとして返ります。

{
    "status": "OK",
    "name": "foobar"
}

このように。


どうやら widthJson() は内部で json_encode() を使って実装されているようです。 なのでオプションも同じものでオッケィ!ということですね。

この方法の弱点は第3引数を指定するために第2引数(ステータスコード)を省略出来なくなることくらいでしょうか。


結構需要ありそうな Tips なのに公式サイトの目立つところには書かれていないので紹介させていただきました。


私からは以上です。