Исключение ConflictHttpException
Класс ConflictHttpException наследуется от
HttpException и представляет HTTP-ошибку
с кодом 409. Исключение бросают, когда
запрос не может быть выполнен из-за конфликта
с текущим состоянием ресурса: например, при
попытке создать запись с уже существующим
уникальным значением или изменить объект,
который был изменён другим пользователем.
Первым параметром конструктор принимает сообщение об ошибке. Вторым параметром можно передать предыдущее исключение, а третьим - массив HTTP-заголовков ответа.
Синтаксис
<?php
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
throw new ConflictHttpException(
string $message = '',
Throwable $previous = null,
int $code = 0,
array $headers = []
);
?>
Пример
Давайте бросим исключение ConflictHttpException
в контроллере, если статья с таким заголовком
уже существует:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/create', name: 'article_create')]
public function create(string $title): Response
{
$existing = ['article', 'user', 'hello'];
if (in_array($title, $existing, true)) {
throw new ConflictHttpException('Article already exists');
}
return new Response('created');
}
}
?>
Результат выполнения кода для адреса
/article/create?title=article:
Article already exists
Пример
Давайте перехватим исключение и вернём
статус ответа через метод getStatusCode:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/update', name: 'article_update')]
public function update(int $id): Response
{
try {
if ($id === 1) {
throw new ConflictHttpException('Version conflict');
}
return new Response('updated');
} catch (ConflictHttpException $e) {
return new Response(
$e->getMessage(),
$e->getStatusCode()
);
}
}
}
?>
Результат выполнения кода для адреса
/article/update?id=1:
Version conflict
Пример
Давайте передадим дополнительные HTTP-заголовки вместе с исключением:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/lock', name: 'article_lock')]
public function lock(): Response
{
throw new ConflictHttpException(
'Resource is locked',
null,
0,
['Retry-After' => '60']
);
}
}
?>
Результат выполнения кода:
Resource is locked
Смотрите также
-
исключение
HttpException,
базовый класс для всех HTTP-исключений -
исключение
NotFoundHttpException,
которое сообщает об ошибке 404 -
метод
getStatusCode,
который возвращает HTTP-код исключения -
метод
getMessage,
который возвращает текст сообщения об ошибке