Проблема с 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'));
}