Laravel8.x & Voyager1.4でUserテーブル以外を管理者ログインに使う

環境

  • Laravel 8.x
  • Voyager 1.4

参考:https://voyager-docs.devdojo.com/customization/custom-guard
ここにいい感じの例が乗ってます。
大体これの翻訳と追記。

動機

デフォルトだとVoyagerはusersテーブルで管理者ユーザーを管理する。
Jetstreamなどを入れていて、同じユーザーテーブルで管理するのが嫌だったのでVoyagerのデフォルトで設定されているテーブルを変更する

今回は usersテーブルをadminsテーブルに変えます。ドキュメントと一緒。

変更手順

1、adminsテーブルを作る

artisanでModelとmigrationファイルを作る

1
$artisan make:model Admin -m

カラムをいろいろ設定
@migrations/create_admins_table.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
Schema::create('admins', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('role_id')->unsigned()->nullable();
$table->string('name');
$table->string('email')->unique();
$table->string('avatar')->nullable()->default('users/default.png');
$table->string('password')->nullable();
$table->string('remember_token')->nullable();
$table->text('settings')->nullable()->default(null);
$table->timestamps();
$table->foreign('role_id')->references('id')->on('roles');
});

DB作る

1
artisan migrate

2、AdminモデルでVoyagerを継承する

モデル側もAdminモデルでVoyagerを読むように
@Models/Admin.php

1
2
3
4
5
6
7
8
9
10
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Admin extends \TCG\Voyager\Models\User
{
}

Voyagerを既にインストールしてると、Userモデルで継承しちゃってるので外しとく
@Models/User.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable // <- ここをVoyagerからかえる
// ※Jetstreamつかわないなら
// class User extends Model にする
{
...
}

3、コンフィグ設定でguardを登録する

adminというguardを作って、
@config/auth.php

1
2
3
4
5
6
7
8
'guards' => [
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],

// ...
],

adminというproviderも作る

1
2
3
4
5
6
7
8
'providers' => [
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class, // ↓注意
],

// ...
],

** 注意 ** ドキュメントでは App\Admin::classになっているが(2021/06/21現在)、Laravel 8からモデルのデフォルトのnamespaseがApp\Modelsになってるので対応させておく。

Voyagerに新しいguardを伝える

@AppServiceProvider.php

1
2
3
4
5
6
public function register()
{
$this->app->singleton('VoyagerGuard', function () {
return 'admin';
});
}

以上で設定完了。

新しくAdminモデルにユーザー作ってログインしてみる

1
php artisan voyager:admin your@email.com --create

でCLIで初期ユーザー登録したときに、adminsテーブルに保存されてることを確認しましょう

なお、user-breadはuserテーブルのBREADなので(それはそう)
必要ならadminsテーブル用のBREADを作ること。


参考

https://voyager-docs.devdojo.com/customization/custom-guard
https://github.com/the-control-group/voyager/issues/2568