我想要一种简洁的方法来做这样的事情。
$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是否有简洁的方法来定义延迟评估的数组?
答案 0 :(得分:0)
看起来最直接的解决方案是产生每个表达式并将方法视为生成器。使用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;
}
}
}
这将使授权验证保持最小,同时仍然提供有关哪些条件失败的更准确的反馈,用于调试或一般日志记录。