【问题标题】:Laravel 8 Sanctum: Is it required to extend from Authenticatable?Laravel 8 Sanctum:是否需要从 Authenticatable 扩展?
【发布时间】:2021-03-28 22:36:11
【问题描述】:

一方面,我有一个扩展 Illuminate\Database\Eloquent\Model 的 Eloquent 模型 User。另一方面,我有SanctumUser extends Authenticatable (https://laravel.com/docs/8.x/sanctum#issuing-api-tokens)。

我想做的是,User extends Model, SanctumUser,但在 PHP 7.x 中无法实现多重继承。

根据我上面链接的文档,我知道SanctumUser 中使用了一些特征。这些特征是:use HasApiTokens, HasFactory, Notifiable;。如果我删除 extends Authenticatable 并将其替换为 extends ModelUser 将扩展 SanctumUser),您知道它们是否足够?

【问题讨论】:

  • WordpressMigrateModel 是什么?您可以将其作为特征
  • @KamleshPaul 你可以忘记它(我已经编辑了 OP :))
  • 不,我不能让它成为一种特质
  • 你可以创建一个中间类extends Model然后那个类extends SanctumUser然后是模型中的最后一个类
  • ModelIlluminate\Database\Eloquent\Model ,我不能让它扩展 SnctumUser?或者我不明白。

标签: laravel laravel-8 laravel-sanctum


【解决方案1】:

Authenticable 作为 Illuminate\Foundation\Auth\User 类的别名,具有具有身份验证和授权方法的特征

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\MustVerifyEmail;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\Access\Authorizable;

class User extends Model implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}

即使是任何新的标准 Laravel 安装都可用的默认 User 模型类,它也扩展了 Authenticable 类 [使用 Illuminate\Foundation\Auth\User 作为 Authenticatable; ]

标准 Laravel 应用程序中的默认用户模型类还有两个特征 - Notifiable 和 HasFactory(自 Laravel 8.x 起)

<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasFactory;
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
        'two_factor_recovery_codes',
        'two_factor_secret',
    ];
}

使用 Sanctum,您可以将特征 HasApiToken 添加到 User 模型类。

为了轻松集成 Laravel Sanctum 或 Jetstream 或 Laravel UI 或 Breeze 以对您的应用进行身份验证和授权,最好让 User 类扩展 Authenticable - 即插即用

【讨论】:

  • 因为 Authenticatable 这里实际上是 Illuminate\Foundation\Auth\User 的别名,它已经扩展了 Model 并且是 Laravel 样板用户模型,所以不需要自己扩展 Model,因为它已经扩展了。但是,从您的问题来看,尚不清楚您是否正在扩展相同的 Authenticatable
  • Authenticable 是 Illuminate\Foundation\Auth\User 的别名已经在扩展 Illuminate\Database\Eloquent\Model 所以当你扩展你的App\Models\User 来自 Authenticable,它已经通过 Authenticable 扩展了 Illuminate\Database\Eloquent\Model 类
  • Illuminate\Foundation\Auth\User 类扩展 Illuminate\Database\Eloquent\User 类和项目的 User 模型 App\Models\User 扩展 Illuminate\Foundation\Auth\User 别名为 Authenticable 在 use 声明中跨度>
  • 对不起,这是前面评论中的错字 Illuminate\Foundation\Auth\User 别名为 Authenticable 扩展了 Illuminate\Database\Eloquent\模型App\Models\User扩展了Authenticable
  • 查看答案中的第二个代码块 - 它是标准 Laravel 安装的默认 User 类。由于该类名为 User 它不能扩展另一个名为 User 的类,因此在 use 语句中 Illuminate\Foundation\Auth\User 别名为 Authenticable
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2017-05-11
  • 2014-06-29
相关资源
最近更新 更多