Laravelのsanctumを使ってみた2


新しくルートを設定します。
```routes/api.php
// protected routes
Route::group(['middleware' => ['auth:sanctum']], function () {
    Route::resource('/tasks', TasksController::class);
    Route::post('/logout', [AutoController::class, 'logout']);
});
```
タスクのDBを作ります。
ユーザーとタスクは１対多です。
必要なファイルを作成
```terminal
//リソースコントローラー
php artisan make:controller TasksController -r
//モデルとマイグレーションファイル
php artisan make:model Task -m
//リクエストファイル
php artisan make:request StoreTaskRequest
//リソースファイル
php artisan make:resource TaskResource
```
マイグレーションを編集
```migrations/2023_04_16_132901_create_tasks_table.php
public function up(): void
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->string('name');
            $table->string('description');
            $table->string('priority')->default('medium');
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');
            $table->timestamps();
        });
    }
```



モデルを編集
```Models/Task.php
class Task extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'description',
        'priority',
        'user_id'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
```


データベースを作成
```
php artisan migrate
```


ここでseederとかfactoryとかphpmyadminとかで
taskをいくつか作っておきます。



リソースを編集
```Resource/TaskResource.php
public function toArray(Request $request): array
    {
        return [
            'id' => (string)$this->id,
            'attributes' => [
                'name' => $this->name,
                'description' => $this->description,
                'priority' => $this->priority,
                'created_at' => $this->created_at,
                'updated_at' => $this->updated_at,
            ],
            'relationships' => [
                'id' => (string)$this->user->id,
                'user name' => $this->user->name,
                'user email' => $this->user->email,
            ],
        ];
    }
```

コントローラーを編集
```TasksController.php
use App\Http\Resources\TaskResource;
use Illuminate\Support\Facades\Auth;
略
public function index()
    {
        return TaskResource::collection(
            Task::where('user_id', Auth::user()->id)->get()
        );
    }
```



ここでpostmanでタスクを取得してみる。
urlはhttp://localhost/api/tasks
メソッドはget

Headersの設定に以下を追加
(key) Accept 　　　 (value) application/vnd.api+json
(key) Content-Type (value) application/vnd.api+json

Authorizationに以下を追加
(type) Bearer Token (token) さっき返ってきてたトークン


これでデータが取れたらOK。


　　　　
次に
タスクリソースのstoreメソッドも作っていく。
```StoreTaskRequest.php
class StoreTaskRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'name' => 'required|max:255',
            'description' => 'required',
            'priority' => 'required'
        ];
    }
}
```


```TasksController.php
use App\Http\Requests\StoreTaskRequest;
略
public function store(StoreTaskRequest $request)
    {
        $request->validated($request->all());

        $task = Task::create([
            'user_id' => Auth::user()->id,
            'name' => $request->name,
            'description' => $request->description,
            'priority' => $request->priority,
        ]);

        return new TaskResource($task);
    }
```

ここでpostmanでタスクを作成してみる。
問題なければ他のメソッドも作っていく。


最後にログアウトの処理を作る。
```AutoController.php
public function logout()
    {
        Auth::user()->currentAccessToken()->delete();

        return response()->json([
            'status' => 'success',
            'message' => 'Logged out'
        ],200);
    }
```