С одной стороны, у меня есть модель Eloquent User, которая расширяет Illuminate\Database\Eloquent\Model. С другой стороны, у меня есть 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)?
@KamleshPaul, вы можете забыть об этом (я отредактировал ОП :))
Нет, я не могу сделать это чертой
вы можете создать средний класс, который extends Model затем этот класс extends SanctumUser затем этот последний класс в модели
Model это Illuminate\Database\Eloquent\Model , я не могу его продлить SnctumUser? Или я не понял.
Какой класс здесь Authenticatable? В документации только говорится, что вам нужно использовать черту HasApiTokens в вашем существующем пользовательском классе. Это выглядит как недопонимание в документации, потому что единственный Authenticatable, о котором я знаю, это интерфейс, поэтому вы должны его реализовать.
@apokryfos а, хорошо, я постараюсь использовать все эти вещи без Authenticatable.
@apokryfos PS: «Класс User extends Authenticatable» — из документации (laravel.com/docs/8.x/sanctum#issuing-api-tokens) :-)
Хотя документы могут ошибаться. Знаете ли вы полное имя этого класса?
нет @apokryfos






Аутентифицируемый как псевдоним для класса 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;
}
Даже класс модели User по умолчанию, который доступен с любой новой стандартной установкой Laravel, расширяет класс Authenticable [используйте Illuminate\Foundation\Auth\User as Authenticatable;]
Класс пользовательской модели по умолчанию в стандартном приложении Laravel имеет еще две черты — уведомляемые и 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 — подключи и работай.
Как User extends Illuminate\Database\Eloquent\Model, я не думаю, что это расширяет Authenticatable. Так что я должен добавить это расширение нет? так или иначе
Поскольку Authenticatable на самом деле является псевдонимом Illuminate\Foundation\Auth\User, который уже расширяет Model и является шаблонной моделью пользователя Laravel, поэтому нет необходимости расширять Model самостоятельно, поскольку он уже расширен. Однако из вашего вопроса неясно, расширяете ли вы один и тот же класс Authenticatable
Authenticable, который является псевдонимом для Illuminate\Foundation\Auth\User, уже расширяет Illuminate\Database\Eloquent\Model. Поэтому, когда вы расширяете свой App\Models\User из Authenticable, он уже расширяет класс Illuminate\Database\Eloquent\Model через Authenticable
«Authenticable, который является псевдонимом для Illuminate\Foundation\Auth\User, уже расширяет Illuminate\Database\Eloquent\Model» => Вы имели в виду, что Illuminate\Database\Eloquent\Model расширяет Authenticable?
НЕТ. Класс Illuminate\Foundation\Auth\User расширяет класс Illuminate\Database\Eloquent\User, а модель пользователя проекта в App\Models\User расширяет Illuminate\Foundation\Auth\User, псевдоним которого указан как Authenticable в операторе использования.
Спасибо. Ну... мой App\Models\User на самом деле расширяет Illuminate\Database\Eloquent\Model, а не Illuminate\Database\Eloquent\User, так что это не сработает. Мне нужно подумать об этом, но ты.
@Donkarnash, откуда вы знаете, что Illuminate\Foundation\Auth\User имеет псевдоним Authenticable?
Извините, это опечатка в предыдущем комментарии
См. второй блок кода в ответе - это класс пользователя по умолчанию со стандартной установкой Laravel. Поскольку класс называется User, он не может расширять другой класс с именем User, поэтому в операторе использования Illuminate\Foundation\Auth\User имеет псевдоним Authenticable.
Ах, хорошо, вы имеете в виду, что у него есть черта = псевдоним
очень, сэр. :-) Я последовал вашим объяснениям. Поскольку я использую не стандартный класс Model, а свой собственный (WordpressMigrateModel extends Illuminate\Database\Eloquent\Model), я написал и буду тестировать: class MyOwnEloquentModelUser extends SanctumUser ; SanctumUser extends App\Foundation\Auth\User (the override of Auth\User which is an alias for Authenticable) и, наконец, class App\Foundation\Auth\User extends WordpressMigrateModel (что является переопределением Model).
что такое
WordpressMigrateModel? вы можете сделать это чертой