<?php
namespace App\Extension\Annotations\Driver;
use App\Extension\Annotations;
use \Doctrine\Common\Annotations\PsrCachedReader;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\Routing\Router;
/**
* Class PermissionsDriver
* @package App\Extension\Annotations\Driver
*/
class PermissionsDriver
{
/** @var PsrCachedReader $reader */
protected $reader;
/** @var \Symfony\Component\HttpFoundation\Request|null $request */
protected $request;
/** @var string $key */
protected $key;
/** @var Router $router */
protected $router;
/**
* PermissionsDriver constructor.
* @param PsrCachedReader $reader
* @param RequestStack $requestStack
* @param Router $router
* @param $key
*/
public function __construct(PsrCachedReader $reader, RequestStack $requestStack, Router $router, $key)
{
$this->router = $router;
$this->reader = $reader;
$this->request = $requestStack->getMasterRequest();
$this->key = $key;
}
/**
* @param ControllerEvent $event
* @throws \ReflectionException
*/
public function onKernelController(ControllerEvent $event)
{
if (!\is_array($controller = $event->getController()))
return;
if(empty($this->request->attributes->get('_route_params')[$this->key]))
return;
$object = new \ReflectionObject($controller[0]);
$method = $object->getMethod($controller[1]);
foreach ($this->reader->getMethodAnnotations($method) as $configuration)
{
if($configuration instanceof Annotations\Permissions)
{
if(
empty($this->request->getSession()->get('insalesId'))
|| $this->request->getSession()->get('insalesId') != $this->request->attributes->get('_route_params')[$this->key]
)
{
$response = new RedirectResponse($this->router->generate('session.end'));
$event->setController(
function() use ($response)
{
return $response;
}
);
}
}
}
}
}