我有端点后序 - 创建实体顺序。在实体顺序中,我有类型为 DateTime 的字段,我希望当有人写字符串而不是 DateTime 时,我有"无效,应该是日期时间"。对于我像这样使用的其他字段
* @AssertLength(min=3, max=255)
或
* @AssertRegex(
* pattern= "/^[d() -+]+$/",
* message= "This text cannot contain numbers"
* )
或
* @AssertNotBlank()
我得到所有请求,然后在验证时序列化然后反序列化具体实体,并在端点中有来自断言的信息,但对于 DateTime,这不起作用我使用 FosRestBundle 和 JMSSerializer,这是我的操作
/**
* Post Order.
*
* @ApiDoc(
* resource = true,
* description = "Post Order",
* parameters={
* {"name"="comment", "dataType"="string", "required"=false, "description"="comment"},
* {"name"="interview_date", "dataType"="date", "required"=false, "description"="date conect for developer"},
* {"name"="contact_date", "dataType"="date", "required"=false, "description"="date contact fir TIM"}
*
* },
* statusCodes = {
* 200 = "Returned when successful",
* 400 = "Returned secret token is not valid"
* },
* section="Order"
* )
*
* @RestView()
*
* @param Request $request
*
* @return View
*
* @throws NotFoundHttpException when not exist
*/
public function postOrderAction(Request $request)
{
$data = $request->request->all();
$data = $this->get('serializer')->serialize($data, 'json');
$serviceLead = $this->get('serializer')->deserialize($data, 'ArtelProfileBundleEntityCodeServiceLead', 'json');
$errors = $this->get('validator')->validate($serviceLead);
if (count($errors) > 0) {
$view = $this->view($errors, 400);
return $this->handleView($view);
}
和字段
class Orders
{
/**
* @var string
*
* @ORMColumn(name="comment", type="string", nullable=true)
* @Groups({"get_all_orders_admin", "get_all_orders", "for_vip"})
*/
protected $comment;
/**
* @var DateTime
* @ORMColumn(name="interview_date", type="date", nullable=true)
* @Groups({"get_all_orders_admin", "get_all_orders", "for_vip"})
* @AssertDateTime()
*/
protected $interview_date;
/**
* @var DateTime
* @ORMColumn(name="contact_date", type="date", nullable=true)
* @Groups({"get_all_orders_admin", "get_all_orders", "for_vip"})
* @AssertDateTime()
*/
protected $contact_date;
现在当我尝试反序列化实体订单时出现错误
{
"error": {
"code": 500,
"message": "Internal Server Error",
"exception": [
{
"message": "Invalid datetime "some_string", expected format Y-m-d\TH:i:sO.",
"class": "JMS\Serializer\Exception\RuntimeException",
在这种情况下,如何在没有 500 的情况下返回正确的错误或断言?
当你调用deserialize()
时,这已经根据你的教义注释检查你的实体的有效性,因为JMS序列化程序已经与教义ORM集成。
如果反序列化失败,则会引发异常,这就是您所看到的。
在这种情况下,如果您想自己处理代码,您只需将代码放在try/catch
块中:
public function postOrderAction(Request $request)
{
$data = $request->request->all();
$data = $this->get('serializer')->serialize($data, 'json');
try {
$serviceLead = $this->get('serializer')->deserialize(
$data,
'ArtelProfileBundleEntityCodeServiceLead',
'json'
);
} catch (Exception $e) {
$view = $this->view((array) $e->getMessage(), 400);
return $this->handleView($view);
}
}
我没有看到您的view()
函数,但我认为它需要一系列错误消息,所以我将异常消息投射到数组中。 无论哪种方式,你都会得到这个想法。