Laravel 8 Sanctum: требуется ли расширение из Authenticatable?

#laravel #laravel-8 #laravel-sanctum

#ларавель #laravel-8 #laravel-sanctum

Вопрос:

С одной стороны, у меня есть Красноречивая модель User , которая расширяется IlluminateDatabaseEloquentModel . С другой стороны, у меня есть 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 Model ( User будет расширен SanctumUser )?

Комментарии:

1. что такое WordPressMigrateModel ? вы можете сделать это как признак

2. @KamleshPaul ты можешь забыть об этом (я отредактировал ОП 🙂 )

3. Нет, я не могу сделать это признаком

4. вы можете создать средний класс, который extends Model затем этот класс extends SanctumUser , а затем этот последний класс в модели

5. Model то есть IlluminateDatabaseEloquentModel я не могу заставить его расширяться SnctumUser ? Или я не понял.

Ответ №1:

Аутентифицируемый как псевдоним для класса Illuminate Foundation Auth User имеет черты, которые имеют методы аутентификации и авторизации

 <?php

namespace IlluminateFoundationAuth;

use IlluminateAuthAuthenticatable;
use IlluminateAuthMustVerifyEmail;
use IlluminateAuthPasswordsCanResetPassword;
use IlluminateContractsAuthAccessAuthorizable as AuthorizableContract;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
use IlluminateContractsAuthCanResetPassword as CanResetPasswordContract;
use IlluminateDatabaseEloquentModel;
use IlluminateFoundationAuthAccessAuthorizable;

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

Даже класс модели пользователя по умолчанию, который доступен с любой новой стандартной установкой Laravel, расширяет класс Authenticable [используйте IlluminateFoundation Auth User как аутентифицируемый;]

Класс модели пользователя по умолчанию в стандартном приложении Laravel имеет еще две характеристики — Notifiable и HasFactory (начиная с Laravel 8.x)

 <?php

namespace AppModels;

use IlluminateNotificationsNotifiable;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser 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 в класс модели пользователя.

Чтобы легко интегрировать Laravel Sanctum или Jetstream или Laravel UI или Breeze для аутентификации и авторизации в ваше приложение, лучше сделать User class extend аутентифицируемым — подключи и играй

Комментарии:

1. Поскольку Authenticatable here на самом деле является псевдонимом IlluminateFoundationAuthUser , который уже расширяется Model и является шаблонной моделью пользователя Laravel, поэтому нет необходимости расширять Model себя, поскольку он уже расширен. Однако из вашего вопроса неясно, расширяете ли вы тот же Authenticatable класс

2. Authenticable, который является псевдонимом для IlluminateFoundation Auth User , уже расширяет IlluminateDatabase Eloquent Model , поэтому, когда вы расширяете свое приложение Models User из Authenticable, оно уже расширяет класс IlluminateDatabase Eloquent Model через Authenticable

3. нет . Класс IlluminateFoundationAuthUser расширяет IlluminateDatabaseEloquentUser класс и пользовательскую модель проекта в AppModelsUser extends IlluminateFoundation Auth Псевдоним пользователя, указанный как аутентифицируемый в инструкции use

4. Извините, это опечатка в предыдущем комментарии IlluminateFoundationAuth User псевдоним Authenticable расширяет IlluminateDatabaseEloquent Model и AppModelsUser расширяет Authenticable

5. Смотрите второй блок кода в ответе — это пользовательский класс по умолчанию со стандартной установкой Laravel. Поскольку класс называется User, он не может расширять другой класс с именем User, поэтому в инструкции use IlluminateFoundationAuthUser имеет псевдоним Authenticable