我是Laravel 8的新手,我正在数据库中基于用户级别实现Gates。与角色非常相似。
我的表级别如下id,name,gate,timestamp
这是我在/app/Providers/AuthServiceProvider 中的代码
...
...
public function boot()
{
$this->registerPolicies();
/*
* Gate base on Level in the Database
*/
$levels = Level::all();
foreach ($levels as $level) {
$gate = $level->gate;
$gateid = $level->id;
Gate::define($gate, function (User $user) use ($gateid) {
return $user->checkLevel($gateid);
});
}
}
}
如果我在运行第一次迁移"php artisan migrate"时留下这样的代码,我会得到以下错误:找不到基表或视图:1146表"laravelportal.levels"不存在(SQL:从levels
中选择*(
如果我在引导中对我的代码进行注释,那么迁移工作就完成了。之后我可以为数据库播种然后在引导中取消注释我的代码。
我知道如何在没有这个迁移错误以及注释和取消注释我的代码的情况下做到这一点。
您可以定义一个Gate,将模型查询延迟到迁移为止。
$this->registerPolices();
Gate::define('level', function (User $user, $gate) {
$level = Level::where('gate', $gate)->firstOrFail();
return $user->checkLevel($level->id);
});
大门的用途会有所不同。例如在您的路线中:
if( Gate::allows('level', 'example-level') ){
echo 'You are in this level';
} else {
echo 'You are not in this level';
}