Php 如何使Symfony多实体通用投票器

Php 如何使Symfony多实体通用投票器,php,symfony,Php,Symfony,我正在我的系统中实现投票者,我不知道如何为投票者创建/扩展/实现更通用的方法 我有以下投票人(缩小): 这一个可以正常工作。然而,我也想要一个新闻,页面,技能,食物和酒吧 我可以复制这个投票者,然后改变最重要的变量。但由于这是仅有的3个变化,我需要某种类型的通用投票者,我可以用值加载,例如,在构造上,从而生成更可靠的代码,在一个点上具有真实的逻辑 但如果我用Voter扩展泛型类,它会自动加载它。我希望它忽略泛型类,最终得到如下结果: class EventVoter extends Generi

我正在我的系统中实现投票者,我不知道如何为投票者创建/扩展/实现更通用的方法

我有以下投票人(缩小):

这一个可以正常工作。然而,我也想要一个新闻,页面,技能,食物和酒吧

我可以复制这个投票者,然后改变最重要的变量。但由于这是仅有的3个变化,我需要某种类型的通用投票者,我可以用值加载,例如,在构造上,从而生成更可靠的代码,在一个点上具有真实的逻辑

但如果我用Voter扩展泛型类,它会自动加载它。我希望它忽略泛型类,最终得到如下结果:

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
}