vloop / problems
Package
Installs: 14
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:yii2-extension
Requires
- php: >=7.1
- vloop/entities: dev-master
- yiisoft/yii2: ~2.0.0
This package is auto-updated.
Last update: 2025-05-26 17:10:16 UTC
README
####Проблема вывода ошибок
При написании REST я задумался как нужно копить и возвращать ошибки, либо выбрасывать каждый раз исключение или можно сделать как то по другому...
решение проблемы:
-
останавливать приложение на этапе валидации, т.е. в методах afterValidate():
function afterValidate(){ Yii::$app->response->data = $this->getErrors(); Yii::$app->response->code = 422; //or other }
Плюсы этого метода: не нужно париться об ошибках в объектах в необходимы местах нужно убдет просто выкинуть исключение.
* Минусы этого метода в том что всем формам придется наследоваться от какой то базовой, которая содержит в себе этот код.
А наследование это плохо. -
Ставить какой то объект для обработки выходной информации.
Плюсы этого метода в то что код просто написать, и не думать.new RestAnswer( new RestEntity(...) )
* Минус этого метода: из виду упускается валидация форм (например когда пишем save() в внутри какого то объекта), а если писать валидацию в контроллере то код становится функциональным и похож на спагетти код.
Функциональность и спагетти код это антипаттерн
-
Создать некоторый сборщик ошибок. Так сказать уникальный визитер (см. паттерн визитер).
Плюсы этого метода: Можно написать универсальный интрефейс для собрщика, который можно подключать в любой класс, через конструктор. Вопрос в том, как предусмотреть, все виды "визитеров". Можно использовать декораторы, и в каждый декоратор сувать своего визитера, который имплеминтирует общий интерфейс.
new RestEntities(
new ProblemsByCriteriaForm(
new ProblemsSQL(
$trash = new BasketTrash()
),
new CriteriaIDEntity()
),
'problem'
);
if($trash->hasErrors()){...}
* Данный способ плох, т.к. придется добавлять этот сборщик во всю иерархию объектов, а в контроллеере все равно придется писать проверку на то, существуют ли ошибки. и приходим к функциональнсти, и не очевидности чтения кода.
- Создать 2 Null объекта, один из которых принимает в качестве аргумента модель, или ее ошибки, и второй Null объект который принимает в качестве аргумента, обычную ошибку. Плюсы данного метода: в контроллере освобождаемся от спагетти кода, и от функциональности.