Edited at

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


はじめに

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

以上で完了です。