gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:41:11 24 4
gpt4 key购买 nike

在验证域实体时,最好在设置值时验证它们,还是稍后使用验证器(例如在 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('johnnie@duh.com');
$validator = new Validator();
$validator->validate($user);

选项 3. 以上两个(虽然看起来有点多余,不值得开销)。

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

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

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

最佳答案

单一职责原则

最好的方法是在单独的层中进行所有必要的验证。这样将更容易维护和测试验证器。也更容易验证整个应用程序中的数据。

不要重复自己

您不必为每个实体调用 validate() 。

您所要做的就是在您的存储库层或服务层(如果有)上实现验证。

$user = new User();
// [...]
$user->setEmail('myinvalidemail#blah,com');
$repository->save($user);

所以在您用户的存储库中
UserRepository extends AbstractRepository {}

以及所有实体的通用验证:
abstract class AbstractRepository {
public function save($entity) {
$validator = // Get your validator based on the entity's name or something else
$validator->validate($entity); // Throws exceptions or flag the fields for future use

// Now save it...
}
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com