我最近搬到我的表单数据验证模型层,特别是在领域对象setter方法(这是对还是错?)。 当我在我的User
服务,我这样做
$user->setFirstName($firstName);
并且输入过长(超过25个字符)我应该设置某种state
变量域对象不稳定(也许= 0),并在浏览检索模型设定错误信息?
我会通过运行检查中查看对象的状态isValid()
方法。
这将是正确的方式做到这一点?
谢谢。
我最近搬到我的表单数据验证模型层,特别是在领域对象setter方法(这是对还是错?)。 当我在我的User
服务,我这样做
$user->setFirstName($firstName);
并且输入过长(超过25个字符)我应该设置某种state
变量域对象不稳定(也许= 0),并在浏览检索模型设定错误信息?
我会通过运行检查中查看对象的状态isValid()
方法。
这将是正确的方式做到这一点?
谢谢。
这更是一个建筑的问题,而且有很多的答案。 在Grails的Web框架采用类似的方法来此,但自动神奇加入validate()
域对象。 CI有你滚你自己的类似 。
就个人而言,我把验证逻辑setter方法/构造函数和,如果我的条件没有满足时抛出异常的粉丝。 这意味着,而不是一个对象的意见都来询问,看它是否是有效的,用户必须确保他们输入有效的数据,或者当他们这样做没有明确处理。
我想说的表单验证无关,在域对象做。 如果提交的表单无效通常是没有必要创建/修改域对象的话,那是完全位于表示层/用户界面的问题。 将用户输入的验证到域对象违反的担忧原理的分离。
然而,这是一个有争议的问题,有没有做到这一点绝对正确或错误的方式。 因为如果你想确保域对象不能处于无效状态(扔在构造函数和setter例外),你可能会出现重复的代码。
但如果你的域对象使用验证表单验证或没有,你应该更喜欢一个例外isValid
状态。 这些对象应始终处于有效状态,这是OOP的一个大优点
更新
为了这个问题,我把输入验证:我用专门的请求对象的每个控制器和这样的控制器使用它们:
try {
$user = $this->request->extractUserFromPost();
} catch (ValidationException $e) {
$this->showValidationError($e->getMessage(), $e->getAffectedFields());
}
该方法也可以在控制器本身,而是我更喜欢含有少自己的逻辑尽可能薄控制器。 另一种常见的方法是在一个地方(例如:管理产生和形式的检验形式的对象Zend\Form
)。 如果请求总是来自一种形式,这是有道理的。 我上面的例子会工作的web服务,以及一个HTML的用户界面。