SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【最新Laravelアップデート解説】Laravelの変更点まとめ

Laravel 13の新機能、PHPアトリビュートとJSON:API

【最新Laravelアップデート解説】Laravelの変更点まとめ 第2回

APIレスポンスJSONの標準形式であるJSON:APIをサポートした新しいリソース

 次に紹介するのは、EloquentのAPIリソースに新しく追加されたJSON:APIリソースです。

APIリソースとその作り方

 LaravelでWeb APIを作成しようとすると、Eloquentのモデル内のプロパティのデータを加工してJSONデータとし、それをレスポンスとすることが多々あります。場合によっては、プロパティのデータそのものを、ほぼ加工なしにJSONデータとすることもあります。

 こういった処理を簡単に実装できる仕組みとして、LaravelにはAPIリソースがあります。

 たとえば、カクテル情報を管理するモデルとしてCocktailがあるとして、このモデルを利用してJSONデータを生成したい場合、リスト1のクラスを作成します。

[リスト1]att-json/app/Http/Resources/CocktailResource.php
<?php
  :
class CocktailResource extends JsonResource  // (1)
{
  public function toArray(Request $request): array  // (2)
  {
    return [
      "id" => $this->id,
        :
    ];
  }
}

 こういったクラスをリソースクラスと言い、app/Http/Resources/フォルダー内に「モデル名+Resource」クラス名で作成します。

 そして、リスト1の(1)のように、JsonResourceクラスを継承して作成します。その上で(2)のtoArray()メソッドを作成します。このメソッドの戻り値として、JSONデータとする配列を定義します。この配列は、モデルクラスに保持したデータベースの1件分のデータを加工して作成します。その際、モデルが保持したデータは、$this->でアクセスできます。

 なお、こういったクラスのスケルトンコードを自動生成してくれるartisanコマンドも用意されています。次のコマンドです。

php artisan make:resource リソースクラス名

リソースクラスの使い方

 こうしたクラスを作成しておくと、あとはコントローラクラスでリスト2のコードを記述するだけです。

[リスト2]att-json/app/Http/Controllers/Api/CocktailController.php
<?php
  :
class CocktailController extends Controller
{
  public function index()
  {
    return Cocktail::all()->toResourceCollection();  // (1)
  }
  public function show(Cocktail $cocktail)
  {
    return $cocktail->toResource();  // (2)
  }
}

 リスト2の(1)のように、モデルクラスのメソッドを利用して取得したリストデータに対して、toResourceCollection()メソッドを実行し、その結果をリターンするだけです。これだけで、リソースクラスを利用したJSONデータを生成し、リスト3の通りJSONデータがレスポンスとして返ってきます。

[リスト3]リスト2の(1)の結果
{
  "data": [
    {
      "id": 1,
      "name": "…",
        :
    },
      :
  ]
}

 もし、1件だけのJSONデータを取得するAPIとしたい場合は、コントローラクラスではリスト2の(2)のように、モデルオブジェクトに対してtoResource()メソッドを実行し、その結果をリターンするだけです。

JSON:APIとは

 ここまで紹介したAPIリソース機能は、これまでも存在したものです。これに、バージョン13で新たに追加されたのがJSON:APIリソースです。

 リスト3を見てもわかるように、通常のリソースクラスを利用した場合、レスポンスとなるJSONデータの各オブジェクト構造は、モデルのプロパティを加工したものが列挙されているだけです。リスト1のtoArray()メソッドの処理がそのようになっているため当然です。

 一方、最近のWeb APIには、JSON:APIが登場しています。これは、Web APIのレスポンスJSONデータの形式を統一しようというものであり公式Webサイトに詳細が記載されています。

 その概略を記載すると、リスト4のJSONデータ構造となります。dataプロパティの配列オブジェクトにおいて、idプロパティとtypeプロパティが必須として設定されており、各データは、attributesプロパティオブジェクト内に列挙する形となっています。

[リスト4]JSON:APIの構造
{
  "data": [
    {
      "id": IDの値
      "type": リソースの種類
      "attributes": {
        カラムの値,
          :
      }
    },
      :
  ]
}

JSON:APIリソースの作り方

 このJSON:API形式に従ったJSONデータをレスポンスとするための仕組みが、バージョン13で導入されました。そういったリソースのコントローラでの使い方は、通常のリソースと同じです。

 一方、作り方は異なります。クラスを作成する場合のコマンドは、次のように--json-apiオプションをつけます。

php artisan make:resource リソースクラス名 --json-api

 たとえば、リスト1のCocktailResourceをJSON:APIリソースとして作成すると、リスト5のコードとなります。

[リスト5]att-json/app/Http/Resources/CocktailJsonApiResource.php
<?php
  :
class CocktailJsonApiResource extends JsonApiResource  // (1)
{
  public $attributes = [  // (2)
    "name",
      :
  ];
  public $relationships = [  // (3)
  ];
  public function toType(Request $request): string  // (4)
  {
    return "cocktails";
  }
}

 まず、リスト5の(1)のように、JsonApiResourceを継承して作成します。その上で、クラス内には(2)のように、$attributesプロパティを、カラム名の配列として定義します。ここに定義したカラム名(モデルのプロパティ名)のデータが、そのままレスポンスJSONデータのattributesプロパティオブジェクト内に列挙されます。

 その際に、カラムデータの加工が必要な場合は、$attributesプロパティの代わりに、次のtoAttributes()メソッドを定義します。メソッド内のコードは、通常のリソースクラスのtoArray()メソッドと同じです。

public function toAttributes(Request $request): array
{
  return [
    "name" => $this->name,
      :
  ];
}

 さらに、リレーション先を指定したい場合は(3)のように、$relationshipsプロパティに配列としてリレーション先テーブル名を列挙します。

 同様に(4)のように、toType()メソッドも定義できます。こちらは、その戻り値がレスポンスJSONデータのtypeプロパティの値として利用されます。もしこのメソッドが定義されていない場合は、リソースクラス名からResourceを取り除いた文字列をスネーク記法に変更し、最後を複数形にした文字列がtypeプロパティの値として利用されます。たとえば、CocktailJsonApiResourceクラスの場合は、cocktail_json_apisとなります。

 また、リスト5にはありませんが、toId()メソッドを定義することで、データベース上のidの値とは別の値を、レスポンスJSONデータのidプロパティの値として指定できるようになります。

次のページ
いくつかの破壊的変更に注意する必要があるInertia 3

この記事は参考になりましたか?

【最新Laravelアップデート解説】Laravelの変更点まとめ連載記事一覧
この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/24524 2026/06/19 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング