我想知道各种验证规则如何相互影响以及它们如何分层。
我认为最简单的方法是举几个例子。
我们假设我们正在为博客提交帖子。因此,我们将在PostsTable
。
->notEmpty('title')
->requirePresence('title')
->add('title', 'length', [
'rule' => ['minLength', 5],
'message' => 'Must be longer than 5 characers'
]);
->notEmpty('download_speed')
->add('download_speed', 'rule', ['rule' => 'numeric'])
->requirePresence('download_speed')
因此,在此示例中,实际需要notEmpty()
和requirePresence()
规则,因为minLength
将强制执行并且不会为空,因为显然空字符串少于5个字符?
类似地,在第二个示例中,空值不是数字,因此规则会反过来强制它出现。
答案 0 :(得分:4)
requirePresence
是当给定字段不存在时触发的唯一内置规则,所有其他规则仅在字段实际存在时应用,即minLength
将如果title
字段不存在,则不触发。因此,如果您需要一个字段存在并进行验证,那么您将需要requirePresence
规则。
空格也会满足minLength
,所以如果你不认为5个空格是有效的标题,那么你也不能放弃notEmpty
规则(尽管你可能想要交换两个,{ {1}}和notEmpty
用于自定义规则,而不是首先修剪标题,因此4个空格后跟一个字符不会使其超过验证,或者您可以修剪实体中的数据。) / p>
您示例中可能不需要的唯一规则是minLength
字段的notEmpty
规则,因为正如您已经想到的那样,空值不是有效数字。
答案 1 :(得分:0)
// Check: != ''
->notEmpty('title')
// Check: isset()
->requirePresence('title')
// Check: 5 characters at least but can be white spaces
->add('title', 'length', [
'rule' => ['minLength', 5],
'message' => 'Must be at least 5 characters in length'
]);
// Check: 5 characters without white spaces behind or after
->add('title', 'custom', [
'rule' => function ($currentData) {
$realLenght = strlen(trim($currentData));
if ($realLenght >= 5 ) {return true;}
return false;
},
'message' => 'Must be at least 5 characters in length. Avoid unnecessary white spaces''
]);