JMS 序列化器运行时异常抛出 400 状态码

JMS serializer runtime exception to throw 400 status code

我正在使用 JMS 序列化程序,并且有两个字段,签入和签出作为具有特定格式的日期时间,如下所示:

/**
 * @var \DateTime
 * @Type("DateTime<'Y-m-d'>")
 * @Assert\Date()
 */
 protected $checkin;

/**
 * @var \DateTime
 * @Type("DateTime<'Y-m-d'>")
 * @Assert\Date()
 */
 protected $checkout;

现在,我想抛出 400 HTTP 状态代码,例如,如果有人发送无效格式(例如空字符串)。

问题是 JMS 序列化程序在无法从 DateHandler 中的格式创建日期时间时抛出 RuntimeException,如下所示:

if (false === $datetime) {
    throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format));
}

此异常给出了 500 HTTP 状态代码。

还检查了在配置中添加异常代码 400 的可能性,但问题是 JMS 在各种不同情况下都会抛出此类异常。

提前致谢!

这听起来像是您会使用 json-schema (PHP implementation) 之类的东西来验证用户提交的 JSON 而不是依赖 JMS 序列化程序的情况,正如其名称所暗示的那样,它纯粹是为了 de/serializing 内容而不是验证它。

作为权宜之计,您可以围绕反序列化执行 try/catch,然后手动 return 400 响应,例如

try {
    $deserialized = $serializer->deserialize($content, My\Class, 'json');
} catch (\Exception $e) {
    return new Response($e->getMessage(), 400);
}

尽管这可以解决您眼前的问题,但它并不是真正的最佳代码路径。在您的示例中,Symfony 本身正在捕获异常(因为它没有被您的代码捕获)并将其转换为 500 响应,JMS 序列化程序本身不能 return 400 响应。