👻

JsonResourceがJSONレスポンス内部の (double)0.0 を (int)0 に暗黙変換するのを避ける

2021/03/17に公開
class HogeResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'hoge' => 0.0, // $this->hoge
        ];
    }
}

これをそのままレスポンスで返すと、JsonResource 内部処理で 0 にされてしまって、0.0 を期待してパースするプログラムに問題が生じた。

そこで ResourceResponseJsonResource を拡張したベースクラスを作った。

APIResourceResponse.php
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceResponse;

class APIResourceResponse extends ResourceResponse
{
    public function toResponse($request)
    {
        return tap(response()->json(
            $this->wrap(
                $this->resource->resolve($request),
                $this->resource->with($request),
                $this->resource->additional
            ),
            $this->calculateStatus(),
            [],
            JSON_PRESERVE_ZERO_FRACTION
        ), function ($response) use ($request) {
            $response->original = $this->resource->resource;

            $this->resource->withResponse($request, $response);
        });
    }
}
APIJsonResource.php
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class APIJsonResource extends JsonResource
{
    public function toResponse($request)
    {
        return (new APIResourceResponse($this))->toResponse($request);
    }
}

Discussion