Laravel7 CRUDのAPIの実装手順

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の日本語文字化けに対応はこちら