本記事では、Laravelを使って高速でapiサーバーを作る方法をおつたえしていきます。
もくじ
そもそもApiサーバーとは?
簡単に言うと、リクエストを受け取ってサーバー側の処理のみを行うことに特化したものです。
以前書きました、Laravelのライフサイクルのviewの部分がないverだというイメージで良いでしょう。。ライフサイクルについてはこちらからご覧になれます。
laravelライフサイクル-リクエスト発生からレスポンスを返続きはこちら
viewの部分を,Laravelからデータを受け取って、別のプログラム言語でレンダリングします。最近の流れですと、、 フロントエンドにvue,reactなどを使ってSPAを作成して、バックエンドとしてLaravel,Railsを使うことを増えてきています。
私自身も最近は、LaravelとNuxtの組み合わせで作ることが増えてきています。
Laravelを使ったapiサーバーの作り方
さて状況説明が終わったところで、apiサーバーを作っていきましょう。
まずは、別のipアドレスからリクエストを送るようになる場合は、CORSの設定が必要になります。具体的な方法については、こちらをご覧ください。
CORSの根本的な理解+Laravelでの実装仕方を解説続きはこちら
apiでのデータ呼び出し(CRUDのR)
apiサーバーを作る上でLaravelのレスポンスとそれに付随してLaravelのライフサイクルを知っている必要があります。よくわからない・・・という方はまずは下記記事をお読みください。
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それぞれのapiルートとコントローラーメソッドを作成してください。
Laravel apiサーバーを高速で作ってその先には?
Laravelを使うことでapiサーバーの作成がだいぶ便利になりますね!CORSの設定でつまづくこともあると思いますが、Laravelapiサーバーを作ることができたその先には、Reactやvueといった最先端のフロントエンドを学んでいくことでプログラマーとしての表現力の幅を増やしていくのが良いでしょう。
VueやReactを学ぶには?
Reactやvueといった分野は動きが早く、書籍だとなかなか追いついていないのが現状です。かろうじて何冊かはでているので紹介しておきます
書籍で学べるのはこの辺でしょうか。この場合はudemy の方がよいでしょう。udemyだと結構頻繁にでているので、困ることは少ないです。もし、直接学びたい、、という場合は、techboost
が候補に上がってくるでしょう。というか、現状日本のプログラミングスクールでReactを教えているところはここだけです。残念ながら他はありませんね。
是非とも、Laravelapiをマスターしてそのあとは、フロントエンドにも挑戦してみてくださいね!
コメントを残す