В настоящее время я работаю над приложением MVC, которое реализует шаблон переднего контроллера.

Процесс работает так:

  1. запрос получен
  2. запрос превращается в RequestObject
  3. RequestObject передается диспетчеру
  4. Диспетчер затем маршрутизирует, а затем вызывает требуемый контроллер.
  5. Контроллер возвращает результаты в ResponseObject.
  6. Затем Dispatcher возвращает ResponseObject на «передний план» приложения.
  7. Затем вывод воспроизводится эхом.

Есть особый случай (для ajax и flash интерфейсов):

  1. Диспетчер увидит, что запрос отправлен на «конечный» контроллер.
  2. Затем контроллер конечной точки отправляет запрос фактически запрошенному контроллеру, как указано выше.
  3. Затем объект requestObject возвращается контроллеру конечной точки.
  4. Затем контроллер конечной точки выполняет кодировку JSON или AMF, и это отображается.
  5. Затем сценарий завершается exit();

Я создал класс ExceptionHandler и зарегистрировал его в set_exception_handler. В то же время я создал ErrorHandler и с помощью set_error_handler все ошибки затем преобразуются и выдаются как исключения.

Все это хорошо работает. Однако я борюсь с проблемой, когда ExceptionHandler перехватывает одно из этих исключений. В ExceptionHandler ResponseObject изменен, чтобы отразить тот факт, что нам нужно выдать ошибку 500.

Я хотел бы каким-то образом вернуть ResponseObject из ExceptionHandler, чтобы возвращенный ResponseObject мог быть «пойман» диспетчером, а затем отрендерен или преобразован в ответ JSON или AMF контроллером «конечной точки» или «передним» контроллером .

Это возможно? Если да, то как лучше всего это сделать?

1
F21 15 Дек 2011 в 09:02

1 ответ

Это невозможно. Как указано на http://php.net/set_exception_handler.

Выполнение будет остановлено после вызова exception_handler.

Правильный способ — добавить блок try-catch в диспетчер, в то место, где вызывается метод диспетчеризации контроллера.

0
Dmytro Zavalkin 29 Апр 2013 в 00:56