启动函数中的表查询

时间:2017-07-18 23:07:33

标签: php laravel laravel-5.4

最近,我在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;
}

但我觉得对每个请求都包含此检查感觉不对。任何想法如何解决这个问题或推迟这个循环,直到调用实际检查?

1 个答案:

答案 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。我自己没有使用它们,所以它可能无效