2016-08-09 392 views
0

Sie können auf meiner Website abonnieren. Ich benutze FOSUserBundle. Wenn der Benutzer abonniert wird, hat er die Rolle ROLE_SUBSCRIBER erhalten, die ihm den Zugriff auf die neue Seite ermöglicht. Ich möchte, dass diese Rolle nach einem Zeitraum abläuft, den ich in der User-Entität erfasst habe.Ablauf einer Rolle Symfony

class User extends BaseUser 
{ 
    // ... 

    * @ORM\Column(type="datetime") 
    protected $subscribeExpiration; 


    public function setSubscribeExpiration(\DateTime $subscribeExpiration) { 
     $this->subscribeExpiration = clone $subscribeExpiration; 

     return $this; 
    } 
    public function getSubscribeExpiration() { 
     return $this->subscribeExpiration; 
    } 

    // ... 
} 

Antwort

1

keine Rolle verwenden, sondern ein Voter.

in Ihren Wählern Check Dann wird für die expireDate zu entscheiden, ob der Benutzer ein Subsciber ist oder nicht:

// src/AppBundle/Security/PostVoter.php 
namespace AppBundle\Security; 

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\Authorization\Voter\Voter; 

use AppBundle\Entity\User; 

class SubscriberVoter extends Voter 
{ 
    const IS_SUBSCRIBER = 'is_subscriber'; 

    protected function supports($attribute, $subject) 
    { 
     if (!in_array($attribute, array(self::IS_SUBSCRIBER))) { 
      return false; 
     } 

     return true; 
    } 

    protected function voteOnAttribute($attribute, $subject, TokenInterface $token) 
    { 
     $user = $token->getUser(); 

     if (!$user instanceof User) { 
      // the user must be logged in; if not, deny access 
      return false; 
     } 

     // you know $subject is a Post object, thanks to supports 
     /** @var Post $post */ 
     $post = $subject; 

     switch ($attribute) { 
      case self::IS_SUBSCRIBER: 
       $expireDate = $user->getSubscriberExpireDate(); 
       $currendDate = new \DateTime(); 

       return (null !== $expireDate && $expireDate > $currendDate); 
     } 

     throw new \LogicException('This code should not be reached!'); 
    } 
} 

diese 'Rolle' zu überprüfen:

$this->isGranted('is_subscriber');