最近,我在laravel(https://laracasts.com/series/whats-new-in-laravel-5-1/episodes/16)中查看了几个关于ACL的视频,在我复制了所有代码后,当我尝试执行迁移,打开等任何操作时,我遇到了错误修补程序等(基本上所有会触发框架代码的东西)。这是因为还没有创建表格。
AuthServiceProvider.php
public function boot()
{
$this->registerPolicies();
foreach($this->getPermissions() as $permission) {
Gate::define($permission->name, function ($user) use ($permission) {
return $user->hasRole($permission->roles);
});
}
}
protected function getPermissions()
{
return Permission::with('roles')->get();
}
因此,您无法运行php artisan migrate
,因为它会抛出错误(Missing 'permissions' table
)。
临时解决方案是将此代码添加到引导函数中,BEFORE foreach
循环
if (App::runningInConsole())
{
return;
}
但我觉得对每个请求都包含此检查感觉不对。任何想法如何解决这个问题或推迟这个循环,直到调用实际检查?
答案 0 :(得分:0)
选项1
我想这里的正确答案是,在你定义之前,你不应该尝试访问一个表。禁用ServiceProvider,运行迁移,然后还原服务提供商。
选项2
或者,您可以在尝试使用该表之前检查该表是否存在。 Schema::hasTable('permissions')
会为您做到这一点。但我认为以上是正确的方法。
选项3
根据我们的讨论,如果我理解正确,您在数据库中定义并分配给角色的权限不会改变。
您是否可以不做以下事情?您在定义时不会查询数据库。只有在使用时才会查询权限角色。
它并不理想。但需要考虑。
// AuthServiceProvider.php
$this->permissions = [
// ...
'post.create',
'post.read',
'post.update',
'post.delete',
// ...
];
public function boot()
{
$this->registerPolicies();
foreach ($this->permissions as $permission) {
Gate::define($permission, function ($user) use ($permission) {
$permission = Permission::with('roles')->where('name', $permission)->firstOrFail();
return $user->hasRole($permission->roles);
});
}
}
或者,您可以考虑使用Deferred Service Providers。我自己没有使用它们,所以它可能无效