2017-07-04 4 views
0

je définis un électeur, en particulier voteOnAttribute comme méthode suivante:Symfony électeurs usages constants

public function voteOnAttribute($attributes, $subject, TokenInterface $token) { 

     $user = $token->getUser(); 

     if (!$user instanceof User) { 
      return false; 
      // return static::ACCESS_DENIED 
     } 
     if(!$subject instanceof PrivateResource) { 
      throw new Exception('Media type mismatch : private resource expected here'); 
     } 

     // Check company is elligible here 
     if(!$subject->getCompanies()->contains($user->getCompany())){ 
      return false; 
      // return static::ACCESS_DENIED 
     } 

     return static::ACCESS_GRANTED; 
    } 

Pourquoi ne puis-je utiliser VoterInterface constantes (ACCESS_GRANTED, ACCESS_ABSTAIN, ACCESS_DENIED) dans ma méthode?

Si je le fais, l'accès est refusé décision pas exécutée en raison de la méthode vote en classe abstraite Voter:

public function vote(TokenInterface $token, $subject, array $attributes) 
    { 
     // abstain vote by default in case none of the attributes are supported 
     $vote = self::ACCESS_ABSTAIN; 

     foreach ($attributes as $attribute) { 
      if (!$this->supports($attribute, $subject)) { 
       continue; 
      } 

      // as soon as at least one attribute is supported, default is to deny access 
      $vote = self::ACCESS_DENIED; 

      if ($this->voteOnAttribute($attribute, $subject, $token)) { 
       // grant access as soon as at least one attribute returns a positive response 
       return self::ACCESS_GRANTED; 
      } 
     } 

     return $vote; 
    } 

Comme ACCESS_DENIED constante est réglée sur -1 dans VoterInterface, la condition if ($this->voteOnAttribute($attribute, $subject, $token)) est vrai, même si le retour est -1.

Qu'est-ce que je fais ici? Ces constantes sont-elles prévues pour être utilisées dans nos méthodes personnalisées voteOnAttribute?

Note: Je définir la stratégie électorale à unanimous dans security.yml

Répondre

2

D'abord, je pensais que je missunderstood la documentation.

Mais il y a une différence dans la documentation entre les versions de symfony

en supposant que vous utilisez symfony> = 2.7 vous devez retourner une valeur booléenne dans voteOnAttribute