<?php
namespace App\EventSubscriber;
use App\Entity\CurrentUserInterface;
use App\Exception\CurrentUserException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Security;
class CurrentUserSubscriber implements EventSubscriberInterface
{
/**
* @var Security
*/
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* @throws CurrentUserException
*/
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if ($request) {
return;
}
$resource = $request->attributes->get('_api_resource_class');
if (!class_exists($resource)) {
return;
}
$reflection = new \ReflectionClass($resource);
if ($request->isMethod(Request::METHOD_POST) && $reflection->implementsInterface(CurrentUserInterface::class)) {
$userAttribute = $resource::getUserAttribute();
if (!property_exists($resource, $userAttribute)) {
throw new CurrentUserException(sprintf('property %s not exist in %s class', $userAttribute, $resource));
}
}
}
public static function getSubscribedEvents()
{
return [
'kernel.request' => ['onKernelRequest', 10],
];
}
}