Я борюсь с проблемой, связанной с FOSRestBundle (версия 0.13. *)
У меня есть некоторые REST API, который выдает некоторые исключения, я думаю, ничего необычного. Но, несмотря на конкретную конфигурацию, которую я сделал, чтобы сообщения об исключениях могли быть отформатированы в ответе даже в производственной среде (следуя документации, которую я нашел здесь: https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/doc/4-exception-controller-support.md), ответ JSON остается отчаянно пустым …
Пример ниже:
http://host/app_dev.php/api/postcode/search?postcode=
результаты в:
HTTP 400: {"status":"error","status_code":400,"status_text":"Bad Request","current_content":"","message":"You must provide a postcode"}
НО
http://host/api/postcode/search?postcode=
результаты в:
HTTP 400: []
Мой контроллер API выглядит так:
/**
* Search post codes
*
* @param Request $request Request
* @param Promotion $promotion Promotion
*
* @Rest\View()
*
* @throws BadRequestHttpException
* @return array
*/
public function searchAction(Request $request, Promotion $promotion)
{
// Get post code
$postCode = $request->query->get('postcode');
if (!$postCode) {
throw new BadRequestHttpException('You must provide a postcode');
}
// SOME LOGIC HERE TO GET DATA
return $data;
}
и конфигурация fos_rest выглядит так:
fos_rest:
routing_loader:
default_format: json
view:
mime_types:
json: ['application/json; charset=UTF-8']
formats:
json: true
view_response_listener: force
format_listener: false
access_denied_listener:
json: true
body_listener: true
exception:
messages:
Symfony\Component\HttpKernel\Exception\BadRequestHttpException: true
Как я понял, в конфигурационном массиве fos_rest.exception.messages должен быть указан список исключений, для которых я хочу сериализацию сообщения об ошибке даже в производственной среде. Как видно из кода контроллера, этот ответ содержит переведенное сообщение об ошибке, которое будет отображаться клиенту. Почему эта конфигурация игнорируется?
Я могу с уверенностью сказать, что конфигурация правильно загружена даже в среде prod, потому что, если я неверно введу имя класса в conf, произойдет сбой с исключением «Не удалось загрузить класс».
Что мне не хватает? Заранее спасибо за любой намек, который вы могли бы дать мне …
У меня была похожая проблема, твой вопрос помог мне решить ее на самом деле!
Я знаю, что уже поздно, но я обнаружил, что очистка prod
кеш помог исправить это для меня.
Также это мои настройки:
fos_rest:
param_fetcher_listener: true
body_listener:
array_normalizer: fos_rest.normalizer.camel_keys
format_listener: true
view:
view_response_listener: 'force'
formats:
json: true
templating_formats:
html: true
force_redirects:
html: true
failed_validation: HTTP_BAD_REQUEST
default_engine: twig
routing_loader:
default_format: json
serializer:
serialize_null: true
access_denied_listener:
json: true
exception:
enabled: true
messages:
Symfony\Component\HttpKernel\Exception\BadRequestHttpException: true
Мне также интересно, нужно ли вам всегда явно добавлять исключения в codes
а также messages
разделы конфигурации, если вы не используете HttpException:
throw new HttpException(400, "New comment is not valid.");
Я не пробовал это, но похоже, что вы забыли эту строку:
exception:
codes:
'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
попробуй.
и вы упомянули это:
twig:
...
...
exception_controller: 'FOS\RestBundle\Controller\ExceptionController::showAction'