@Alk90
php, mysql, jquery, css, html, api

Как правильно передавать ошибки вверх по дереву вызовов классов?

Всем привет! Есть некий файл входа и выхода, пускай это будет index.php
В нем мы определяем какой контроллер запустить а так же отдаем данные обратно пользователю с помощью общего класса Response, который хранит в себе все, что нужно вернуть:
  • Общие ошибки
  • Ошибки ввода в поля
  • Готовые данные которые нужно вернуть

Ошибки и данные в класс добавляются с помощью методов:
$Response->addErr("Сообщение", 455214); // сообщение и код ошибки нужен для фронтенда
$Response->addFieldErr("title", "Сообщение"); // название поля с ошибкой и сообщение об ошибке
$Response->addData("items", $posts_array); // json массив постов
$Response->addData("attachments", $attachments_array); // json массив вложений к постам

Ну а вконце index.php просто выполняем функцию: $Response->returnResponse();

Но вот проблема тут.
Например, нужно добавить комментарий к посту и действия кода следующие (мы отправили ID поста и текст комментария):
index.php вызывает контроллер AddCommentInPost, контроллер вызывает:
  • Модель PostModel, которая пытается получить пост, к которому мы добавляем комментарий для того, чтобы проверить существует ли такой пост PostsModel->getPostById($_GET['id']);
  • Метод модели CommentsModel, который валидирует входящие данные и добавляет комментарий в БД
  • Если все хорошо, то модель CommentsModel возвращает объект комментария CommentEntity

Так вот... Что если при валидации произошла ошибка? Как мне вернуть поля с ошибками в контроллер AddCommentInPost? Ведь я не могу вызывать класс Response из модели, т.к. модель не должна ничего знать о внешнем мире.

Но при такой задаче у меня еще есть идея.... например, чтобы CommentsModel в случае любой ошибки отдавало false, а класс AddCommentInPost, видя, что пришел не объект а false понимал, что произошла какая-то ошибка и уже с помощью метода CommentsModel::getErrors() получал и обрабатывал массив с ошибками, которые сохранила в себе модель.
У нас получилось такое дерево: index.php - AddCommentInPost - CommentsModel::getErrors()
И получается что все хорошо, т.к. AddCommentInPost имеет связь с Response и может записать туда ошибки. НО ЧТО ЕСЛИ бы между AddCommentInPost и CommentsModel был еще один класс, как тогда передать ошибки из CommentsModel в AddCommentInPost?
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AlexndrNovikov
Solution Architect in Spiral Scout
Использовать Exceptions
php.net/manual/ru/language.exceptions.php
В случае если выбросить Exception в любом месте дерева вызовов он как раз будет пробираться до самого верха пока не попадется в catch блок
В месте где формируется сообщение (в контроллере) отлавливать и приводить в нужный вид
Ответ написан
riky
@riky
Laravel
делать явную валидацию, а не как побочный эффект.

$errors = $commentsModel->validate($comment);
if (!$errors) {
    $status = $commentsModel->save($comment);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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