2

我的设置

  • 拉拉维尔 8
  • Laravel 火花莫莉

使用 Spark 和 Sanctum 调用 API 请求时,我经常碰壁。我已经毫无问题地安装了 Sanctum 并进行了迁移。

我已经添加并添加use Laravel\Sanctum\HasApiTokens;到课程中。app/Models/User.phpuse HasApiTokens;

我的 Api.php 路由

Route::group([
    'middleware' => 'auth:sanctum'
], function () {
    Route::get('categories', [\App\Http\Controllers\categories::class, 'fetchCategories']);
});

当我调用 Api 时出现此错误

ErrorException
Declaration of Laravel\Sanctum\HasApiTokens::tokenCan(string $ability) should be compatible with Laravel\Spark\User::tokenCan($ability)

我已经尝试更改use Laravel\Sanctum\HasApiTokens;Laravel\Spark\HasApiTokens在 User.php 上。错误消失了,但每当我尝试调用 Api 时,它都会让我回到登录主页。

有任何想法吗?由于 Spark 文档并没有真正解释 Sanctum 或 Api 保护是如何工作的。

4

1 回答 1

0

问题是您的主用户类从供应商 Spark 库中扩展了用户类。HasApiTokens此用户模型使用与 Sanctum 不同的特征命名

由于您不想更改供应商目录中的文件,因此我发现的一个解决方法是从供应商处复制原始 SparkUser 模型类并创建一个像这样的新模型类并删除该特征HasApiTokens,因为您不想使用它了。

<?php

namespace App\Models\Users;

use Illuminate\Support\Str;
use Laravel\Spark\Billable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class SparkUser extends Authenticatable
{
    use Billable, Notifiable; // HasApiTokens was removed from the original SparkUser class

/**
 * Get the profile photo URL attribute.
 *
 * @param  string|null  $value
 * @return string|null
 */
public function getPhotoUrlAttribute($value)
{
    return empty($value) ? 'https://www.gravatar.com/avatar/'.md5(Str::lower($this->email)).'.jpg?s=200&d=mm' : url($value);
}

/**
 * Make the team user visible for the current user.
 *
 * @return $this
 */
public function shouldHaveSelfVisibility()
{
    return $this->makeVisible([
        'uses_two_factor_auth',
        'country_code',
        'phone',
        'card_brand',
        'card_last_four',
        'card_country',
        'billing_address',
        'billing_address_line_2',
        'billing_city',
        'billing_state',
        'billing_zip',
        'billing_country',
        'extra_billing_information'
    ]);
}

/**
 * Convert the model instance to an array.
 *
 * @return array
 */
public function toArray()
{
    $array = parent::toArray();

    if (! in_array('tax_rate', $this->hidden)) {
        $array['tax_rate'] = $this->taxPercentage();
    }

    return $array;
}

}

现在我只需要改变我原来的 User 类模型来使用这个像这样的新模型并添加来自 Sanctum 的特征 HasApiTokens!

use App\Models\SparkUser; // Modified from the original in the vendor folder
use Laravel\Sanctum\HasApiTokens;

class User extends SparkUser
{
    use HasApiTokens;
    
    ...
}
于 2022-02-22T23:17:52.507 回答