当数据中缺少该字段时,为什么 `notEmpty` 规则不适用?
Why does the `notEmpty` rule not apply when the field is missing in the data?
我正在尝试为新创建的实体创建验证,但实体对象在代码中不包含任何错误:
型号Class:
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmptyString('id', null, 'create');
$validator
->integer('status')
->notEmptyString('status');
和控制器:
$data = ['data' => "test"];
$ticket = $this->Tickets->newEntity($data);
结果:
object(Cake\ORM\Entity) {
'data' => 'test',
'[new]' => true,
'[accessible]' => [
'*' => true
],
'[dirty]' => [
'data' => true
],
'[original]' => [],
'[virtual]' => [],
'[hasErrors]' => false,
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Tickets'
}
我认为默认设置是使用 validationDefault 并且错误字段必须包含错误,因为未设置 "status"。但是 "erros" 字段始终为空,如果我调用 "save" 函数,实体将保存到数据库中。
我该如何解决这个问题?
这不是 notEmpty
规则的工作方式,它们不要求字段存在,它们要求字段不为空 仅 以防 它存在。当该字段不存在时,空规则(或与此相关的任何其他规则)将不适用,即这会使您的规则失败:
[
'status' => ''
]
如果要强制显示该字段,请使用 requirePresence
规则,例如:
$validator
->requirePresence('status', 'create')
->notEmptyString('status')
->integer('status');
这里的顺序并不重要,因为存在和空检查是按固定顺序执行的,首先是存在检查,然后是空检查,然后是所有其他规则,但是恕我直言,什么时候更容易理解调用的顺序反映了这一点。
另见
我正在尝试为新创建的实体创建验证,但实体对象在代码中不包含任何错误:
型号Class:
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmptyString('id', null, 'create');
$validator
->integer('status')
->notEmptyString('status');
和控制器:
$data = ['data' => "test"];
$ticket = $this->Tickets->newEntity($data);
结果:
object(Cake\ORM\Entity) {
'data' => 'test',
'[new]' => true,
'[accessible]' => [
'*' => true
],
'[dirty]' => [
'data' => true
],
'[original]' => [],
'[virtual]' => [],
'[hasErrors]' => false,
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Tickets'
}
我认为默认设置是使用 validationDefault 并且错误字段必须包含错误,因为未设置 "status"。但是 "erros" 字段始终为空,如果我调用 "save" 函数,实体将保存到数据库中。
我该如何解决这个问题?
这不是 notEmpty
规则的工作方式,它们不要求字段存在,它们要求字段不为空 仅 以防 它存在。当该字段不存在时,空规则(或与此相关的任何其他规则)将不适用,即这会使您的规则失败:
[
'status' => ''
]
如果要强制显示该字段,请使用 requirePresence
规则,例如:
$validator
->requirePresence('status', 'create')
->notEmptyString('status')
->integer('status');
这里的顺序并不重要,因为存在和空检查是按固定顺序执行的,首先是存在检查,然后是空检查,然后是所有其他规则,但是恕我直言,什么时候更容易理解调用的顺序反映了这一点。
另见