Php 与symfony中的单个字段核对

Php 与symfony中的单个字段核对,php,symfony,permissions,acl,Php,Symfony,Permissions,Acl,我想知道如何对实体投票者内部的字段执行检查 例如,我有我的实体帖子,我希望不是管理员的用户不能编辑标题字段。只有管理员可以编辑此字段 所以我创建了我的投票者,但我不知道如何创建这个检查,因为$post中有一个旧的post实体,我不知道如何实现标题字段的检查 这是我的简易投票者档案 class PostVoter extends Voter { const VIEW = 'view'; const EDIT = 'edit'; private $decisionManag

我想知道如何对实体投票者内部的字段执行检查

例如,我有我的实体帖子,我希望不是管理员的用户不能编辑标题字段。只有管理员可以编辑此字段

所以我创建了我的投票者,但我不知道如何创建这个检查,因为$post中有一个旧的post实体,我不知道如何实现标题字段的检查

这是我的简易投票者档案

class PostVoter extends Voter
{
    const VIEW = 'view';
    const EDIT = 'edit';

    private $decisionManager;

    public function __construct(AccessDecisionManagerInterface $decisionManager)
    {
        $this->decisionManager = $decisionManager;
    }

    protected function supports($attribute, $subject)
    {
        if (!in_array($attribute, array(self::VIEW, self::EDIT))) {
            return false;
        }

        if (!$subject instanceof Post) {
            return false;
        }

        return true;
    }

    protected function voteOnAttribute(
        $attribute, 
        $subject, 
        TokenInterface $token
    ) {
        $user = $token->getUser();

        if (!$user instanceof User) {
            return false;
        }

        if ($this->decisionManager->decide($token, array('ROLE_SUPER_ADMIN'))) {
            return true;
        }

        /** @var Post $post */
        $post = $subject;

        switch ($attribute) {
            case self::VIEW:
                return $this->canView($post, $user);
            case self::EDIT:
                return $this->canEdit($post, $user);
        }

        throw new \LogicException('This code should not be reached!');
    }

    private function canView(Post $post, User $user)
    {
        if ($this->canEdit($post, $user)) {
            return true;
        }

        return true;
    }

    private function canEdit(Post $post, User $user)
    {
        return $user === $post->getUser();
    }
}
我想在canEdit内部实现对标题字段的检查。
我尝试打印$post,但只有旧值,没有新值的信息。

几种可能的方法

我会使用的方法是向投票人添加“编辑标题”权限,然后调整我的表单,使标题仅在编辑标题权限被拒绝时才可读。这不仅消除了检查更改的标题的需要,而且还让用户对内容更加友好。有人可能会想象,他们对一个允许他们更改标题的表单感到有点沮丧,但随后应用程序拒绝了更改

如果您确实想检测标题更改,那么可以调整post实体中的setTitle方法。比如:

class Post {
    private $titleWasChanged = false;
    public function setTitle($title) {
        if ($title !== $this->title) $this->titleWasChanged = true;
        $this->title = $title;
然后,当然要检查选民的$titleWasChanged


如果您真的想全力以赴,那么条令实体管理器实际上具有一些更改检查功能。你可能可以通过投票人访问它,但那可能是过火了

只是想澄清一下,您正在试图确定投票人内部的标题是否已更改?是的,或者如果不是更好的方式,请告诉我,我将此逻辑移动到控制器或服务中。我真的不知道如何检查一个领域的最佳方法非常有趣的解决方案!我试试看。谢谢