2015-04-14 2 views
3

Я хотел бы знать, как различные правила валидации взаимодействуют друг с другом и как они выравниваются.Правила валидации notEmpty и requirePresence

Я думаю, что самый простой способ - это несколько примеров.

Предположим, мы отправляем сообщение для блога. Поэтому мы будем работать над валидацией в нашем 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 символов?

Аналогично, во втором примере пустое значение не будет числовым, чтобы правило в свою очередь заставило его присутствие.

ответ

3

requirePresence является единственным встроенным правилом, что в настоящее время срабатывают, когда данное поле не существует, все остальные правила только применяются в случае, если поле действительно присутствует, т.е. minLength не будет вызывать в случае title поля не существует. Поэтому, если вам нужно, чтобы поле присутствовало и, таким образом, было проверено, вам понадобится правило requirePresence.

Также minLength будет удовлетворен непечатаемыми, так что если вы не считаете 5 пробельные правильный заголовком, то вы не можете угробить notEmpty правила (хотя вы можете обменять оба notEmpty и minLength для пользовательского правила вместо который сначала обрезает заголовок, так что 4 пробела, за которыми следует символ, не проходят проверку, иначе вы можете обрезать данные в своей сущности).

Единственным правилом, который может не понадобиться в вашем примере, является правило notEmpty для поля download_speed, поскольку, как вы уже определили, пустое значение не является допустимым числом.

+0

Соответствие 'money' и' numeric' аналогично? –

+1

@DavidYell Обратите внимание на то, что именно вы подразумеваете под перекрытием, однако «деньги» могут быть удовлетворены простым числом, например '10', но оно также принимает нечисловые (число машинных номеров) значений типа' 10,50' или ' 10 $ ', поэтому эти два правила не взаимозаменяемы. – ndm

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'' 
    ]);