Laravel7 CRUDのAPIの実装手順

Laravel7でCRUD機能のGET/POST/PUT/DELETEを持ったAPIを実装するまでの手順を記述してます。
環境
- OS CentOS Linux release 8.0.1905 (Core)
- Composer 1.10.5
- PHP 7.4.5
- Percona Server Ver 8.0.19-10
- Laravel Framework 7.6.2
※CentOs8に Laravel のインストールはこちら
※CentOs8 に Percona Server のインストールはこちら
Laravelアプリケーション作成
任意の場所で、プロジェクトを作成します 。
ここではlaravel-testという名称で作成してます。
laravel new laravel-test
初期設定
.envファイル設定
環境に合わせて Percona Server との接続情報を設定しておきます。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root → ユーザー名を変更
DB_PASSWORD= → パスワードを記述
日本語環境設定
configフォルダ配下の「app.php」のtimezoneとlocalを変更しておきます。
'timezone' => 'Asis/Tokyo',
'locale' => 'ja',
モデル作成
下記のコマンドを実行して、モデルとマイグレーションファイルを作成します。
php artisan make:model Task -m
「app/Task.php」が作成されるので、下記の通りに編集します。
$fillableに指定したカラムはホワイトリストとなり、create()やfill()、update()で値の代入が可能となります。
※$fillableと$guardedの使い方はこちら
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
protected $fillable = [
'subject',
'description',
'complete_date',
'completed',
];
}
テーブル作成
モデル作成時に生成された「database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php」を下記の通りに編集して、テーブルを作成します。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTasksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('subject');
$table->text('description')->nullable();
$table->date('complete_date')->nullable();
$table->boolean('completed');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tasks');
}
}
マイグレーションを実行します。
php artisan migrate
テーブル「tasks」が作成されて、カラムも作成されます。

APIコントローラー作成
次にコントローラーを作成します。
–apiで、 必要なメソッドを自動生成してくれます 。
php artisan make:controller TaskController --api
app/Http/Controllers/TaskController.phpが作成されるので、下記の通りに編集しておきます。
use App/Http/Requests/StoreTask;はバリデーションで、次に実装します。
<?php
namespace App\Http\Controllers;
use App\Task;
use App\Http\Requests\StoreTask;
use Illuminate\Http\Request;
class TaskController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return Task::all();
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(StoreTask $request)
{
Task::create($request->all());
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(StoreTask $request, $id)
{
$update = [
'subject' => $request->subject,
'description' => $request->description,
'completed' => $request->completed,
'complete_date' => $request->complete_date,
];
Book::where('id', $id)->update($update);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
Book::where('id', $id)->delete();
}
}
バリデーション作成
バリデーションを行うためFormRequestクラスを作成します。。
php artisan make:request StoreTask
app/Http/Requests/StoreTask.phpを下記の通りに編集します。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreTask extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'subject' => 'required|max:10',
'description' => 'required|max:100',
'completed' => 'required|max:1',
];
}
}
ルーティング追加
エンドポイントを設定するため、ルーティングを記述します。
routes/api.phpに下記を追加します。
設定すると「 /api/tasks/ 」がエンドポイントとなります。
Route::apiResource('/tasks', 'TaskController');
ルーティングは下記のコマンドで確認できます。
php artisan route:list
<出力結果>
+--------+-----------+------------------+---------------+-------------------------------------------------+--------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+------------------+---------------+-------------------------------------------------+--------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/tasks | tasks.index | App\Http\Controllers\TaskController@index | api |
| | POST | api/tasks | tasks.store | App\Http\Controllers\TaskController@store | api |
| | GET|HEAD | api/tasks/{task} | tasks.show | App\Http\Controllers\TaskController@show | api |
| | PUT|PATCH | api/tasks/{task} | tasks.update | App\Http\Controllers\TaskController@update | api |
| | DELETE | api/tasks/{task} | tasks.destroy | App\Http\Controllers\TaskController@destroy | api |
| | GET|HEAD | api/user | | Closure | api,auth:api |
+--------+-----------+------------------+---------------+-------------------------------------------------+--------------+
起動
起動します。
ここではプライベートIPアドレスにアクセスしたいため「–host 0.0.0.0」オプションを指定してます。
php artisan serve --host 0.0.0.0
確認
実装が完了したので、実際の動作を確認してみます。
POST
まずはPostmanを使用してPOSTして、データを新規作成します。

localで下記のcurlコマンドを実行しても同様です。
curl -X POST http://localhost:8000/api/tasks -d 'subject=test&description=testtesttest&completed=1'
データが作成されていることが確認できます。

GET
次に、GETしてレコードを確認してみます。

localで下記のcurlコマンドを実行しても同様です。
curl http://localhost:8000/api/tasks
<出力結果>
[{"id":6,"subject":"test","description":"hello mebee","complete_date":null,"completed":1,"created_at":"2020-05-14T04:34:34.000000Z","updated_at":"2020-05-14T04:34:34.000000Z"}]
下記の通り、idを指定して取得することも可能です。
curl http://localhost:8000/api/tasks/6
PUT
次に、PUTしてレコードを更新します。

localで下記のcurlコマンドを実行しても同様です。
curl -X PUT http://localhost:8000/api/tasks/6 -d 'subject=testchange&description=hello change&completed=0'
データーベースを確認すると更新されていることがわかります。

DELETE
最後に作成したデータを削除します。

localで下記のcurlコマンドを実行しても同様です。
curl -X DELETE http://localhost:8000/api/tassk/6
データが削除されていることが確認できます。

※JSONの日本語文字化けに対応はこちら
-
前の記事
React.js ライブラリ「react-konva-grid」を使ってEXCEL風のグリッドを実装する 2020.06.19
-
次の記事
Windows10 コマンドでリモートディスクトップ接続を許可に設定する 2020.06.19
コメントを書く