2
0

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 1 year has passed since last update.

Laravel Sanctumで使用するテーブルを変更する

Posted at

初めに

タイトルの通りですが、Sanctumを使用する際にデフォルトのテーブル名(Personal_access_tokens)から別のテーブルに変更する機会があったので、手順を記しておく。
公式ドキュメントにも書いてあるけど、サラッと書いてるだけだったのでw
なお、Sanctumのパッケージは既に導入されているものとします。

環境

ターミナル
$ php -v
PHP 7.4.29 (cli) (built: May 11 2022 14:21:44) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ php artisan -V
Laravel Framework 8.78.1

1.マイグレーションファイルを修正

今回は、personal_access_tokens→sanctum_access_tokensに修正してみる事にします。
修正箇所はテーブル名のみ。

migration.php
<?php

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

class CreateSanctumAccessTokensTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sanctum_access_tokens', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->morphs('tokenable');
            $table->string('name');
            $table->string('token', 64)->unique();
            $table->text('abilities')->nullable();
            $table->timestamp('last_used_at')->nullable();
            $table->timestamps();
        });
    }

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

2.モデルを作成する

作成すると言っても、既に作られてる場合はファイル名とクラス名を変更するだけです。
また、デフォルトのPersonalAccessTokenモデルをextendsします。

CreateSanctumAccessTokensTable.php
<?php

namespace App\Models;

use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;

class SanctumAccessToken extends SanctumPersonalAccessToken
{
    // ...
}

3.Providerでカスタムモデルを使用するように設定する

boot内に記述の追加行は、AppServiceProviderではなく他のProviderでも大丈夫ですが、

Sanctumのデフォルトマイグレーションを使用しない場合は、App\Providers\AppServiceProviderクラスのregisterメソッドでSanctum::ignoreMigrationsメソッドを呼び出す必要があります。

と公式docに書いてあるので、上記と合わせてAppServiceProviderに書いておくのが良いかなと思います。

App\Providers\AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Laravel\Sanctum\Sanctum;

use App\Models\SanctumAccessToken;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //追加
        Sanctum::ignoreMigrations();
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //追加
        Sanctum::usePersonalAccessTokenModel(SanctumAccessToken::class);
    }
}

終わりに

簡単でしたが、以上の手順でデフォルトのテーブルから変更できます。
今回はテーブルのカラム名等は変えておりませんが、変える場合は軽く調べた感じなかなかややこしそうなので、特段理由がなければデフォルトのまま使用するのがラクかと思います。

余談

Sanctumのテーブルは通常Userテーブルとポリモーフィズムリレーションで紐づくことになるかと思いますが、Userに値するテーブルの主キーが文字列だと、上手くリレーションできません。
実際に上記の要件で試してみましたが、トークンの発行自体は上手くいきDBにレコードが入るものの、$user->tokensとした時にトークンが取得できず。。

マイグレーションでmorphs→uuidMorphsに変更すればいけるかなと思いましたが、それもダメ。
文字列でも、値が数値だと取れているようでしたが、そんな使い方は通常しないと思うので、
文字列主キーの場合は、テーブル設計を見直すか標準のAPIトークン認証を使用した方が良さそうです。
上記みたいな要件はあまりないとは思いますが、ご参考までに。。

参考
Laravel 8.x Laravel Sanctum

2
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?