Возникла ошибка в коде на продакшене и она видна в /var/logs/nginx/site.error, но сервис возвращает успешный результат с кодом 200.
Хорошо, я пытаюсь повторить ситуацию на дев-машине и получаю вместо успешного результата - json c все той же ошибкой:
[{"error":{"code":500,"message":"Notice: Undefined index: country_name in ...
как так, ведь в php.ini у меня стоит display_errors = Off, при этом app/config/config_dev.yml :
imports:
- { resource: config.yml }
а в файле config.yml ничего подобно ниже описанного нет:
monolog:
handlers:
nested:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
т.е. логи вообще не должны писаться и в стандартный файл app/logs/dev.log они действительно не пишутся, но в output выдаются.
На странице бандла написано, что мы можем задавать что будем ловить, но мы не задавали, что будем ловить Symfony\Component\Debug\Exception\FlattenException и мы не подписывались на ExceptionListener который и создает Symfony\Component\Debug\Exception\FlattenException который потом обрабатывает fos-user-bundle.
Возникает вопрос - кто такое придумал, я ж не пишу хэндлер ошибок, я просто не хочу, чтобы ошибки принтились в аутпут, почему это происходит?
Ответ: оказывается у fos_rest есть подписчик vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/Resources/config/exception_listener.xml
<parameters><parameter key="fos_rest.exception_listener.controller">fos_rest.controller.exception:showAction</parameter></parameters><services><service id="fos_rest.exception_listener" class="%fos_rest.exception_listener.class%"><tag name="kernel.event_subscriber" /><tag name="monolog.logger" channel="request" /><argument>%fos_rest.exception_listener.controller%</argument><argument type="service" id="logger" on-invalid="null" /></service>
и этот подписчик срабатывает при эксепшенах, в результате чего вызывается \FOS\RestBundle\Controller\ExceptionController::showAction
А виной тому, что в результате нотиса выбрасывает эксепшен, являетя \Symfony\Component\Debug\ErrorHandler::handle
Закономерный вопрос - кто включет displayErrors? и ответ - мы сами это делаем вызывая Debug::enable(); в web/app_dev.php и именно поэтому на продакшене ( web/app.php ) нет такой проблемы.
Удачки.
Комментарии
Комментариев пока нет.