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

С одной стороны, у меня есть модель 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)?

что такое WordpressMigrateModel? вы можете сделать это чертой

Kamlesh Paul 18.12.2020 10:08

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

JarsOfJam-Scheduler 18.12.2020 10:09

Нет, я не могу сделать это чертой

JarsOfJam-Scheduler 18.12.2020 10:10

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

Kamlesh Paul 18.12.2020 10:16
Model это Illuminate\Database\Eloquent\Model , я не могу его продлить SnctumUser? Или я не понял.
JarsOfJam-Scheduler 18.12.2020 10:18

Какой класс здесь Authenticatable? В документации только говорится, что вам нужно использовать черту HasApiTokens в вашем существующем пользовательском классе. Это выглядит как недопонимание в документации, потому что единственный Authenticatable, о котором я знаю, это интерфейс, поэтому вы должны его реализовать.

apokryfos 18.12.2020 10:19

@apokryfos а, хорошо, я постараюсь использовать все эти вещи без Authenticatable.

JarsOfJam-Scheduler 18.12.2020 10:22

@apokryfos PS: «Класс User extends Authenticatable» — из документации (laravel.com/docs/8.x/sanctum#issuing-api-tokens) :-)

JarsOfJam-Scheduler 18.12.2020 10:23

Хотя документы могут ошибаться. Знаете ли вы полное имя этого класса?

apokryfos 18.12.2020 10:31

нет @apokryfos

JarsOfJam-Scheduler 18.12.2020 10:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
10
920
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Аутентифицируемый как псевдоним для класса 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. Так что я должен добавить это расширение нет? так или иначе

JarsOfJam-Scheduler 18.12.2020 10:44

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

apokryfos 18.12.2020 10:50

Authenticable, который является псевдонимом для Illuminate\Foundation\Auth\User, уже расширяет Illuminate\Database\Eloquent\Model. Поэтому, когда вы расширяете свой App\Models\User из Authenticable, он уже расширяет класс Illuminate\Database\Eloquent\Model через Authenticable

Donkarnash 18.12.2020 10:56

«Authenticable, который является псевдонимом для Illuminate\Foundation\Auth\User, уже расширяет Illuminate\Database\Eloquent\Model» => Вы имели в виду, что Illuminate\Database\Eloquent\Model расширяет Authenticable?

JarsOfJam-Scheduler 18.12.2020 11:15

НЕТ. Класс Illuminate\Foundation\Auth\User расширяет класс Illuminate\Database\Eloquent\User, а модель пользователя проекта в App\Models\User расширяет Illuminate\Foundation\Auth\User, псевдоним которого указан как Authenticable в операторе использования.

Donkarnash 18.12.2020 11:15

Спасибо. Ну... мой App\Models\User на самом деле расширяет Illuminate\Database\Eloquent\Model, а не Illuminate\Database\Eloquent\User, так что это не сработает. Мне нужно подумать об этом, но ты.

JarsOfJam-Scheduler 18.12.2020 11:40

@Donkarnash, откуда вы знаете, что Illuminate\Foundation\Auth\User имеет псевдоним Authenticable?

JarsOfJam-Scheduler 18.12.2020 11:45

Извините, это опечатка в предыдущем комментарии

Donkarnash 18.12.2020 11:46

См. второй блок кода в ответе - это класс пользователя по умолчанию со стандартной установкой Laravel. Поскольку класс называется User, он не может расширять другой класс с именем User, поэтому в операторе использования Illuminate\Foundation\Auth\User имеет псевдоним Authenticable.

Donkarnash 18.12.2020 11:48

Ах, хорошо, вы имеете в виду, что у него есть черта = псевдоним

JarsOfJam-Scheduler 18.12.2020 11:57

очень, сэр. :-) Я последовал вашим объяснениям. Поскольку я использую не стандартный класс 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).

JarsOfJam-Scheduler 18.12.2020 12:10

Другие вопросы по теме