Новое в 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
, конфигурация будет иметь более высокий приоритет, чем атрибуты.