Проблема с Laravel 8 Gate, я пытаюсь проверить состояние с другой моделью, но есть сообщение об ошибке

В моем laravel 8 я определяю ворота, но есть некоторая проблема, что мои ворота принимают только одно имя модели, это то, что администратор, когда я пытаюсь проверить другое имя модели, появляется сообщение об ошибке

вот мой authserviceprovider

      <?php

пространство имен App \ Providers;

используйте App \ Models \ Admin \ Role; используйте Illuminate \ Foundation \ Support \ Providers \ AuthServiceProvider в качестве ServiceProvider; используйте Illuminate \ Support \ Facades \ Gate;

class AuthServiceProvider extends ServiceProvider{/ *** Сопоставления политик для приложения. * * @var array * / protected $ policy = [// 'App \ Models \ Model' => 'App \ Policies \ ModelPolicy',];

      /**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();
    
    Gate::define('isAdmin', function(Role $role) {

        if ($role->role === 'Admin') {
            return true;
        } else {
            return false;
        }
    });
}

}

вот контроллер

       public function index(Role $role)
{
    if (!Gate::allows('isAdmin', $role)) 
    {
        abort(403);
    }

    $users = Admin::with('roles')->get();
    return view('Admin.user.index', compact('users'));
}

сообщение об ошибке

      TypeError

App \ Providers \ AuthServiceProvider :: App \ Providers {closure} (): Аргумент № 1 ($role) должен иметь тип App \ Models \ Admin \ Role, App \ Models \ Admin, указанный в D: \ xampp \ htdocs \ education \ vendor \ laravel \ framework \ src \ Illuminate \ Auth \ Access \ Gate.php в строке 477http://127.0.0.1:8000/admin/users

1 ответ

в основном используется для авторизованного пользователя. если вам нужно авторизоваться в какой-либо конкретной модели, используйте политику

так что в Шлюзворотах мы получаем логин user instance как перезвонить автоматически

так что в вашем случае код будет таким

      /**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Gate::define('isAdmin', function($user) {
       return $user->role->name === 'Admin';
    });
}

затем в контроллере

      public function index(Role $role)
{
    abort_if(!Gate::allows('isAdmin'));

    $users = Admin::with('roles')->get();
    return view('Admin.user.index', compact('users'));
}
Другие вопросы по тегам