🗂

【Laravel】Sanctomを使用してSPAでの会員登録を実装する

2021/05/22に公開

使用環境

  • Laravel Framework 8.32.1

フロント側

フロントからは、名前、メールアドレス、パスワードが渡される想定です。

作成までの流れ

  1. Laravel Sanctomのインストールしてデータベースを作成する
  2. Laravel Sanctomの使用設定をする
  3. APIでの会員登録実装
  4. フロント側の作成

Laravel Sanctomのインストール

下記のコマンドでインストール

$ composer require laravel/sanctum

設定ファイルとマイグレーションのインストール

$ php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

コマンド実行により/config/sanctum.phpと、
/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.phpが作成されます。

$ php artisan migrate

データベースを作成されます。

Laravel Sanctomの使用設定をする

Kernel.phpにミドルウェアの追加

app/Http/Kernel.php
protected $middlewareGroups = [
        'web' => [
            /* 省略 */
        ],

        'api' => [
            EnsureFrontendRequestsAreStateful::class,//追記
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

User ModelにHasApiTokensトレイトを追加する

app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;//追記

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;//追記
    /* 省略 */

APIでの会員登録実装

今回は、app/Http/Controller/Api/Auth配下にファイルを作成していきます。

app/Http/Controller/Api/Auth/RegisterController.php
<?php

namespace App\Http\Controllers\Api\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Symfony\Component\HttpFoundation\Response;
use App\Http\Controllers\Controller;
use App\Http\Requests\RegisterRequest;
use App\Providers\RouteServiceProvider;
use App\Models\User;

class RegisterController extends Controller {
    public function register(RegisterRequest $request) {
        User::create([
            'name' =>  $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        return response()->json(['created' => true], Response::HTTP_OK);
    }
}

バリデーションは、app/Http/Requests内に記載します。

app/Http/Requests/RegisterRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Symfony\Component\HttpFoundation\Response;


class RegisterRequest extends FormRequest {
    public function authorize() {
        return true;
    }

    public function rules() {
        return [
            'name'    => //必要なバリデーション,
            'email'    => //必要なバリデーション,
            'password' => //必要なバリデーション,
        ];
    }

    protected function failedValidation(Validator $validator) {
        $res = response()->json([
            'status' => Response::HTTP_BAD_REQUEST,
            'errors' => $validator->errors(),
        ], Response::HTTP_BAD_REQUEST);
        throw new HttpResponseException($res);
    }

}

ルーティングを記載します。

routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\Auth\RegisterController;//追記

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
//会員登録
Route::post('/register', [RegisterController::class, 'register']);//追記

これでバックエンド側の処理は完了しました。

参考記事

https://codelikes.com/use-laravel-sanctum/

Discussion