2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

#やりたいこと

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

私です(;´・ω・)

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

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

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

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

##①テーブルとモデルの作成
まずはマイグレーションから
マイグレーションに関しては公式サイト

cmd
php artisan make:migration create_dog_table

マイグレーションファイルができたら、ファイルをいじっていきます。

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
php artisan migrate

こんな感じでテーブルができたと思います。

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

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

cmd
php artisan make:model Dog

作ったら一通りいじります。
モデルの公式サイトはこちら

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
まずはプロバイダーの作成をしよう。

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

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

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

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に変更
        ],
    ],

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

##③モデルをいじる

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

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で(U^ω^)わんわんお!したいところです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?