Laravel7 auth ユーザー登録 まとめ

#環境
macOS (10.15.4)

Laravel 7.10.2
PHP 7.4.2
MySQL 5.7.26
Apache 2.2.34

#はじめに
laravelのauth認証を用いて、usersテーブルから私が作成したaccountsテーブルでの認証に変更しようと試みたら結構ハマったのでまとめておく。

#デフォルト機能

laravel7ではまず、laravel/uiをインストールする必要がある。そして、用意されている認証機能を作成する。

`````
composer require laravel/ui
php artisan ui vue --auth
`````

#accountsテーブル
私が認証に利用したテーブルを以下に示す。
![スクリーンショット 2020-05-15 8.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380268/1d11b785-78a2-a05e-6e80-65b5f5615c8d.png)


初めに作成したaccountsテーブルにはremember_tokenカラムのデフォルト値を用意していなかったので、新しくマイグレーションファイルを作成して変更しようとしたところ,
php artisan migrate が実行されないエラーが生じた。

原因を調べてみると、composer で “doctrine/dbal” パッケージを追加する必要があるらしい。そのため、以下のコマンドを実行した。

````
composer require doctrine/dbal
````

これで、migrateでカラムの型を変更することができた。

#auth.phpの修正
accountsテーブルで認証するために、いくつか追記、修正する必要がある。

````
<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'accounts',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'accounts',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'accounts',
            'hash' => false,
        ],
    ],

    'providers' => [
        'accounts' => [
            'driver' => 'eloquent',
            'model' => App\Models\Account::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        'accounts' => [
            'provider' => 'accounts',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

    'password_timeout' => 10800,

];
````

#Modelの修正
次にModelの修正をした。追加するカラムだけ追加する必要がある。

````
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\user as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Account extends Authenticatable
{
    //
    use Notifiable;
    
    /**
     * The attributes that are mass assignable.
     * 
     * @var array
     */
    protected $fillable = [
        'name',
        'email', 
        'password',
        'register_date',
        'delete_date',
        'delete_fg',
    ];



    /**
     * The attributes that should be hidden for arrays.
     * 
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     * 
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

}
````

#Controllerの修正
AuthディレクトリのRegisterControllerの中を以下のように修正する。インサート時に、ユーザーの入力以外のデータを必要とする場合は、デフォルト値を用意する必要がある。

````
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use App\Models\Account;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return Account::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'register_date' => date("Y-m-d"),
            'delete_date' => null,
            'delete_fg' => 0,
            'remember_token' => null,
        ]);
    }
}
````

これで、無事にaccountsテーブルにuserを登録することができた。