私は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;
}
}
質問:
投票者への呼び出しを減らす::vote()
私の有権者は、ページが読み込まれるたびに含まれ、呼び出されます。特定のクラスの決定をサポートしていない場合でも。 FoobarVoter::vote()
常に呼び出されます。FoobarVoter::supportsClass()
またはFoobarVoter::supportsAttribute
falseを返しても。したがって、内部のクラスと属性を確認する必要がありますFoobarVoter::vote()
。この動作は標準ですか?この不要な呼び出しを防ぐにはどうすればよいですか。
投票者をバンドルに制限する
一部の有権者は、特定のバンドル内でのみ必要です。特定のクラスについて決定するためだけに必要なものもあります。したがって、一部の有権者は私のアプリケーションのすべての部分で必要とされるわけではありません。バンドル/エンティティごとに投票者を動的に含めることは可能ですか?たとえば、特定のバンドルまたは特定のエンティティがアクセス/使用される場合にのみ、投票者を意思決定マネージャーチェーンに含めますか?