前のページでコメントを JSON 形式で1件取得することができました.
C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/1/ ⏎
{"data":{"id":1,"title":"\u6700\u521d\u306e\u30b3\u30e1\u30f3\u30c8","body":"\u6700\u521d\u306e\u30b3\u30e1\u30f3\u30c8\u3067\u3059\uff01","created_at":"2023-10-02T01:10:10.000000Z","updated_at":"2023-10-02T01:10:10.000000Z"}}
C:\Users\Rinsaka>
しかしながら,日本語などの文字列が Unicode エンコーディングされており,日時もデータベースの内容と9時間ずれていました.ここではその修正を行います.
まず,コメントリソースに withResponse()
関数を定義して,文字列を Unicode エスケープしないようにします.
app/Http/Resources/CommentResource.php
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class CommentResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
/**
* Customize the outgoing response for the resource.
*
* @param \Illuminate\Http\Request
* @param \Illuminate\Http\Response
* @return void
*/
public function withResponse($request, $response)
{
$response->header('Charset', 'utf-8');
$response->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
}
これによりタイトルや本文を読むことができるようになりました.
C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/1/ ⏎
{"data":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","created_at":"2023-10-02T01:10:10.000000Z","updated_at":"2023-10-02T01:10:10.000000Z"}}
C:\Users\Rinsaka>
次に, Carbon で時刻の補正を行います.同時に,登録日時は返さず,更新日時だけを返すように変更します.なお,offsetHours()
は UTC 時間との時差を取得する関数です.
app/Http/Resources/CommentResource.php
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
class CommentResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
// return parent::toArray($request);
return [
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'updated_at' => $this->updated_at->addHours(Carbon::now()->offsetHours),
];
}
/**
* Customize the outgoing response for the resource.
*
* @param \Illuminate\Http\Request
* @param \Illuminate\Http\Response
* @return void
*/
public function withResponse($request, $response)
{
$response->header('Charset', 'utf-8');
$response->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
}
再び API に接続して,いくつかのコメントを順番に取得してみます.日時のずれが解消され,登録日時 (created_at) は表示されなくなりました.
C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/1/ ⏎ {"data":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}} C:\Users\Rinsaka> C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/2/ ⏎ {"data":{"id":2,"title":"2つ目","body":"2つ目のコメントです!","updated_at":"2023-10-02T10:20:10.000000Z"}} C:\Users\Rinsaka> C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/3/ ⏎ {"data":{"id":3,"title":"<三個目>のコメント","body":"シーダによってテスト データを設定します.","updated_at":"2023-10-02T10:30:10.000000Z"}} C:\Users\Rinsaka> C:\Users\Rinsaka>