Исключение PreconditionFailedHttpException
Исключение PreconditionFailedHttpException относится к семейству HTTP-исключений Symfony и соответствует статус-коду 412. Оно выбрасывается, когда клиент отправил запрос с заголовками If-Match, If-None-Match, If-Unmodified-Since или If-Range, но текущее состояние ресурса не соответствует этим условиям. Конструктор принимает первым параметром сообщение об ошибке, вторым - предыдущее исключение, третьим - код ошибки, четвёртым - массив HTTP-заголовков.
Синтаксис
<?php
use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException;
throw new PreconditionFailedHttpException($message, $previous, $code, $headers);
?>
Пример
Давайте выбросим исключение PreconditionFailedHttpException в контроллере, если версия ресурса не совпадает с ожидаемой:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(int $id, string $version): Response
{
$currentVersion = 'abcde';
if ($version !== $currentVersion) {
throw new PreconditionFailedHttpException(
'Resource version mismatch'
);
}
return new Response('article content');
}
}
?>
Результат выполнения кода для адреса /article/1?version=xyz:
412 Precondition Failed
Пример
Давайте перехватим исключение и вернём кастомный ответ с дополнительными заголовками:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(int $id, string $version): Response
{
try {
$currentVersion = 'abcde';
if ($version !== $currentVersion) {
throw new PreconditionFailedHttpException(
'Resource version mismatch',
null,
0,
['X-Expected-Version' => $currentVersion]
);
}
return new Response('article content');
} catch (PreconditionFailedHttpException $e) {
return new Response(
$e->getMessage(),
$e->getStatusCode(),
$e->getHeaders()
);
}
}
}
?>
Результат выполнения кода для адреса /article/1?version=xyz:
Resource version mismatch
Смотрите также
-
исключение
HttpException,
которое является базовым для HTTP-исключений -
исключение
NotFoundHttpException,
которое соответствует ошибке 404 -
исключение
ConflictHttpException,
которое соответствует ошибке 409 -
метод
getStatusCode,
который возвращает код ответа исключения