当数据中缺少该字段时,为什么 `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');

这里的顺序并不重要,因为存在和空检查是按固定顺序执行的,首先是存在检查,然后是空检查,然后是所有其他规则,但是恕我直言,什么时候更容易理解调用的顺序反映了这一点。

另见