【Laravel5.5】ログインするときのテーブルのカスタマイズ

昨今では、Laravel6(LTS)がリリースされたというのに、今頃5.5やってます。
僕の周りの案件はまだ5.5にすらいたってない案件多いからまだいける（ハズ）

#やりたいこと

前置きはさておき、Laravelフレームワークの標準機能「Auth」があると思います。
php artisan make:Authとコマンドを叩けば一撃でログイン機能もろもろを作ってくれます。
ただこの機能、デフォルトだと認証するテーブルをusersに限定しちゃってます。
この仕様のせいで、わざわざテーブル名を書き換えた人とかいたりするのかな？

**私です(;´･ω･)**

ずっと悩んでいたのですが、解決できたのでアウトプットとして記事残そうと思います。
というわけで認証するテーブルをusersからdogに書き換えてみます。（Ｕ＾ω＾）わんわんお！
ここができれば、マルチ認証とかにも手がのびるハズ

##環境
Laravel5.5
PHP7.2
折れない心

##参考
色々なところを参考にさせていただいたのですが、どの記事だったか思い出せず。。。
おそらくこちらの方だったはず(いいねしておけばよかった)
[Laravel 5.7 マルチ認証で管理者とユーザーの認証を分ける](https://qiita.com/PKunito/items/a8300db38ce7d6949106)

僕より詳しい解説してます(;´･ω･)


##①テーブルとモデルの作成
まずはマイグレーションから
マイグレーションに関しては[公式サイト](https://readouble.com/laravel/5.5/ja/migrations.html)

```cmd:cmd
php artisan make:migration create_dog_table
```
マイグレーションファイルができたら、ファイルをいじっていきます。

```php:2019_XX_XX_XXXXXX_create_dog_table.php
<?php

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

class CreateDogTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('dog', function (Blueprint $table) {
            $table->increments('dog_id');
            $table->string('name');
            $table->string('email');
            $table->string('password');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('dog');
    }
}
```
簡単に犬id、名前、メールアドレス、パスワードとログインに必要な最低限の機能は追加しておきます。
できたら、マイグレーションの実行へ

```cmd:cmd
php artisan migrate
```
こんな感じでテーブルができたと思います。

| 物理名 | 論理名 | 
|:---------- |--------:|
| 犬id         | dog_id | 
| 名前         | name | 
| メールアドレス| email |
| パスワード    |  password | 
| 作成日時      |        created_at | 
| 更新日時      |           updated_at |  

次にテーブルに沿ってモデルを作ります。

```cmd:cmd
php artisan make:model Dog
```

作ったら一通りいじります。
モデルの公式サイトは[こちら](https://readouble.com/laravel/5.5/ja/eloquent.html)

```php:Dog.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Dog extends Model
{
    /**
     * モデルと関連しているテーブル
     * 
     */
    protected $table = 'dog';

    /**
     * デフォルトの主キーをオーバーライド
     * 
     */
    protected $primaryKey = 'dog_id';

    /**
     * ホワイトボックス指定
     * 
     */
    protected $fillable =[
        'name','email','password',
    ];

    /**
     * 配列に含めない属性
     * 
     */
    protected $hidden = [
        'password',
    ];

    /**
     * デフォルトではログアウト時にremember_tokenを書き換えようとして
     * エラーを吐くので、その処理を一旦無効化
     * 
     */

    public function setAttribute($key,$value)
    {
        if ($key !== $this->getRememberTokenName()){
            parent::setAttribute($key,$value);
        }
    }
}
```

一旦書きましたが、後ほどここはいじります。
テーブルとモデルができたので次のステップへ移ります。


##②Configをいじる
認証系に関して重要なところ。
それは**config/auth.php**だ
まずはプロバイダーの作成をしよう。

```php:config/auth.php
    'providers' => [
        'dog' => [                       //←usersからdogへ書き換え
            'driver' => 'eloquent',
            'model' => App\Dog::class,   //App\UserからApp\Dogへ（先ほど作成したモデル）
        ],

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

ここが終わったら、その他をよしなに変えていく

```php:config/auth.php
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'dog',        //usersからdogへ
    ],



    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'dog',      //usersから先ほど作ったdogに変更
        ],

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

ここまでで大部分は終了。あとは仕上げにモデルをいじります。

##③モデルをいじる

モデルを認証用のモデルに変更してあげる必要があるので、下記を追記する。

```php:Dog.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;                 //まるごと追記
use Illuminate\Foundation\Auth\User as Authenticatable;  //まるごと追記

class Dog extends Authenticatable                        //extends model → extends Authenticatable へ
{
    /**
     * モデルと関連しているテーブル
     * 
     */
    protected $table = 'dog';

    /**
     * デフォルトの主キーをオーバーライド
     * 
     */
    protected $primaryKey = 'dog_id';

    /**
     * ホワイトボックス指定
     * 
     */
    protected $fillable =[
        'name','email','password',
    ];

    /**
     * 配列に含めない属性
     * 
     */
    protected $hidden = [
        'password',
    ];

    /**
     * デフォルトではログアウト時にremember_tokenを書き換えようとして
     * エラーを吐くので、その処理を一旦無効化
     * 
     */

    public function setAttribute($key,$value)
    {
        if ($key !== $this->getRememberTokenName()){
            parent::setAttribute($key,$value);
        }
    }
}
```


これで完了です！

あとはdogテーブルにデータを入れてログインしてみてください。
（デフォルトだとemailとpasswordで認証します）

##あとがき
新人の頃からログイン機能には苦しめられましたが、少しだけ近づいた気がします。
当時はMiddlewareを使ってなんやかんやしてました。。。


次はLaravel6で（Ｕ＾ω＾）わんわんお！したいところです。