【Laravel】usersテーブルではない別のテーブルで認証をする

今回、初めて、usersテーブル以外の別のテーブルで認証をする機能を作成したので、メモがてら記事にしておきます。

今回やろうとしたことは、laravelが標準で用意してくれている`usersテーブル`ではなく、自分で作成した`accountsテーブル`で認証することです。

テーブルの中身は結果的に標準装備の`usersテーブル`と同じになってしまいました。（標準のusersテーブルは別で使いました）

# マイグレーションファイルと、モデルを作成

Modelとマイグレーションファイルを同時に作成していきます。

```
$ php artisan make:Model Account --migration
```

##　まずはマイグレーションファイルから作成

標準装備のusersテーブルとカラムが一緒なので、ここはそんな見る必要ないです。

```php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAccountsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('accounts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('accounts');
    }
}

```

## そしてモデルの作成

こちらも標準装備の`User.php`と同じなんですけど、注意点が1個だけあります。

それは、普通にModelを作成すると`Class 〇〇〇〇 extends Model`になると思いますが、認証機能として使いたい場合、`Class 〇〇〇〇 extends Authenticatable`にする必要があります。

そして、`extends Authenticatable`をするために、`use Illuminate\Foundation\Auth\User as Authenticatable;`の記述が必要です。

```php

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; // ←←←← 注目

class Account extends Authenticatable  // ←←←← 注目
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * 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',
    ];
}

```

# 設定の変更

認証機能の設定は`config/auth.php`で行なっています。

```php

'defaults' => [
        'guard' => 'web',
        'passwords' => 'accounts', // usersからaccountsに変更
    ],
```

```php
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'accounts', // usersからaccountsに変更
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'accounts', // usersからaccountsに変更
            'hash' => false,
        ],
    ],
```

```php
  'providers' => [
        'accounts' => [ // usersからaccountsに変更
            'driver' => 'eloquent',
            'model' => App\Account::class, // App\UsersからApp\Accountsに変更
        ],

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

```

```php

 'passwords' => [
        'accounts' => [
            'provider' => 'accounts', // usersからaccountsに変更
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
```

毎回全部を変更すれば良いわけではないと思いますが、今回は標準装備のusersテーブルの認証と全く同じものをaccountsテーブルで実装したかっただけなので、これでOKです！


実際にログインしてみたら完璧にできました！


# 追記：Registerの方でエラーが出たので修正した

ログインは上記の流れでOK何ですけど、登録の方でエラーが出てしまった。

まずは、registerController.phpで、会員登録したらusersテーブルではなく、accountsテーブルに入って欲しいので、

```php

use App\Account; // ←←←これを追加　use App\User;は削除
```

```php
protected function create(array $data)
    {
        return Account::create([ // UserからAccountに変更
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
```

これでOK

そして、バリデーションのところも修正する必要があります。
（これ探すのにちょー時間かかった）

```php
 protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:20'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:accounts'], // 'unique:users'から'unique:accounts'に変更
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

```

 これで会員登録の方も、usersテーブルではなくaccountsテーブルでできるようになります！