Вызов неопределенного метода AppModelsUser::hasRole() с промежуточным программным обеспечением Laravel 8

#laravel #routes #laravel-8

Вопрос:

Я пытаюсь использовать промежуточное ПО для проверки ролей, и я использую пример, приведенный в документации Laravel.

 <?php

namespace AppHttpMiddleware;

use Closure;
use IlluminateHttpRequest;

class EnsureUserHasRole
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
            return back();
        }
        return $next($request);


    }
}
 

Но я понимаю ошибку в вопросе. Вот как я написал Маршрут.

Route::get('/gestionarMedicos', [PersonaController::class,'mostrarMedicos'])->name('personaMostrarMedicos')->middleware('auth','firstLogin','role:administrador');

Промежуточное ПО называется ролью, и я планирую использовать его, чтобы разрешить доступ только к поддерживаемым ролям для него.

Меня удивляет, что это не работает, потому что я использую пример из документации Laravel.

Код модели пользователя

 <?php

namespace AppModels;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use IlluminateDatabaseEloquentModel;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    
    protected $fillable = [
        'role',
        'name',
        'email',
        'password',
        'idPersona',
        'estado'
    ];
    
    public function Persona(){
        return $this->belongsTo(Persona::class,'idPersona');
    }
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'remember_token'
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
 

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

1. Роли не являются функцией Laravel; не могли бы вы связать документацию, которой вы следуете, в которой показана модель пользователя, вызываемая с hasRole помощью функции? Это больше похоже на то, что вы установили библиотеку, но неправильно ее настроили. Может быть, вам не хватает какой-то черты в пользовательской модели? Может быть, пакет разрешений Spatie? И вы забыли добавить use HasRoles; в Пользовательскую модель?

2. laravel.com/docs/8.x/middleware Я использую пример в промежуточном программном обеспечении с параметрами, я новичок в Laravel, и я думал, что эта функция появилась по умолчанию. Я думаю, что я создал свою пользовательскую модель с миграцией, не совсем уверенный, но я настроил ее. Я могу поместить код модели пользователя в вопрос. @NicklasKevinFrank

3. В вашей пользовательской модели нет HasRole функции, поэтому вы не можете вызвать $request->user()->hasRole($role)

Ответ №1:

Добавьте EnsureUserHasRole в свой массив промежуточного ПО

 Route::get('/gestionarMedicos', [PersonaController::class,'mostrarMedicos'])->name('personaMostrarMedicos')->middleware('auth','firstLogin','EnsureUserHasRole', 'role:administrador');
 

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

1. Я назвал роль промежуточного программного обеспечения в файле ядра, поэтому я думаю, что все в порядке, как у меня есть. Комментарии выше были правильными, я пропустил метод