在 symfony 中检查选民的单个字段
check with voters single field in symfony
我想知道如何对实体选民内部的字段进行检查。
例如我的实体 Post 我希望非管理员用户无法编辑标题字段。只有管理员可以编辑此字段。
所以我创建了我的选民,但我不知道如何创建这个检查,因为在 $post
里面有旧的 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 中实现对标题字段的检查。
我试图打印 $post 但只有旧值没有新值的一些信息。
几种可能的方法。
我要使用的方法是向投票者添加 '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。
如果你真的想全力以赴,Doctrine 实体管理器实际上有一些更改检查功能。您可能可以通过选民访问它,但这可能有点矫枉过正。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/change-tracking-policies.html
我想知道如何对实体选民内部的字段进行检查。
例如我的实体 Post 我希望非管理员用户无法编辑标题字段。只有管理员可以编辑此字段。
所以我创建了我的选民,但我不知道如何创建这个检查,因为在 $post
里面有旧的 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 中实现对标题字段的检查。 我试图打印 $post 但只有旧值没有新值的一些信息。
几种可能的方法。
我要使用的方法是向投票者添加 '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。
如果你真的想全力以赴,Doctrine 实体管理器实际上有一些更改检查功能。您可能可以通过选民访问它,但这可能有点矫枉过正。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/change-tracking-policies.html