当我将$权限传递给$ gate-define()闭包时,它急切地加载了它的相关角色 - roles集合为空。为什么?

时间:2015-12-01 19:40:39

标签: php laravel laravel-5.1 acl

我基本上重新创建了Jeffrey Way在Larave的Gate / ACL中定义能力的例子。当我将$permission传递给急切加载其相关角色的$gate-define()闭包时,角色集合为空。如果我在关闭范围之外的dd($permission),那么角色就在那里。如果我在封闭范围内我dd($permission)他们已经消失了。为什么?请赐教。

public function boot(GateContract $gate)
{
    $this->registerPolicies($gate);
    foreach ($this->getPermissions() as $permission) {
        dd($permission); // this has the roles
        $gate->define($permission->name, function($user) use($permission)  {
            dd($permission); // here the roles are gone -- the key is present but the collection is empty
            return $user->hasRole($permission->roles);
        });
    }

}

protected function getPermissions()
{
    return Permission::with('roles')->get();
}

1 个答案:

答案 0 :(得分:1)

我仍然不完全确定为什么,但这解决了它:

public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);
        $permissions = $this->getPermissions();
        foreach ($permissions as $permission) {
            $roles = $permission->roles;
            if (count($roles) > 0)
            {
                $gate->define($permission->name, function($user) use($roles) {
                    return $user->hasRole($roles);
                });
            }
        }

    }

    protected function getPermissions()
    {
        return Permission::with('roles')->get();
    }

这几乎就像封闭器在它之前有任何数据之前复制变量一样......好像Laravel懒得加载一些东西,即使我在我的方法中明确地急切加载。 -