Laravelやってみる#8―API経由でのCRUD

  • Laravel 7.x

ぬにょす(挨拶)。

表題の通りですが、PHPフレームワークであるところのLaravelを使ってみようということで、やったこと・できたこと・できなかったこと等を自分の備忘録として残していきます。

#8の今回はLaravelのVueフロントエンドからAPI経由で基本的なCRUDを実装してみます。なお、話を簡単にするため認証ガードなどの余計なミドルウェアは挟みません。

モデルとコントローラーの作成

artisanコマンドで一気に作ります。

php artisan make:model -a --api Category

-a オプションを付与することでコントローラーやマイグレーションファイルなども作成します。--api オプションを付与することでフォーム出力用のアクション(create, edit)を省いたコントローラーを作成します。

マイグレーション

https://readouble.com/laravel/7.x/ja/migrations.html?header=%25E3%2582%25AB%25E3%2583%25A9%25E3%2583%25A0%25E4%25BD%259C%25E6%2588%2590

マイグレーション用のファイル(database/migrations/YYYY_MM_DD_hhmmss_create_categories_table.php)が作成されているので、テーブル作成処理を追加します。

    Schema::create('categories', function (Blueprint $table) {
      $table->id();
      /*追加*/$table->string('name');
      $table->timestamps();
    });

artisan コマンドでマイグレーションを実行します。

php artisan migrate

モデル

https://readouble.com/laravel/7.x/ja/eloquent.html?header=%25E8%25A4%2587%25E6%2595%25B0%25E4%25BB%25A3%25E5%2585%25A5

複数代入を利用するために、カラムに関する制約を追加します。

app/Category.php
class Category extends Model
{
  protected $guarded = [
    'id',
    'created_at',
    'updated_at',
  ];
}

$fillable プロパティで代入を許可するカラムを指定する方法と、$guarded プロパティで代入を禁止するカラムを指定する方法があります。今回は後者でやってみました。

コントローラー

index / 全件表示

app/Http/Controllers/CategoryController.php
  public function index()
  {
    return Category::all();
  }

モデルの all メソッドの結果をそのまま返します。

store / INSERT処理

app/Http/Controllers/CategoryController.php
  public function store(Request $request)
  {
    $category = new Category($request->all());
    $category->save();
    return response()->json();
  }

リクエストされたデータでモデルを作成し、保存します。

update / UPDATE処理

app/Http/Controllers/CategoryController.php
  public function update(Request $request, Category $category)
  {
    $category->fill($request->all())->save();
    return response()->json();
  }

モデルをリクエストデータで更新して、保存します。

destroy /DELETE処理

app/Http/Controllers/CategoryController.php
  public function destroy(Category $category)
  {
    $category->delete();
    return response()->json();
  }

モデルの delete メソッドで削除します。

ルーティング

https://readouble.com/laravel/7.x/ja/controllers.html?header=API%25E3%2583%25AA%25E3%2582%25BD%25E3%2583%25BC%25E3%2582%25B9%25E3%2583%25AB%25E3%2583%25BC%25E3%2583%2588

APIルートを追加します。コントローラーを artisan コマンドで作成したので、Route::apiResources メソッドを呼ぶだけで完了です。

routes/api.php
Route::apiResources([
  'category' => 'CategoryController',
]);

php artisan route:list コマンドで Method と URI を確認し、Postman などから実行してみるとデータベースが更新されるはずです。

まとめ

artisan コマンドや Route::apiResource(s) メソッドなど、Laravel フレームワークが提供する機能を活用することで、最低限の機能は簡単に実装することができました。

実際にはバリデーションや例外処理、ルート保護なども必要になってくるでしょう。残念ながら私にはまだそこまでの知識はありません。もっとドキュメントを読んで、トライ&エラーを繰り返して、分かったことが増えてきたら備忘録として投稿したいと思います。

記事の一覧へ