Php 如何使Symfony多实体通用投票器
我正在我的系统中实现投票者,我不知道如何为投票者创建/扩展/实现更通用的方法 我有以下投票人(缩小): 这一个可以正常工作。然而,我也想要一个新闻,页面,技能,食物和酒吧 我可以复制这个投票者,然后改变最重要的变量。但由于这是仅有的3个变化,我需要某种类型的通用投票者,我可以用值加载,例如,在构造上,从而生成更可靠的代码,在一个点上具有真实的逻辑 但如果我用Voter扩展泛型类,它会自动加载它。我希望它忽略泛型类,最终得到如下结果:Php 如何使Symfony多实体通用投票器,php,symfony,Php,Symfony,我正在我的系统中实现投票者,我不知道如何为投票者创建/扩展/实现更通用的方法 我有以下投票人(缩小): 这一个可以正常工作。然而,我也想要一个新闻,页面,技能,食物和酒吧 我可以复制这个投票者,然后改变最重要的变量。但由于这是仅有的3个变化,我需要某种类型的通用投票者,我可以用值加载,例如,在构造上,从而生成更可靠的代码,在一个点上具有真实的逻辑 但如果我用Voter扩展泛型类,它会自动加载它。我希望它忽略泛型类,最终得到如下结果: class EventVoter extends Generi
class EventVoter extends GenericVoter
{
private $roleBaseName = 'ROLE_EVENT';
private $classname = Event::class;
private $ownershipMethod = 'getCreatedBy';
// Possibly, if required at all:
protected function voteOnAttribute($attribute, $subject, TokenInterface $token){
return parent::voteOnAttribute($attribute, $subject,$token)
}
}
有人能给我指出正确的方向吗?我能想到两种可能性: 将
ownershipMethod
逻辑移动到接口并在实体中实现,在支持中检查该接口。您仍然需要一些逻辑来计算角色
class GenericVoter extends Voter {
protected function supports($attribute, $subject) {
if (!$subject instanceof OwnershipInterface) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token) {
return $subject->getOwnership() === $user;
}
}
interface OwnershipInterface {
public function getOwnership();
}
/**
* @Entity
*/
class Event implements OwnershipInterface {
public function getOwnership() {
return $this->getCreatedBy();
}
}
另一个是将您的GenericVoter
声明为abstract
,因此它不会自动加载:
abstract class GenericVoter extends Voter {
abstract public function getOwnershipMethod();
abstract public function getRole();
abstract public function getClass();
protected function supports($attribute, $subject) {
if (!$subject instanceof $this->getClass()) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token) {
return $subject->{$this->getOwnershipMethod()} === $user;
}
}
class EventVoter extends GenericVoter {
public function getClass() {
return Event:class;
}
// Implement other abstract functions
}
我想检查一下你是否可以看新闻,是否可以看事件,等等。它们都有相同的逻辑来检查。你能写一个关于实体+接口的简单例子吗?你的意思是什么?听起来像是我想要的东西。抽象类也可能是,不确定是否可以这样扩展,但值得一试第一个例子可能就是我要找的,特别是将所有权函数移动到实体。我现在要试一试:)接口建议正是我想要的。只需一个投票者即可处理多个实体,无需为每个实体创建投票者,谢谢!
abstract class GenericVoter extends Voter {
abstract public function getOwnershipMethod();
abstract public function getRole();
abstract public function getClass();
protected function supports($attribute, $subject) {
if (!$subject instanceof $this->getClass()) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token) {
return $subject->{$this->getOwnershipMethod()} === $user;
}
}
class EventVoter extends GenericVoter {
public function getClass() {
return Event:class;
}
// Implement other abstract functions
}