2016-11-30 5 views
0

Я разрабатываю веб-сайт, предлагающий услугу REST. Все действия GET в порядке и отображаются с использованием шаблона .json.twig, но мне трудно понять, как выводить ошибки формы, если запрос, созданный для создания новой записи, недопустим. Если я пытаюсь сделать простойКак обрабатывать недопустимые формы для ОТДЫХА?

return $form; 

я получаю следующее исключение из SF:

"исключение": [{ "сообщение": "Не удалось найти шаблон \" SomeBundle: Клиенты: postCustomer.json.twig \ "}]

шаблон не существует, это правда, но я понятия не имею, как создать в формате JSON, чтобы сказать запрашивающего, что его запрос является неполным/уродливы.

Если я попробую что-нибудь еще, имея дело с представлениями, но без указания шаблона, результат будет таким же. Есть ли способ сделать это автоматически, чтобы, если форма была изменена, изменение также отражается на ошибке? Или способ рассказать FOSRestBundle/JMSSerializerBundle, чтобы разобраться с сериализацией? Перед переключением на ответы Twig ошибка была хорошо обработана, и я хотел бы вернуть ее обратно вместе с шаблонами Twig для обычных операций.

Для получения дополнительной информации, действия моего текущего контроллера является:

/** 
* @ApiDoc(
*  resource=false, 
*  input="SomeBundle\Form\CustomerType", 
*  description="Create a new customer", 
*  section="Customers", 
*  statusCode={ 
*   201="Action successful", 
*   403="Authorization required but incorrect/missing information or insufficient rights", 
*   500="Returned if action failed for unknown reasons" 
*  } 
* ) 
* 
* --View(template="SomeBundle:Customers:add.json.twig", templateVar="form", statusCode=400) 
* @View(templateVar="form", statusCode=400) 
* @param Request $request 
* @return \FOS\RestBundle\View\View 
*/ 
    public function postCustomerAction(Request $request) { 
     $data = json_decode($request->getContent(), true); 
     $manager = $this->getManager(); 
     $customer = new Customer(); 
     $form = $this->getForm($customer); 
     //$form->submit($data); 
     //$manager->create($customer); 

//  $form->handleRequest($request); 
//  if ($form->isSubmitted() && $form->isValid()) { 
//   $manager->create($customer); 
// 
//   return $this->redirectView($this->generateUrl('api_get_customer_internal', ['uuid' => $customer->getInternalUuid()], true), 
//          201); 
//  } 

     return $form; 
     //return $this->handleView($this->view($form, 400)); 
     //return \FOS\RestBundle\View\View::create($form, 400); 
    } 

И конфигурация FOSRestBundle:

fos_rest: 
    param_fetcher_listener: true 
    body_listener: true 
    format_listener: 
    enabled: true 
    view: 
    view_response_listener: 'force' 
    formats: 
     json: true 
    templating_formats: 
     json: true 
    force_redirects: 
     html: true 
    failed_validation: HTTP_BAD_REQUEST 
    default_engine: twig 
    routing_loader: 
    include_format: false 
    default_format: json 
    serializer: 
    serialize_null: true 

sensio_framework_extra: 
    view: 
    annotations: true 

ответ

0

Благодаря jorge07 в https://github.com/FriendsOfSymfony/FOSRestBundle/issues/1620 я был в состоянии найти способ обойти, что в довольно (по крайней мере, IMHO), вот обновленное действие контроллера (без изменений в настройках fosrestbundle):

/** 
* @Route("/customers") 
* @ApiDoc(
*  resource=false, 
*  input="NetDev\CoreBundle\Form\CustomerType", 
*  description="Create a new customer", 
*  section="Customers", 
*  statusCode={ 
*   201="Action successful", 
*   403="Authorization required but incorrect/missing information or insufficient rights", 
*   500="Returned if action failed for unknown reasons" 
*  } 
* ) 
* 
* @View(template="NetDevRestBundle:Common:form_error.json.twig", templateVar="errors", statusCode=400) 
* 
* @RequestParam(name="customerName", nullable=false) 
* @RequestParam(name="customerIndex", nullable=false) 
* 
* @return \FOS\RestBundle\View\View 
*/ 
public function postCustomerAction(ParamFetcher $fetcher) 
{ 
    $customer = new Customer(); 
    $form = $this->getForm($customer); 
    $form->submit($fetcher->all(), true); 

    if ($form->isValid()) { 
     $manager = $this->getManager(); 
     $manager->create($customer); 

     return $this->redirectView($this->generateUrl('api_get_customer_internal', ['uuid' => $customer->getInternalUuid()], true), 201); 
    } 

    $err = $form->getErrors(); 
    $errorsList = []; 
    foreach ($err as $it) { 
     $errorsList[(string)$it->getOrigin()->getPropertyPath()] = $it->getMessage(); 
    } 

    return $this->view([$errorsList]) 
     ->setTemplateVar('errors') 
     ; 
}