Когда много чего может случиться...

Forever

Новичок
Вопрос, в общем-то простой

Например, у меня есть обработчик файла

Файл должен быть:
принят,
проверен,
сохранен,
переименован,
скопирован
заархивирован

И тд. и в каждом случае, при неудаче , нужно вернуть конкретное сообщение об ошибке (особенно если ориентироваться на удобство для пользователя)

В самом идеальном случае, нужно написать на каждый шаг функцию, возвращающую bool, и если на каком то шаге вернулся false, отдавать юзеру соответствующее сообщение
Но что если на каждом шаге (например, на архивации)может быть несколько вариантов ошибок, и на каждую надо так же отдать юзеру свой текст?

Для меня это частый случай, тк. я обычно так и делаю, в итоге и самому проще разобраться, если что то пошло не так, и люди довольны. Ну и соответственно проблема наболевшая)

Один коллега предложил мне вариант, из каждой "сложной" функции, возвращать DTO (data transfer object) , у которого есть статус, текст и иногда нагрузка, какое то содержимое

и если статус false, делаем return текста


Сейчас вот читаю,некоторые пишут, что dto это зло
Но пишу в целом узнать

1) Какие есть альтернативы
2) Как Вы обычно делаете
3) стоит ли использовать DTO
4) стоит ли использовать его так, как описано выше?

пасыба заранее)
 

AnrDaemon

Продвинутый новичок
функцию, возвращающую bool
Это же не валидация, зачем так извращаться?
Ошибка обработки - это исключительная ситуация. Вот и бросай исключение.

А про детализацию - почитай про exceptions chaining.
 

WMix

герр M:)ller
Партнер клуба
"Ваш файл не смог быть переименован (проверен, скопирован, архивирован)" -- прям удобство пользования
 

Фанат

oncle terrible
Команда форума
Как тебе правильно сказали, не надо путать валидацию и непредвиденные ошибки.

Нянькаться с каждой запятой (у вас файл не в той кодировке, не так называется, вообще пустой, что вы тут мне суёте) следует только при валидации.
При валидации у тебя есть два варианта:
1. Явно в контроллере дергать валидацию, которая тебе вернёт дто или простой массив с ошибками, или что угодно поскольку формат совершенно не важен, которое ты радостно покажешь юзеру, а если всё ок - то дергаешь нужное действие.
2. Сразу дергаешь нужное действие, которое заворачиваешь в трай кетч в котором ловишь ошибку валидации. Оно там внутрисебя ввалидирует, и при ошибках валидации кидает исключение, внутри которого дто или простой массив с ошибками, или что угодно поскольку формат совершенно не важен, которое ты радостно поймаешь и покажешь юзеру.

В случае же непредвиденных ошибок (на диске место колнилось, архиватор сломался ) ничего специально делать не нужно. Ты же не пишешь специльный код на случай, если у тебя какой-то из пхп файлов побился, или в базе данных побилась таблица. Вот и при сохранении файла не пиши.
Ошибка будет поймана уцентрализованный обработчиком ошибок, который запишет ошибку в лог, чтобы тебе было проще разобраться, а пользователю уйдет стандартное неконкретное ой что-то пошло не так.

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