<?php
namespace SomeNamespace\SomeBundle\Annotations\Driver;
use Doctrine\Common\Annotations\Reader;//Вот эта штука как раз и читает аннотации
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;//Подключаем нужный компонент ядра
use SomeNamespace\SomeBundle\Annotations;//Юзаем свою аннотацию
use SomeNamespace\SomeBundle\Security\Permission; //В этом классе я проверяю соответствие permission to user
use Symfony\Component\HttpFoundation\Response; // В нашем примере я просто буду выводить 403, если нет доступа
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class AnnotationDriver{
private $reader;
public function __construct($reader)
{
$this->reader = $reader;//Получаем читалку аннотаций
}
/**
* Это событие возникнет при вызове любого контроллера
*/
public function onKernelController(FilterControllerEvent $event)
{
if (!is_array($controller = $event->getController())) { //Выходим, если нет контроллера
return;
}
$object = new \ReflectionObject($controller[0]);// Получаем контроллер
$method = $object->getMethod($controller[1]);// Получаем метод
foreach ($this->reader->getMethodAnnotations($method) as $configuration) { //Начинаем читать аннотации
if(isset($configuration->perm)){//Если прочитанная аннотация наша, то выполняем код ниже
$perm = new Permission($controller[0]->get('doctrine.odm.mongodb.document_manager'));
$userName = $controller[0]->get('security.context')->getToken()->getUser()->getUserName();
if(!$perm->isAccess($userName,$configuration->perm)){
//Если после проверки доступа нет, то выдаём 403
throw new AccessDeniedHttpException();
}
}
}
}
}