2016-02-09 2 views
3

Я разрабатываю простой Rest API (только JSON) с symfony3. Я использую Forms для проверки сущностей, но я не могу найти достаточно хороший способ обработки ошибок формы и возврата значимого json-сообщения об ошибке. Вот пример действия моего контроллера:Symfony3 - Лучший способ обработки ошибок в API JSON Rest?

/** 
* @Route("/user/add" , name="addUser") 
* @Method({"POST"}) 
* 
* @param Request $request 
* @return JsonResponse 
*/ 
public function registerAction(Request $request) { 
    $user = new User(); 
    $form = $this->createForm(UserType::class, $user, ['validation_groups' => ['registration']]); 
    $form->handleRequest($request); 

    if(!$form->isValid()){ 
     //TODO: Handle errors properly 
    } 

    $this->get('user_service')->addUser($user); 

    $userModel = new UserModel($user); 

    return new JsonResponse($userModel); 
} 

Я имею в виду бросать специальное исключение, которое содержит данные формы/ошибок и чем обработка исключений в пользовательских исключений Listener, разбирая форму и возвращает JsonResponse. Но я не уверен, что это правильный способ обработки ошибок формы. Я прочитал много статей о правильном способе создания REST API и обработки ошибок с помощью symfony. Многие из статей использовали FOSRestBundle, но я не мог понять, как использовать этот пакет в простом API только JSON.

Может ли кто-нибудь дать мне несколько советов, как правильно обрабатывать ошибки в API-интерфейсе symfony3? А также есть ли веская причина использовать FOSRestBundle, на ваш взгляд, в текущем примере?

Спасибо!

ответ

8

Если форма не является действительной, вы можете получить ошибки так:

$errors = []; 
    foreach ($form->getErrors(true) as $error) { 
     if ($error->getOrigin()) { 
      $errors[$error->getOrigin()->getName()][] = $error->getMessage(); 
     } 
    } 

Вы получите массив заполняется с полями, которые имеют одну или несколько ошибок:

[ 
    'field_name' => [ 
     'text of error 1', 
     'text of error 2', 
    ], 
    'other_field_name' => [ 
     'text of error 1', 
    ], 
] 

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

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