vloop/problems

安装: 14

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

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

This package is auto-updated.

Last update: 2024-09-26 15:50:09 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()){...}

这种方法不好,因为必须将此收集器添加到整个对象层次结构中,而在控制器中仍然需要编写检查错误是否存在的方法。这导致了功能性和代码可读性的不明确。

  • 创建两个Null对象,其中一个接受模型或其错误作为参数,另一个接受普通错误作为参数。此方法的优点是在控制器中我们可以摆脱意大利面代码和功能性。