4

ログインしたユーザーが特定のオブジェクトを編集できるかどうかを判断するために投票者を使用しています。基準の 1 つは別のオブジェクトとの比較を必要としますが、これをボーターに渡す方法がわかりません。事前定義された値ではないため、コンストラクターの引数を使用できません。

基本的に私はこのようなことをしたいと思います:

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

どんな助けでも大歓迎です。

4

2 に答える 2

2

少し遅れていますが、この回答が誰かの役に立つかもしれません。

できることの 1 つは、単一の $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 ...

        }
}
于 2020-02-14T11:29:38.443 に答える
1

私の提案は、「比較対象」を配置できる「対象」の追加プロパティを作成することです。

// 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...
}
于 2016-10-25T18:30:50.913 に答える