はじめに
前回の記事でBladeテンプレートを学びました。
EC2のLaravel6.0環境のBladeテンプレートの基礎を学ぶ AWS/Laravel連載(8)
今回はRest APIを作ります。
ちなみに次回でVue.jsを使いテンプレートに表示をします。
モデル、コントローラー、マイグレーションファイルを作る
$ php artisan make:model -mcr Post
上記コマンドで、
- app/Post.php(モデル)
- app/Http/Controllers/PostController.php(コントローラー)
- database/migrations/20xx_xx_xx_xxxxxx_create_posts_table.php(マイグレーションファイル)
が出来上がります。
ルーティングの追加
routes/api.phpに以下1行を追加します。
Route::apiResource('posts', 'PostController');
するとAPI用のルーティングが作られます。
$ php artisan route:list --path=posts
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
| | GET|HEAD | api/posts | posts.index | App\Http\Controllers\PostController@index | api |
| | POST | api/posts | posts.store | App\Http\Controllers\PostController@store | api |
| | GET|HEAD | api/posts/{post} | posts.show | App\Http\Controllers\PostController@show | api |
| | PUT|PATCH | api/posts/{post} | posts.update | App\Http\Controllers\PostController@update | api |
| | DELETE | api/posts/{post} | posts.destroy | App\Http\Controllers\PostController@destroy | api |
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
マイグレーションファイルの修正
xx部分には作成日時が入るので適宜読み換えてください。
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
title, contentという2カラムを追加した状態でテーブルを作ります。
timestampsはcreated_at, updated_atという2カラムが自動で追加され、レコード生成日時がcreated_atに、最終更新日時がupdated_atに入るようになります。原則入れることになるかと思います。
$ php artisan migrate
シーディングの設定
テーブルはできましたがレコードがありません。
動作確認がしづらいので、初期レコードを生成しましょう。
$ php artisan make:seeder PostsTableSeeder
<?php
use Illuminate\Database\Seeder;
class PostsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('posts')->insert([
'title' => 'hoge',
'content' => 'fuga',
]);
}
}
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(PostsTableSeeder::class);
}
}
$ php artisan db:seed
Seeding: PostsTableSeeder
Database seeding completed successfully.
レコードが発行されたかtinkerで調べてみましょう。
$ php artisan tinker
>>> Post::all();
[!] Aliasing 'Post' to 'App\Post' for this Tinker session.
=> Illuminate\Database\Eloquent\Collection {#3087
all: [
App\Post {#3088
id: 1,
title: "hoge",
content: "fuga",
created_at: null,
updated_at: null,
},
],
}
hoge, fugaという決め打ちではなく、FakerとFactoryという仕組みでダミーデータを生成する方法も別記事で紹介しています。
気になる方は以下記事を参照してください。
EC2のLaravel6.0環境 VueとLaravelでのTIPS AWS/Laravel連載(10.5)
コントローラーの設定
<?php
namespace App\Http\Controllers;
use App\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return Post::latest()->paginate();
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
return Post::create($request->all());
}
/**
* Display the specified resource.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function show(Post $post)
{
return $post;
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Post $post)
{
$post->update($request->all());
return $post;
}
/**
* Remove the specified resource from storage.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function destroy(Post $post)
{
$deleted = $post->delete();
return compact('deleted');
}
}
LaravelはEloquentオブジェクトをreturnするとjsonで返してくれる模様。
上記設定ができたら、Webブラウザでアクセスしてみます。
http://【EC2インスタンスのIP】/api/posts
{"current_page":1,"data":[{"id":1,"title":"hoge","content":"fuga","created_at":null,"updated_at":null}],"first_page_url":"http:\/\/【EC2インスタンスのIP】\/api\/posts?page=1","from":1,"last_page":1,"last_page_url":"http:\/\/【EC2インスタンスのIP】\/api\/posts?page=1","next_page_url":null,"path":"http:\/\/【EC2インスタンスのIP】\/api\/posts","per_page":15,"prev_page_url":null,"to":1,"total":1}