PHP / Laravel でサクッとAPI作る

サクッと Laravel で API を作るためのメモ

# バージョン

PHP 7.3.29
Laravel 8系

# artisan コマンド

「職人」を意味する言葉。
Laravelが用意しているコマンドラインインターフェイス。
モデルやコントローラーもこのコマンドで作成する。

## 参考
https://readouble.com/laravel/8.x/ja/artisan.html
https://qiita.com/zaburo/items/37768b743ed6d0e28bf5


# Model 作成

Laravel ではEloquentという[ORM](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E4%BF%82%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0#:~:text=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E4%BF%82%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%EF%BC%88%E8%8B%B1%3A%20Object,%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E9%80%A3%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%A8%E3%82%82%E5%91%BC%E3%81%B6%E3%80%82)を用いてDB接続を行う。情報の取得、追加、更新、削除も可能。

## コマンド
これでモデル作成できる。

```php
// Task モデルの作成
php artisan make:model Task -m
```

モデルが作成されたら `Models/Task.php`が作成される。モデルの関連付けるテーブルと書き込み可能なフィールドを指定する。

```php
class Task extends Model
{
    protected $table = 'tasks';
    protected $fillable = ['title', 'content'];
}
```

## migration ファイル

同時に `database/migration`直下にマイグレーションファイルが作成される。

> マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。ソース管理から変更を取得した後に、ローカルデータベーススキーマにカラムを手動で追加するようにチームメートに指示する必要があったことを経験していれば、データベースのマイグレーションにより解決される問題に直面していたのです。

https://readouble.com/laravel/8.x/ja/migrations.html

```php
 public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('content');
            $table->timestamps();
        });
    }
```

## 参考
https://readouble.com/laravel/8.x/ja/eloquent.html

# Controller 作成

> すべてのリクエスト処理ロジックをルートファイルのクロージャとして定義する代わりに、「コントローラ」クラスを使用してこの動作を整理することを推奨します。コントローラにより、関係するリクエスト処理ロジックを単一のクラスにグループ化できます。

https://readouble.com/laravel/8.x/ja/controllers.html

多分ルートに書きすぎたら記述量が増えるからコントローラーに書いて整理する、みたいな感じ。

```php
php artisan make:controller TaskController
```

コマンド実行後 `/Controllers/TaskController.php` が作成される。

```php

// モデルを呼び出す
use App\Models\Task;

class TaskController extends Controller
{
    public function getAllTasks()
    {
        $tasks = Task::get()->toJson(JSON_PRETTY_PRINT);
        return response($tasks, 200);
    }

    public function createTask(Request $request)
    {
        $task = new Task;
        $task->title = $request->title;
        $task->content = $request->content;
        $task->save();

        return response()->json([
            "message" => "task record created"
        ], 201);
    }

    public function getTask($id)
    {
        if (Task::where('id', $id)->exists()) {
            $task = Task::where('id', $id)->get()->toJson(JSON_PRETTY_PRINT);
            return response($task, 200);
        }
    }

    public function updateTask(Request $request, $id)
    {
        if (Task::where('id', $id)->exists()) {
            $task = Task::find($id);
            $task->name = is_null($request->name) ? $task->name : $request->name;
            $task->course = is_null($request->course) ? $task->course : $request->course;
            $task->save();

            return response()->json([
                "message" => "records updated successfully"
            ], 200);
        } else {
            return response()->json([
                "message" => "task not found"
            ], 404);
        }
    }

    public function deleteTask($id)
    {
        if (Task::where('id', $id)->exists()) {
            $task = Task::find($id);
            $task->delete();

            return response()->json([
                "message" => "records deleted"
            ], 202);
        } else {
            return response()->json([
                "message" => "task not found"
            ], 404);
        }
    }
}


```


よかった記事
https://qiita.com/S346/items/9c5718b960eb0501c91f

## Request $request とは

https://readouble.com/laravel/master/ja/requests.html

## Route 作成



api.php
```php
Route::get('tasks', [TaskController::class, 'getAllTasks']);
Route::get('tasks/{id}', [TaskController::class, 'getTask']);
Route::post('tasks', [TaskController::class, 'createTask']);
Route::put('tasks/{id}', [TaskController::class, 'updateTask']);
Route::delete('tasks/{id}', [TaskController::class, 'deleteTask']);
```

# 動作確認

Laravel の API は

![スクリーンショット 2022-04-24 15.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/083a877d-0dee-4bf3-0ef4-b646b523c1d0.png)


![スクリーンショット 2022-04-24 15.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/2d7a2525-3da6-8127-7273-a6e44622612e.png)

おしまい