我正在使用安全选民作为 symfony 的 acl 系统的替代方案。
选民示例:
我的选民看起来很像下面的一个。
class FoobarVoter implements VoterInterface
{
public function supportsClass($class)
{
return in_array($class, array(
'Example\FoobarBundle\Entity\Foobar',
));
}
public function supportsAttribute($attribute)
{
return in_array(strtolower($attribute), array('foo', 'bar'));
}
public function vote(TokenInterface $token, $object, array $attributes)
{
$result = VoterInterface::ACCESS_ABSTAIN
if (!$this->supportsClass(get_class($object))) {
return VoterInterface::ACCESS_ABSTAIN;
}
foreach ($attributes as $attribute) {
$attribute = strtolower($attribute);
// skip not supported attributes
if (!$this->supportsAttribute($attribute)) {
continue;
}
[... some logic ...]
}
return $result;
}
}
问题:
减少对 Voter::vote() 的调用
我的选民被包括在内,并在每次页面加载时被调用。即使他们不支持给定班级的决定。 FoobarVoter::vote()
总是被调用。即使FoobarVoter::supportsClass()
或FoobarVoter::supportsAttribute
返回false。因此我需要检查里面的类和属性FoobarVoter::vote()
。这是行为标准吗?我怎样才能防止这个不必要的电话。
将选民限制为捆绑
一些选民只需要在特定的捆绑包中。有些只需要决定特定的类。因此,我的申请的所有部分都不需要一些选民。是否可以动态地包括每个捆绑/实体的选民?例如,仅在访问/使用特定捆绑包或特定实体时才将选民纳入决策管理器链?