-
-
Save cystbear/1391850 to your computer and use it in GitHub Desktop.
| <?php | |
| class DefaultController extends Controller | |
| { | |
| /** | |
| * Dashboard page. | |
| * @Permissions(perm="dashboard_view") | |
| * @Route("/", name="ITEDashboardBundle_index") | |
| * @Template() | |
| * @return array | |
| */ | |
| public function indexAction() | |
| {....... |
| <?php | |
| namespace SomeNameSpace\SomeBundle\Annotations; | |
| /** | |
| * @Annotation | |
| */ | |
| class Permissions | |
| { | |
| public $perm; | |
| } |
| <?php | |
| namespace SomeNamespace\SomeBundle\Annotations\Driver; | |
| use Doctrine\Common\Annotations\Reader;//This thing read annotations | |
| use Symfony\Component\HttpKernel\Event\FilterControllerEvent;//Use essential kernel component | |
| use SomeNamespace\SomeBundle\Annotations;//Use our annotation | |
| use SomeNamespace\SomeBundle\Security\Permission;//In this class I check correspondence permission to user | |
| use Symfony\Component\HttpFoundation\Response;// For example I will throw 403, if access denied | |
| use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
| class AnnotationDriver{ | |
| private $reader; | |
| public function __construct($reader) | |
| { | |
| $this->reader = $reader;//get annotations reader | |
| } | |
| /** | |
| * This event will fire during any controller call | |
| */ | |
| public function onKernelController(FilterControllerEvent $event) | |
| { | |
| if (!is_array($controller = $event->getController())) { //return if no controller | |
| return; | |
| } | |
| $object = new \ReflectionObject($controller[0]);// get controller | |
| $method = $object->getMethod($controller[1]);// get method | |
| foreach ($this->reader->getMethodAnnotations($method) as $configuration) { //Start of annotations reading | |
| if(isset($configuration->perm)){//Found our annotation | |
| $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)){ | |
| //if any throw 403 | |
| throw new AccessDeniedHttpException(); | |
| } | |
| } | |
| } | |
| } | |
| } |
| # SomeBundle\config\services.yml | |
| services: | |
| some_annotation_driver: | |
| class: SomeNamespace\SomeBundle\Annotations\Driver\AnnotationDriver #Point class | |
| tags: [{name: kernel.event_listener, event: kernel.controller, method: onKernelController}] #Point event | |
| arguments: [@annotation_reader] # Pass annotation_reader into constructor of our service |
| namespace SomeNamespace\SomeBundle\Controller; | |
| use SomeNamespace\SomeBundle\Annotations\Permissions; | |
| <?php | |
| /** | |
| * Dashboard controller. | |
| * | |
| * @Route("/dashboard") | |
| */ | |
| class DefaultController extends Controller | |
| { | |
| /** | |
| * Dashboard page. | |
| * @Permissions(perm="dashboard_view") | |
| * @Route("/", name="ITEDashboardBundle_index") | |
| * @Template() | |
| * @return array | |
| */ | |
| public function indexAction() | |
| {...} | |
| } |
Try:
$event->setResponse($response);Nice tips, have you an idea to list all IDs ?
@tgallice all event ids ?
I am followed all steps but I put the annotation on method. I get this error:
FileLoaderImportCircularReferenceException in FileLoader.php line 97:
Circular reference detected in "C:\htdocs\pronaturalis\app/config/routing_dev.yml" ("C:\htdocs\pronaturalis\app/config/routing_dev.yml" > "C:\htdocs\pronaturalis\app/config\routing.yml" > "C:\htdocs\pronaturalis\src\MLM\Bundle\MLMBundle/Controller/" > "C:\htdocs\pronaturalis\app/config/routing_dev.yml").
Any idea what could be wrong? I am using Symfony 2.6
@dextervip I had the same error when I tried to create a service that provide me the annotation reader object to pass as an argument in the annotation driver service (all this because the service; @annotation_reader its not reconized) I solve this creating a class (AnnotationReaderSon) that extends Annotation Reader (from Doctrine Common), and then creating a service from the new class 'AnnotationReaderSon'.
Is there a way to make a redirection inside onKernelController ?