我本质上是在重新创建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在懒惰地加载一些东西,尽管我明确地渴望在我的方法中加载