Новое в Symfony 6.3 — Атрибуты исключений HTTP

Источник: «New in Symfony 6.3: HTTP Exception Attributes»
Symfony 6.3 вводит два новых атрибута для настройки кода состояния, заголовков и уровня журнала ваших HTTP исключений.

PHP атрибуты позволяют определять машиночитаемые метаданные в вашем коде вместо того, чтобы добавлять эту конфигурацию в отдельный файл. С каждой новой версией Symfony мы добавляем больше атрибутов, которые вы можете использовать по желанию. В Symfony 6.3 мы добавили новые атрибуты для настройки HTTP исключений.

В настоящее время для создания собственных HTTP исключений необходимо реализовать HttpExceptionInterface (или расширить базовый класс HttpException) и настроить его в параметре framework.exceptions:

use App\Domain\Exception\Order\OrderNotFound;
use Symfony\Component\HttpKernel\Exception\HttpException;

class OrderNotFound extends HttpException
{
public static function create(string $id): self
{
return new self(
statusCode: Response::HTTP_NOT_FOUND,
message: sprintf('The order "%s" could not be found.', $id),
headers: ['x-header' => 'foo'],
);
}
}
# config/packages/exceptions.yaml
framework:
exceptions:
App\Domain\Exception\Order\OrderNotFound:
log_level: 'debug'
status_code: 404

В Symfony 6.4 приведённый выше код и конфигурация всё ещё работают, но вы можете при желании заменить их следующими атрибутами PHP:

use App\Domain\Exception\Order\OrderNotFound;
use Psr\Log\LogLevel;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Attribute\WithHttpStatus;
use Symfony\Component\HttpKernel\Attribute\WithLogLevel;

#[WithHttpStatus(Response::HTTP_NOT_FOUND, headers: ['x-header' => 'foo'])]
#[WithLogLevel(LogLevel::DEBUG)]
class OrderNotFound
{
// ...

public function getMessage(): string
{
return sprintf('The order "%s" could not be found.', $this->order->getId());
}
}

Вот и всё. Вам больше не нужно ничего настраивать в параметре framework.exception. В дополнение к тому, что вся информация находится в одном файле, это также устраняет связь ваших HTTP исключений с компонентом HttpKernel. Другими словами, исключения вашего домена отделены от кода инфраструктуры.

Если ваше приложение использует как атрибуты, так и параметр framework.exception, конфигурация будет иметь более высокий приоритет, чем атрибуты.

Дополнительные материалы

Предыдущая Статья

Нужно ли комментировать свой код?

Следующая Статья

Продвинутый Laravel: Контракты и Реализации