Laravel高速でapiサーバーを作りjsonでCRUD処理する方法

本記事では、Laravelを使って高速でapiサーバーを作る方法をおつたえしていきます。

そもそもApiサーバーとは?

簡単に言うと、リクエストを受け取ってサーバー側の処理のみを行うことに特化したものです。
以前書きました、Laravelのライフサイクルのviewの部分がないverだというイメージで良いでしょう。。ライフサイクルについてはこちらからご覧になれます。  laravelライフサイクル-リクエスト発生からレスポンスを返laravelライフサイクル-リクエスト発生からレスポンスを返続きはこちら

viewの部分を,Laravelからデータを受け取って、別のプログラム言語でレンダリングします。最近の流れですと、、 フロントエンドにvue,reactなどを使ってSPAを作成して、バックエンドとしてLaravel,Railsを使うことを増えてきています。
私自身も最近は、LaravelとNuxtの組み合わせで作ることが増えてきています。

なぜSPA??
SPAだと動作速度が早くて、かっこいいサイトがすぐに作れると言うのと、コンポーネントを作っていきますので、保守のし易さ、再利用性があります。

Laravelを使ったapiサーバーの作り方

さて状況説明が終わったところで、apiサーバーを作っていきましょう。
まずは、別のipアドレスからリクエストを送るようになる場合は、CORSの設定が必要になります。具体的な方法については、こちらをご覧ください。
 CORSの根本的な理解+Laravelでの実装仕方を解説CORSの根本的な理解+Laravelでの実装仕方を解説続きはこちら

apiでのデータ呼び出し(CRUDのR)

apiサーバーを作る上でLaravelのレスポンスとそれに付随してLaravelのライフサイクルを知っている必要があります。よくわからない・・・という方はまずは下記記事をお読みください。

まずは簡単なデータの呼び出しから行なっていきましょう。認証処理がない場合、リクエストに対して、jsonをレスポンスで返すだけです。 Laravelではjsonを返す方法は3つあります。

その1 配列を返す

Laravelでは配列を返すだけで、jsonを返してくれます。またhttpヘッダーのContent-Typeもapplication/jsonに変換してあります。そのため、楽にJsonを作ることができます。

その2 jsonに変換するメソッドを使う

レスポンスをメソッドによってjsonに変換していきます。単に配列を返したい場合は、json()に引数として渡してください。

json( )
public function index(){

   return response()->json();

}

変換元がコレクションの場合はto Jsonを使用してください。

その3, おすすめ!リソースクラスを作成する

3つのうちでこの方法がおすすめです!
Laravelのリソースクラスを使うことで、モデルやモデルコレクションを容易にJSONに変換することができます。

php artisan make:resource UserResource

下記のリソースクラスが作成されます。

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class UserResource extends Resource
{

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

見てもらえればわかりますが、return に配列が定義されています。
つまり、リソースの本質とは、一つ目に紹介した配列がjsonになることを応用したものだということがわかりますね。

モデルの活用がしやすいので、実戦ではこちらを多用することになります。

該当のコントローラーでは、下記のような返し方をします。

use App\User;
use App\Http\Resources\UserResource;

Public function show(){
     return new UserResource(User::find(1));
});

リレーションのあるモデルを呼び出す場合

'posts' => Postcollection($this->posts),

コレクションリソースとは??
単にリソースを使うだけだと、一つのモデルを配列へ変換するだけであるのに対して、コレクションリソースを使用する場合は、モデルのコレクションを配列に転換することになります。

リソースのデータ構造

リソースで返してくるデータ構造は下記のようになっています。dataキーの下にラッピングしていきます。

{
   "data": [
         {
            "id": 1,
            "name": "Eladio Schroeder Sr.",
            "email": "therese28@example.com",
        },
        {
            "id": 2,
            "name": "Liliana Mayert",
            "email": "evandervort@example.com",
        }
    ]
}

*もしこのdataキーでラップしないようにしたい場合は、サービスプロバイダにてベースのリソースクラスに対して下記のように記載してください。

public function boot()
    {
        Resource::withoutWrapping();
    }

条件付き属性を使ったレスポンスを返したい場合

If文で制御構造を作るように、ある条件に基づいてリソースレスポンス属性を含める場合があります。

たとえば、現在のユーザーが”管理者”の場合のみ、ある値を含めてレスポンスを返したい時が考えられるでしょう。

whenメソッドを使用することでこの状況は解決できます。

'secret' => $this->when($this->isAdmin(), 'secret-value'),

この場合、$this->isAdmin()メソッドがtrueを返す時だけ、最終的なリソースレスポンスにsecretのkeyとvalueが付加されます。
一方でメソッドがfalseの場合は、レスポンスを送り返す前に、リソースからsecretキーは削除されます。

apiデータの作成(CRUDのC, CRUDのU, CRUDのD)

基本的にはCUD(作成、更新、削除)の処理は同じです。

リクエストを投げて、データベースへの処理をコントローラーに記載します。CUDそれぞれのapiルートとコントローラーメソッドを作成してください。

Laravel apiサーバーを高速で作ってその先には?

Laravelを使うことでapiサーバーの作成がだいぶ便利になりますね!CORSの設定でつまづくこともあると思いますが、Laravelapiサーバーを作ることができたその先には、Reactやvueといった最先端のフロントエンドを学んでいくことでプログラマーとしての表現力の幅を増やしていくのが良いでしょう。

VueやReactを学ぶには?

Reactやvueといった分野は動きが早く、書籍だとなかなか追いついていないのが現状です。かろうじて何冊かはでているので紹介しておきます

created by Rinker
¥8,210 (2021/10/24 14:07:43時点 Amazon調べ-詳細)

created by Rinker
¥1,222 (2021/10/24 14:07:44時点 Amazon調べ-詳細)

書籍で学べるのはこの辺でしょうか。この場合はudemy の方がよいでしょう。udemyだと結構頻繁にでているので、困ることは少ないです。もし、直接学びたい、、という場合は、techboostが候補に上がってくるでしょう。というか、現状日本のプログラミングスクールでReactを教えているところはここだけです。残念ながら他はありませんね。

是非とも、Laravelapiをマスターしてそのあとは、フロントエンドにも挑戦してみてくださいね!

コメントを残す