#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_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
тем, как заставить его работать.