我试图在关于数据验证的两种模式之间做出决定:
我尝试遵循名义上的工作流程并捕获我的模型和服务引发的异常:违反唯一/外部约束、空字段、无效参数等...(!!我只捕获我知道我应该捕获的异常)
优点:在我的控制器和服务中编写的代码很少:我只需要处理异常并将它们转录为用户可以理解的消息。代码非常简单易读。
缺点:我需要编写特定的异常,有时可能是很多不同的异常。我还需要捕获和解析数据库异常(违反约束等)的通用 PDO/Doctrine 异常,以将它们转换为有意义的异常(例如:)
DuplicateEntryException
。我也无法绕过一些验证:假设我的模型的一个对象被标记为锁定:尝试删除它会引发异常。但是我可能想强制删除它(例如,使用确认弹出窗口)。我将无法绕过这里的异常。
我使用代码和数据库查询明确地测试和预验证所有内容。例如,在将某些内容设置为我的模型中的属性之前,我将测试某些内容不是 null 并且是一个整数。或者我将进行数据库查询以检查我不会创建重复条目。
优点:不需要编写特定的异常,因为我预先验证了所有内容,所以无论如何我不应该做很多尝试/捕捉。如果我愿意,我也可以绕过一些验证。
缺点:需要在控制器、服务和模型中编写大量测试和验证。我将执行更多查询(验证部分)。数据库已经对外键、唯一约束、非空列进行了验证......我不应该忽略它并自己重新编码。这也会导致非常无聊的代码!
我宁愿使用一种或另一种模式,而不是混合使用,以使事情尽可能简单。
第一个解决方案在我看来是最好的,但恐怕它可能是某种反模式?或者也许在其理论上的简单性背后隐藏着难以处理的情况?