在symfony查看选民单场

时间:2017-04-13 14:33:05

标签: php symfony permissions acl

我想知道如何对实体选民内部的一个字段进行检查。

我有我的实体发布,我希望用户不是管理员不能编辑标题字段。只有管​​理员可以编辑此字段。

所以我创建了我的选民,但我不知道如何创建这个检查,因为在$post内有旧帖子实体,我不知道如何实现title的检查字段

这是我的简易选民档案

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里面实现对title字段的检查。 我试图打印$ post但是只有旧值而不是新值的信息。

1 个答案:

答案 0 :(得分:1)

几种可能的方法。

我将使用的是向选民添加'edit_title'权限,然后调整我的表单,只有在edit_title权限被拒绝时才能读取标题。这不仅消除了检查已更改标题的需要,而且还使用户更友好一些。有人可能会想到他们对表单有点沮丧,允许他们更改标题,然后应用拒绝更改。

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

class Post {
    private $titleWasChanged = false;
    public function setTitle($title) {
        if ($title !== $this->title) $this->titleWasChanged = true;
        $this->title = $title;

然后当然从选民那里检查$ titleWasChanged。

如果你真的想要全力以赴,那么Doc​​trine实体经理实际上有一些变更检查功能。你可以通过选民访问它,但这可能是矫枉过正。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/change-tracking-policies.html