👻
JsonResourceがJSONレスポンス内部の (double)0.0 を (int)0 に暗黙変換するのを避ける
class HogeResource extends JsonResource
{
public function toArray($request)
{
return [
'hoge' => 0.0, // $this->hoge
];
}
}
これをそのままレスポンスで返すと、JsonResource
内部処理で 0
にされてしまって、0.0
を期待してパースするプログラムに問題が生じた。
そこで ResourceResponse
と JsonResource
を拡張したベースクラスを作った。
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