- <?php
- namespace ForumBundle\Security;
- use Symfony\Component\Security\Core\Authorization\Voter\Voter;
- use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
- use CoreBundle\Entity\Category;
- use CoreBundle\Entity\Tutor;
- use CoreBundle\Entity\Student;
- class CategoryVoter extends Voter
- {
-     public function __construct()
-     {
-     }
-     protected function supports($attribute, $subject)
-     {
-         // if the attribute isn't one we support, return false
-         if (! in_array($attribute, array('view'))) {
-             return false;
-         }
-         // only vote on Post objects inside this voter
-         if (! $subject instanceof Category) {
-             return false;
-         }
-         return true;
-     }
-     /**
-      * Droit d'accès à une catégorie $subject
-      *
-      * {@inheritDoc}
-      * @see \Symfony\Component\Security\Core\Authorization\Voter\Voter::voteOnAttribute()
-      */
-     protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
-     {
-         $user = $token->getUser();
-         // les tables tutor et student n'ont pas évoluées ensemble, elles présentent pas mal de différences.
-         if ($user instanceof Tutor) {
-             // si c'est un admin, c'est réglé
-             if ($user->getAdmin()) {
-                 return true;
-             }
-             // on vérifie s'il y a un droit d'accès individuel
-             if ($user->getCategories()->contains($subject)) {
-                 return true;
-             }
-         } elseif ($user instanceof Student) {
-             if ($subject->getTutorOnly() == true) {
-                 return false;
-             }
-             // 1er lvl on vérifie la branche
-             if ($subject->getLevel() == 1) {
-                 if ($subject->getBranches()->contains($user->getBranche())) {
-                     return true;
-                 }
-             // 2ième (ou plus) level, on vérifie le secteur
-             } else {
-                 foreach ($user->getStudentSecteurs() as $studentSecteur) {
-                     if ($subject->getSecteurs()->contains($studentSecteur->getSecteur())) {
-                         if ($subject->getParent()->getBranches()->contains($user->getBranche())) {
-                             return true;
-                         }
-                         //return true;
-                     }
-                 }
-             }
-         }
-         return false;
-     }
- }