Symfony2:将第二个对象传递给选民

时间:2016-10-12 13:01:56

标签: symfony-2.8 symfony-security

我正在使用选民来确定登录用户是否可以编辑给定对象。其中一个标准需要与另一个对象进行比较,但我不确定如何将其传递给选民。我不能使用构造函数参数,因为它不是预定义的值。

基本上我想做这样的事情:

 protected function voteOnAttribute($attribute, $subject, TokenInterface $token, $comparedObject)
            { if ($subject->getProperty1 == $comparedObject) 
    {return true;} 
    }

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

有点晚了,但也许这个答案对某人会有所帮助。

您可以做的一件事是传递一个$ subject对象的值实例数组。

例如,在Twig中,您将函数用作:

{% set data =  { 'subject': yourRealSubject, 'compared_object': comparedObject } %}
{% if is_granted('can_edit', data) %}        
...
...
{% endif %}

(您可以从PHP代码执行相同操作。)

然后在您的选民中:

class MyVoter  extends Voter{


        // ...

        protected function voteOnAttribute($attribute, $data, TokenInterface $token) {

                $subject = isset($data['subject']) ? $data['subject'] : null;
                $comparedObject = isset($data['compared_object']) ? $data['compared_object'] : null;

                if(!$subject || !$subject instanceof \Namespace\To\Subject){
                      throw new Exception('Missing or invalid subject!!!'');
                }

                // do whatever you want ...

        }
}

答案 1 :(得分:0)

我的建议是创建" subject"的其他属性。在哪里可以放置"比较对象"。

// Inside action.
public function myBestAction(Request $request) 
{
   // My super code... e.g. we have received from ORM a $post. 

   // Create property on the fly to put $comparedObject. 
   // Perhaps creating property dynamically is not good practice, therefore you can create permanent with getter and setter. 
   $post->comparedObject = $comparedObject;
   $this->isGranted('can_edit', $post);
} 

// Now inside voter.
private function canEdit($subject)
{
   $comparedObject = $subject->comparedObject;

   // Compare $subject(post) with $comparedObject and return true or false...
}