Событие api-platform.com не будет прикреплено к моему слушателю. Я попробовал несколько комбинаций из их матрицы событий, но она все равно не сработает.
# services.yml
user_access_listener:
class: AppBundle\Event\Listener\UserAccessListener
arguments: [ "@security.authorization_checker" ]
tags:
- { name: kernel.event_listener, event: kernel.view, method: onKernelView }
Вот мой класс слушателя
пространство имен AppBundle \ Event \ Listener;
use UserBundle\Entity\User;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class UserAccessListener
{
/**
* @var AuthorizationCheckerInterface
*/
private $authorizationChecker;
/**
* @param AuthorizationCheckerInterface $authorizationChecker
*/
public function __construct(AuthorizationCheckerInterface $authorizationChecker)
{
$this->authorizationChecker = $authorizationChecker;
}
/**
* @param GetResponseForControllerResultEvent $event
*/
public function onKernelView(GetResponseForControllerResultEvent $event)
{
echo "This should trigger";
exit;
$user = $event->getControllerResult();
if (!$user instanceof User) {
return;
}
if (!$this->authorizationChecker->isGranted(null, $user)) {
throw new AccessDeniedException();
}
}
}
Описание событий api-платформы
Я ожидал, что «Это должно сработать» появится, когда я нажму GET /projects/1
а также GET /projects
, но это не срабатывает. Мысли?
Вы должны использовать более высокий приоритет (например, 70), чтобы быть уверенным, что ваш слушатель выполняется перед слушателями со встроенным представлением.
Пример:
user_access_listener:
class: AppBundle\Event\Listener\UserAccessListener
arguments: [ "@security.authorization_checker" ]
tags:
- { name: kernel.event_listener, event: kernel.view, method: onKernelView, priority: 70 }
Других решений пока нет …