我正在使用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 Serializer无法从DateHandler中的格式创建日期时间时会抛出RuntimeException
,如下所示:
if (false === $datetime) {
throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format));
}
此异常提供500 HTTP状态代码。
此外,还检查了为配置添加异常代码400的可能性,但问题是JMS会在各种不同情况下抛出此类异常。
提前致谢!
答案 0 :(得分:0)
这听起来像你会使用类似json-schema(PHP implementation)之类的东西来验证用户提交的JSON,而不是依赖于JMS Serializer,正如其名称所暗示的那样,纯粹是为了de /序列化内容而不是验证它。
作为一个停止间隙,您可以尝试/捕获反序列化,然后手动返回400响应,例如
try {
$deserialized = $serializer->deserialize($content, My\Class, 'json');
} catch (\Exception $e) {
return new Response($e->getMessage(), 400);
}
虽然这可以解决您的直接问题,但它并不是最好的代码路径。在您的示例中,Symfony正在捕获异常本身(因为它没有被您的代码捕获)并将其转换为500响应,JMS序列化程序本身无法返回400响应。