当我将$permission传递到$gate-define()闭包时,我急切地加载了它';s的相关角色--角色集合


When I pass a $permission into the $gate-define() closure having eager loaded it's related roles -- the roles collection is empty. Why?

我本质上是在重新创建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();
}

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

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在懒惰地加载一些东西,尽管我明确地渴望在我的方法中加载