php - 在设置每个属性时验证域实体,还是稍后一次性验证所有属性?

标签 php validation error-handling

验证域实体时,是在设置值时验证值更好,还是稍后使用验证器(例如在 Symfony2 中)一次性验证所有值?

例如:

选项 1.设置时验证

public function setEmail($email)
{
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new EntityException('The specified email address ' . $email . ' is invalid.');
    }

    $this->_email = $email;
    return $this;
}

选项 2。稍后验证...

$user = new UserEntity();
$user->setEmail('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5b3134333535323e1b3f2e3375383436" rel="noreferrer noopener nofollow">[email protected]</a>');
$validator = new Validator();
$validator->validate($user);

选项 3。以上两种方式(虽然看起来有点多余,不值得花费这些开销)。

我知道第一个可能会产生更密封的实体,但第二个会产生更用户友好的错误处理。

此外,第二个选项似乎更容易配置和维护......因为我不必调整 setter ,并且我可以将验证逻辑集中到单个类。

它归结为......
所以基本上,听起来选项 2 就是我想做的,但感觉牺牲了实体的密封性(例如,如果我忘记通过验证器运行实体),可能很愚蠢。

最佳答案

毫无疑问,在某些情况下,在应用程序级别不需要进行验证(即,您知道您在特定点正在使用有效数据)。虽然在这些情况下应用验证没有什么问题,但它肯定是多余的。

此外,您可能会发现自己处于想要对传入数据执行“批量验证”的情况。这可能更多地适用于您没有可以依靠的服务或自定义实现的表单,例如 Symfony 的表单验证框架。

这些往往表明选项 2 是更理想的方法,也许需要注意的是,在尝试持久化对象时(例如,在模型的预保存事件期间;我不是尚未熟悉原则 2,但是 Doctrine 1.2 does have its own validation framework that can accomplish this )。

拥有无效数据肯定不是一个理想的情况,但只要您可以确保无效数据不会被持久化,这使您可以自由地相信从数据库中提取的任何数据都是有效的(请注意,我说这里是“有效”,而不是“值得信赖”!)。

关于php - 在设置每个属性时验证域实体,还是稍后一次性验证所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744265/

相关文章:

php - 直接从 Eloquent 查询中提取和格式化日期

php - 如果数据库为空,如何运行 Codeigniter 迁移

java - Struts 1.2 intRange 验证失败

python - 使用pyaudio创建语音识别程序但出现问题

asp.net-mvc - 我该如何处理Elmah本身引起的异常?

php - 如何在 PHP 中使用 JQuery AJAX 调用触发 "error"回调

php - 如何构建账户余额系统

c# - PHP 相当于 C# 字符串格式化

java - 验证输入的设计模式?

jquery - 基于 JQuery 验证更改 CSS 类