我想要一种简洁的方式来做这样的事情。
$this->requireAllConditionsAreTruthy([
function() { return $this->clan },
function() { return $this->team },
function() { return $this->memberToAdd },
function() { return $this->section },
function() { return $this->clan->hasTeamForSection($this->section) },
function() { return $this->memberToAdd->isInClan($this->clan) },
function() { return ! $this->team->hasMember($this->memberToAdd) },
function() { return ! $this->memberToAdd->isOnTeamForSection($this->section) }
]);
目的是,如果像$this->clan
这样的东西被证明是假的,我希望能够抛出一个异常,记录哪个条件失败,并在调用$this->clan->hasTeamForSection
之前退出数组迭代。
PHP是否有一种简洁的方法来定义一个延迟求值数组?
看起来最直接的解决方案是生成每个表达式,并将该方法视为生成器。使用yield
,每个表达式只有在循环时才会延迟求值。
public function authorization() {
yield $this->clan;
yield $this->team;
yield $this->memberToAdd;
yield $this->section;
yield $this->clan->hasTeamForSection($this->section);
yield $this->memberToAdd->isInClan($this->clan);
yield ! $this->team->hasMember($this->memberToAdd);
yield ! $this->memberToAdd->isOnTeamForSection($this->section);
}
然后处理授权,我可以这样做:
public function authorize() {
foreach ($this->authorization() as $key => $condition) {
if (!$condition) {
Log::debug(sprintf("Authorization condition %s failed in %s", $key, get_class($this));
throw new AuthorizationException;
}
}
}
这将使授权验证保持在最低限度,同时仍然提供关于哪个条件失败的更精确的反馈,用于调试或一般日志记录目的。