3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelのmiddlewareでJsonResponseのデータを編集する

Last updated at Posted at 2021-02-16

はじめに

LaravelでREST APIを作成する時、middlewareでRequestObjectに対し、何かしらのデータを編集するという例はかなり目にします。けれどもJsonResponseObjectに対してデータを編集するという例はあまり見かけないのです。かなりあるあるなケースだと思ったのに、あまり検索に引っかからないので書きました。
なお本記事で取り扱うLaravelのバージョンは8、phpのバージョンは7以上を想定しているのであしからず。

よくあるmiddlewareでRequestObjectのデータを編集するやつ

public function handle(Request $request, Closure $next)
{
    $input = $request->all();
    $result = $this->service->repository($input['some_input']);
    $request->merge(['result' => $result]);

    return $next($request);
}

なんかこういう感じで、入力に何かしらのデータが入っていたらDBに問合せて結果をRequestObjectに合流させる的な処理。
バリデーションでやるにはちょっと気持ち悪くて、コントローラで毎回やらせるのは面倒な感じのあれです。
多分LaravelでREST API書いてたら一度は使うと思います。

class Illuminate/Http/Response

何故かなかったmiddlewareでJsonResponseObjectのデータを編集するやつ

public function handle(Request $request, Closure $next)
{
    $input = $request->all();
    $result = $this->service->repository($input['some_input']);
    $request->merge(['result' => $result]);

    $response = $next($request);
    // Get the json_decoded data from the response.
    // mixed getData(bool $assoc = false, int $depth = 512)
    $response_data = $response->getData(true, 512);
    $response_data['result'] = $result;
    $response->setData($response_data);
    return $response;
}

Laravelのhandler内で$next()にRequestObjectを渡すと、コントローラでの処理が終わった後の任意のResponseObjectが返ってきます。
今回はREST APIとしての振る舞いControllerに期待するので、JsonResponseが返る事が期待されます。
そこで、Laravelのapiドキュメントを読みにいくと、丁度getDataとsetDataという素敵なメソッドを発見。
getDataはJsonResponseに入力されたデータをjson_dencodeして返してくれるメソッド。
setDatahはJsonResponseにデータを入れ直せるメソッド。
つまり、getDataで持ってきた配列に任意の処理をしてsetDataにそれを渡せば後付けでJsonResponseのデータの編集ができるというカラクリ。

class Illuminate/Http/JsonResponse

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?