vloop/problems

Package

dev-master 2021-11-25 20:28 UTC

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 объект который принимает в качестве аргумента, обычную ошибку. Плюсы данного метода: в контроллере освобождаемся от спагетти кода, и от функциональности.