2016-02-08 2 views
3

У меня есть конечная точка postOrder - создайте сущность заказа. В порядке сущности у меня есть поля с типом DateTime, и я хочу, когда кто-то пишет строку вместо DateTime У меня есть «Недействительно, должно быть DateTime». Для других полей я использую, как этоSymfony Assert DateTime JMSSerializer

* @Assert\Length(min=3, max=255) 

или

* @Assert\Regex(
*   pattern= "/^[\d() \-+]+$/", 
*   message= "This text cannot contain numbers" 
*) 

или

 * @Assert\NotBlank() 

Я получаю все запросы, то сериализации то десериализации для конкретного лица при Validate и получить информацию от утверждают в конечной точке , но для 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, 'Artel\ProfileBundle\Entity\CodeServiceLead', 'json'); 
     $errors = $this->get('validator')->validate($serviceLead); 
      if (count($errors) > 0) { 
       $view = $this->view($errors, 400); 

       return $this->handleView($view); 
      } 

и поля

class Orders 
{ 


    /** 
* @var string 
* 
* @ORM\Column(name="comment", type="string", nullable=true) 
* @Groups({"get_all_orders_admin", "get_all_orders", "for_vip"}) 
*/ 
protected $comment; 

    /** 
* @var \DateTime 
* @ORM\Column(name="interview_date", type="date", nullable=true) 
* @Groups({"get_all_orders_admin", "get_all_orders", "for_vip"}) 
* @Assert\DateTime() 
*/ 
protected $interview_date; 

/** 
* @var \DateTime 
* @ORM\Column(name="contact_date", type="date", nullable=true) 
* @Groups({"get_all_orders_admin", "get_all_orders", "for_vip"}) 
* @Assert\DateTime() 
*/ 
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, в этой ситуации?

ответ

1

Когда вы звоните deserialize(), это уже проверяет вашу сущность на действительность в отношении аннотаций доктрины, поскольку JMS Serializer already integrates with the Doctrine ORM.

Если десериализация не удалась, это exception is thrown, что и есть то, что вы видите.

Все, что вам нужно сделать в вашем случае поместить ваш код в 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, 
      'Artel\ProfileBundle\Entity\CodeServiceLead', 
      'json' 
     ); 
    } catch (\Exception $e) { 
     $view = $this->view((array) $e->getMessage(), 400); 

     return $this->handleView($view); 
    } 
} 

я не видел вашу view() функции, но я предположил, что это ожидал массив строк сообщений об ошибках, поэтому я передал сообщение исключения в массив. В любом случае вы получите эту идею.

+0

у меня есть * @RestView(). Thnks, у меня есть информационная ошибка. Thnks –

Смежные вопросы