Я не думаю, что моё решение в проекте легко сделать, но я делаю это так:
Когда я хочу, чтобы сбой был признан критическим в моем приложении, я использую исключения. В моем обработчике ошибок есть некоторая логика, которая определяет, соответствует ли исключения код http-статуса, например 4xx, если не генерируется общий код состояния 500.
Некритические сбои фиксируются менее разрушительным механизмом, использующим пользовательский класс результатов. Его базовая структура похожа на Исключение в том, что code
и message
передаются как аргументы конструктора. Кроме того, объект-результат может быть передан в качестве необязательного аргумента.
Result-класс выглядит так:
class Result
{
/**
* @var int
*/
protected $resultCode;
/**
* @var string
*/
protected $resultMessage;
/**
* @var mixed
*/
protected $resultObject;
/**
* Inject object values on construction.
*
* @param int $code
* @param string $message
* @param mixed $result
*/
public function __construct($code = 0, $message = null, $result = null)
{
$this->resultCode = intval($code);
$this->resultMessage = (string) $message;
$this->resultObject = $result;
}
/**
* Returns true when result is considered a success, determined by the
* resultCode, otherwise false.
*
* @return bool
*/
public function isSuccess()
{
if ($this->resultCode > 0) {
return true;
}
return false;
}
/**
* Returns true when result is considered an error, determined by the
* resultCode, otherwise false.
*
* @return bool
*/
public function isError()
{
if ($this->resultCode < 1) {
return true;
}
return false;
}
/**
* Returns the result message.
*
* @return string
*/
public function getMessage()
{
return $this->resultMessage;
}
/**
* Returns the actual result object.
*
* @return mixed
*/
public function getResult()
{
return $this->resultObject;
}
}
Требуется только код результата. Результат считается успешным, если код> 0, в противном случае он считается ошибкой. Объект результата может быть фактическим результатом (если он успешен), например, строка или набор строк из запроса или (если ошибка) ввода или частей ввода, которые имеют отношение, например, идентификатор строки, которую вы искали.
Поскольку этот класс результатов не вызывает errorHandler, MVC-приложению доверяют для обработки ошибок. либо с помощью исключения, либо изящно реагируя на результат ошибки, показывая сообщение или что-то еще, что было передано как объект результата.
Если я передам этот результат своему представлению, я могу реагировать, является ли $result->isSuccess()
истинным или ложным, и просто получить фактический результат с помощью $result->getResult()
или отобразить сообщение об ошибке с помощью $result->getMessage()
.