Вопрос по php, symfony – Переопределение Symfony 2 исключений?

7

Согласно этой странице документа:

http://symfony.com/doc/current/cookbook/controller/error_pages.html

Symfony использует TwigBundle для управления отображением исключений. Однако я не собираюсь настраивать отображение, как упомянуто в документе, я надеюсь переопределить это. Я работаю над небольшим REST API и хотел переопределить вызов TwigBundle для своего пакета, выполняя собственную обработку исключений (с точки зрения REST: сопоставить правильные коды состояния HTTP и ответы в виде простого текста).

Я ничего не смог найти по этому поводу, и ссылка на руководство не очень хорошая, особенно в части ядра. Может быть, кто-то уже сделал это и может мне помочь? Благодарю.

Ваш Ответ

2   ответа
1

Сильфон является частью моего AppKernel.php для отключения внутренней перехвата исключений Symfony для запросов JSON (вы можете переопределитьhandle метод вместо создания второго)

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel {
  public function init() {
    parent::init();

    if ($this->debug) {
      // workaround for nasty PHP BUG when E_STRICT errors are reported
      error_reporting(E_ALL);
    }
  }

  public function handleForJson(Request $request,
                                $type = HttpKernelInterface::MASTER_REQUEST,
                                $catch = true
  ) {
    return parent::handle($request, $type, false);
  }
  ...
Расширение класса с ООП конвекцией хакерской?
Это кажется немного хакерским ... другим способом? vinnylinux
Не уверен, что вы подразумеваете под "соглашением ООП". Хорошая идея - не переписывать классы фреймворка. KernelEvents :: EXCEPTION создается в самом начале handleResponse, поэтому вы можете подключиться к нему, прослушивая его в своем собственном слушателе, вместо того, чтобы изменять классы фреймворка.
13

Вы должны создать слушателя, который слушает наkernel.exception событие. ВonKernelException метод этого слушателя вы можете проверить на исключение, например

На слушателя класса исключений

  //namespace declarations
  class YourExceptionListener
  {

      public function onKernelException(GetResponseForExceptionEvent $event)
      {
        $exception =  $event->getException();
        if ($exception instanceof YourException) {
            //create response, set status code etc.
            $event->setResponse($response); //event will stop propagating here. Will not call other listeners.
        }
      }
  }

Сервисная декларация будет

 //services.yml
 kernel.listener.yourlisener:
  class: FQCN\Of\YourExceptionListener
  tags:
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
Плохо, я использовал services.xml и забыл сменить расширение. vinnylinux
В режиме отладки страница профилировщика панели инструментов разработчика. Выберите вкладку событий на левой стороне. Вы увидите список слушателей. Проверьте, есть ли там ваш слушатель.
Хотя это не сработало, оно не переопределяло исключения. vinnylinux
Могу ли я поместить слушателя в корень моего пакета? vinnylinux

Похожие вопросы