Исключение AccessDeniedHttpException
Исключение AccessDeniedHttpException наследуется от
HttpException и сигнализирует о том, что доступ к
ресурсу запрещён. Оно выбрасывается, когда пользователь
аутентифицирован, но не имеет нужных прав для выполнения
операции. Первым параметром передаётся сообщение об ошибке,
вторым - предыдущее исключение, третьим - код ошибки.
По умолчанию исключение возвращает HTTP-статус 403.
Синтаксис
<?php
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
throw new AccessDeniedHttpException($message, $previous, $code);
?>
Пример
Давайте выбросим исключение AccessDeniedHttpException
в контроллере, если у пользователя нет нужной роли:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/delete', name: 'article_delete')]
public function delete(): Response
{
if (!$this->isGranted('ROLE_ADMIN')) {
throw new AccessDeniedHttpException('Access denied for this action');
}
return new Response('article deleted');
}
}
?>
Результат выполнения кода при отсутствии прав:
"Access denied for this action"
Пример
Давайте перехватим исключение и вернём пользователю понятный ответ:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/edit', name: 'article_edit')]
public function edit(): Response
{
try {
if (!$this->isGranted('ROLE_EDITOR')) {
throw new AccessDeniedHttpException('You cannot edit this article');
}
return new Response('article edited');
} catch (AccessDeniedHttpException $e) {
return new Response($e->getMessage(), $e->getStatusCode());
}
}
}
?>
Результат выполнения кода при отсутствии прав:
"You cannot edit this article"
Пример
Давайте получим код статуса и заголовки исключения:
<?php
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
$e = new AccessDeniedHttpException('Access denied');
echo $e->getStatusCode();
echo "\n";
echo $e->getMessage();
?>
Результат выполнения кода:
403
Access denied
Смотрите также
-
исключение
HttpException,
базовый класс для HTTP-исключений -
исключение
NotFoundHttpException,
которое сигнализирует об отсутствии ресурса -
исключение
UnauthorizedHttpException,
которое требует аутентификации пользователя -
метод
getStatusCode,
который возвращает HTTP-код исключения