Help us understand the problem. What is going on with this article?

LaravelでCRUDのAPIをささっと作る

More than 1 year has passed since last update.

はじめに

LaravelでWebのCRUDアプリケーションをささっと作る Laravel5.6入門 基本CRUD操作を体で覚える という記事を書きましたが、その続きで、作ったコントローラーをそのままAPIにしてみようと思います。

前提

環境情報などはこちらの記事を参照ください。
上記の記事の続きなので、上記の記事が一通り終わっていることが前提です。

Controllers配下にApiディレクトリを作成する

app/Http/Controllers配下にApiディレクトリを作成します。

Apiディレクトリ配下に作成したArticlesController.phpをコピーして配置します。

api.phpにルーティングを設定する

APIのルーティングはroutes/api.phpに記述していきます。
api.phpに以下を記述しましょう。

<?php
Route::group(['middleware' => ['api']], function(){
  Route::resource('articles', 'Api\ArticlesController');
});

以上を行ったら、php artisan route:listでルーティングを確認します。

  Symfony\Component\Debug\Exception\FatalErrorException  : Class 'App\Http\Controllers\Api\Controller' not found

  at /Users/Laravel/form/app/Http/Controllers/Api/ArticlesController.php: 7
  3: namespace App\Http\Controllers\Api;
  4:
  5: use Illuminate\Http\Request;
  6: use App\Article;
  7: class ArticlesController extends Controller
  8: {
  9:     /**
  10:      * Display a listing of the resource.
  11:      *
  12:      * @return \Illuminate\Http\Response

すると上記のようなエラーが表示されました。

コントローラーを修正していく

コピーしたArticlesController.phpに問題があるので、修正をしていきます。
こちらの記事にも書きましたが、namespaceuseを足してあげます。

修正するとArticlesController.phpの上部は以下のようになります。

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Article;
use App\Http\Controllers\Controller;

こちらの状態で再度php artisan route:listを実行してみると以下のようにAPIのルーティングが設定されているかと思います。

スクリーンショット 2018-02-19 12.15.38.png

ルーティングを修正

APIはフォーマットをJSONだけを返すようにしたいので、viewが必要ありません。なので、処理でviewだけを返しているcreate, editは削ってしまいましょう。

routes/api.phpを開き、以下を修正します。

<?php
Route::group(['middleware' => ['api']], function(){
  Route::resource('articles', 'Api\ArticlesController', ['except' => ['create', 'edit']]);
});

exceptを使ってcreateeditのアクションはルーティングを生成しないように除外しました。

php artisan route:listで確認をすると除外されているのが、確認できます。
スクリーンショット 2018-02-19 12.23.12.png

コントローラーのアクションを修正していく

エラーの解消と、ルーティングを設定出来たのですが、APIには必要のないアクションがあるので、それらを削除&修正していきます。

createeditの処理は削除してください。

格アクションを以下のように変更していきましょう!

index

public function index()
{
  $articles = Article::all();
  return $articles;
}

store

public function store(Request $request)
    {
      $article = new Article;
      $article->title = $request->title;
      $article->body = $request->body;
      $article->save();
      return redirect('api/articles');
    }

show

public function show($id)
{
  $article = Article::find($id);
  return $article;
}

update

public function update(Request $request, $id)
{
  $article = Article::find($id);
  $article->title = $request->title;
  $article->body = $request->body;
  $article->save();
  return redirect("api/articles/".$id);
}

destroy

public function destroy($id)
{
  $article = Article::find($id);
  $article->delete();
  return redirect('api/articles');
}

APIの動作を確認する

APIが動作しているかどうかを確認してみましょう。
php artisan serveでビルトインサーバーを起動しておきます。
APIの動作確認には、Postmanを使いましょう。

新規作成

記事をAPIで新規作成してみましょう。

Postmanを起動し、HTTPメソッドをPOSTにし、横のURL入力欄にhttp://localhost:8000/api/articlesとします。
そしてタブメニューのBodykeyvalueを設定してSendを押すことでレコードを新規作成できます。

key value
title ほげタイトル
body ほげ内容

とか入れておきましょう

スクリーンショット 2018-02-19 12.35.06.png

入力するとこんな感じになるかと思います。

入力したら、右上のSendをクリックしましょう。すると、レコードが新規作成されているかと思います。

一覧を確認

一覧の確認はHTTPメソッドをGETに変更し、http://localhost:8000/api/articlesと入力したら、右上のSendをクリックすると下の方にJSONで一覧が返ってくるかと思います。

スクリーンショット 2018-02-19 12.38.01.png

特定のidを取得

特定のidだけを取得するには、HTTPメソッドをGETでURLをhttp://localhost:8000/api/articles/idとすれば取得出来ます。

スクリーンショット 2018-02-19 12.39.53.png

特定のidの情報を更新

こちらに関しては、ちょっと微妙なのですが、なぜかHTTPメソッドのPUTを使用できず、POSTでやるやり方を説明いたします。

PUTでの方法が分かる方はコメントいただければ幸いです

HTTPメソッドをPOSTURLをhttp://localhost:8000/api/articles/idで以下のようにします。

スクリーンショット 2018-02-19 13.22.51.png

以上を見てみるとkeyに_methodが設定され、valueにPUTが指定されています。
PUTでは更新出来ず、一度POSTでリクエストを出す必要がありました。。

レコードの削除

HTTPメソッドをDELETE、URLをhttp://localhost/api/articles/idでSendを押すだけで削除が出来ます!

スクリーンショット 2018-02-19 13.25.40.png

以上で完了です。

sayama0402
Javascript(Riot.js / Vue / React / Nodejs) / PHP(Wordpress, cakePHP, Laravel) / Ruby(Ruby on Rails) / Python(Django) / SQL / Linux / Swift / Docker / AWS / Serverless
http://ken-sayama.hateblo.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away