Как правильно настроить обработчик исключений в Zend?

#php #zend-framework #error-handling

#php #zend-framework #обработка ошибок

Вопрос:

Я пытаюсь переопределить обработчик исключений для пары моих контроллеров в Zend (RESTful).

Это мой фрагмент кода:

 abstract class RestController extends Zend_Rest_Controller
{
    public function init()
    {
        set_exception_handler(array($this, 'fault'));
    }

    public function fault($exception = null, $code = null)
    {
       echo $exception->getMessage();
    }
}
  

Но по какой-то причине Zend использует шаблон по умолчанию / обработку ошибок, и моя fault функция не выполнялась.
Кстати, я использую module архитектуру. этот контроллер из rest модуля.. Обработчик ошибок Zend по умолчанию из default модуля.

Ответ №1:

Это интересный вопрос. На данный момент я не совсем уверен, поэтому я собираюсь немного изучить этот вариант и посмотреть, что у меня получится. На данный момент есть обходные пути, которые также не являются слишком гетто. Одним из способов было бы создать абстрактный контроллер, из которого можно расширить все ваши контроллеры в вашем модуле rest.

 abstract class RestAbstractController extends Zend_Rest_Controller
{
    final public function __call($methodName, $args)
    {
        throw new MyRestException("Method {$methodName} doesn't exist", 500);
    }
}

// the extends part here is optional
class MyRestException extends Zend_Rest_Exception
{
    public function fault($exception = null, $code = null)
    {
        echo $exception->getMessage() . ' ' . __CLASS__;
        exit;
    }
}

class RestController extends RestAbstractController
{
    // method list
}
  

Кроме того, я нашел эту интересную статью: http://zend-framework-community.634137.n4.nabble.com/Dealing-with-uncatched-exceptions-and-using-set-exception-handler-in-Zend-Framework-td1566606.html

Редактировать:

Где-нибудь в вашем файле начальной загрузки вам нужно будет добавить это:

 $this->_front->throwExceptions(true);
$ex = new MyRestException();
set_exception_handler(array($ex, 'fault'));
  

Первая строка там должна эффективно отключить обработку исключений Zend, единственное, чего не хватает, это управляющей структуры, чтобы определить, относится ли текущий запрос к вашей службе REST или нет. ОБРАТИТЕ внимание на причину, по которой это должно было произойти в Bootstrap.php дело в том, что ваш вызов set_exception_handler() в функции init() так и не был достигнут, потому что Zend Framework первым выдал исключение. Размещение этого в файле начальной загрузки будет противодействовать этому.

Комментарии:

1. Это будет работать только для пропущенных методов, но созданные пользователем исключения и исключения mysql не будут перехвачены. Должен быть другой способ..

2. Хорошо, понял. Что ж, посмотрите мою правку. Я думаю, это должно быть вашим решением!

3. Спасибо. Я тоже думал о bootstrap, но в этом случае мне не хватает всех преимуществ ООП и контроллеров.

Ответ №2:

Наконец-то решил проблему сам 🙂

Из документации Zend:

Zend_Controller_Front::Throw Exceptions()

Передавая логическое значение TRUE этому методу, вы можете сообщить интерфейсному контроллеру, что вместо того, чтобы агрегировать исключения в объекте ответа или использовать плагин обработки ошибок, вы бы предпочли обрабатывать их самостоятельно

Итак, правильное решение таково:

 abstract class RestController extends Zend_Rest_Controller
{
    public function init()
    {
        $front = Zend_Controller_Front::getInstance();
        $front->throwExceptions(true);

        set_exception_handler(array($this, 'fault'));
    }

    public function fault($exception = null, $code = null)
    {
       echo $exception->getMessage();
    }
}
  

Нам просто нужно добавить

 $front = Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
  

перед set_exception_handler тем, как заставить его работать.