Laravel 10 入門トップページ


目次

  1. API とプロジェクトの概要
  2. プロジェクトの作成と初期設定
  3. データベースのマイグレーション
  4. シーダによるコメントデータの登録
  5. モデルの生成
  6. リソースの生成
  7. GETメソッドを利用した個別コメント取得のAPI作成
  8. 日本語文字列の表示と日時の調整
  9. GETメソッドを利用したコメント一覧取得のAPI作成
  10. データのラップ
  11. POSTメソッドを利用したコメントの新規投稿APIの作成
  12. PUTメソッドを利用したコメント更新APIの作成
  13. DELETEメソッドを利用したコメント削除APIの作成
  14. シーダの拡張
  15. ページネーションの実装
  16. 個別コメントをコントローラで取得
  17. Postman の利用
  18. ユーザ情報を登録する
  19. Sanctum によるユーザ認証
  20. ログインとトークン
  21. コメントとユーザのリレーションシップ
  22. 新規投稿時にユーザIDを記録する
  23. コメントからユーザ名を表示するリレーションシップ
  24. ユーザからコメント一覧を取得するリレーションシップ
  25. 更新と削除の権限設定
  26. 発行済みトークンの取得
  27. トークンの有効期限
  28. レート制限
  29. 閲覧権限の緩和

Laravel で API を開発する

日本語文字列の表示と日時の調整

前のページでコメントを 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>

目次に戻る