我基本上重新创建了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();
}
答案 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懒得加载一些东西,即使我在我的方法中明确地急切加载。 -