у меня есть duration
поле, которое иногда может быть пустым, а иногда нет, в зависимости от других данных, отправляемых формой. Поэтому я пытаюсь сделать пользовательскую проверку в CakePHP3.
В моем столе я сделал
public function validationDefault(Validator $validator)
{
$validator
->add('duration', 'durationOk', [
'rule' => 'isDurationOk',
'message' => 'duration is not OK',
'provider' => 'table'
]);
return $validator;
}
public function isDurationOk($value, $context)
{
// do some logic
return false; // Always return false, just for test
}
Теперь, когда я устанавливаю значение для поля длительности, я получаю 'duration is not OK'
ошибка (как и ожидалось). Но когда я оставляю значение пустым, я получаю 'This field cannot be left empty'
ошибка.
И я добавил:
->allowEmpty('duration');
Но в этом случае, когда duration
пусто я не получаю ошибку вообще.
Я делаю что-то не так или просто я не понимаю, как работает проверка?
Разрешите читать книгу для тебя:
Условная валидация
При определении правил проверки вы можете использовать клавишу включения, чтобы определить, когда
должно применяться правило проверки. Если оставить неопределенным, правило будет
всегда быть примененным Другие допустимые значения создаются и обновляются. Используя один
из этих значений правило будет применяться только для создания или обновления
операции.Кроме того, вы можете предоставить вызываемую функцию, которая будет определять
следует ли применять конкретное правило:
'on' => function ($context) {
// Do your "other data" checks here
return !empty($context['data']['other_data']);
}
Так что просто определите условия в зависимости от ваших «других данных» в обратном вызове, чтобы применить правило только тогда, когда условия верны.
В качестве альтернативы вы можете манипулировать данными простой формы еще до того, как они будут проверены в beforeMarshal () обратный вызов таблицы и при необходимости измените данные формы или загрузите другой валидатор или измените валидатор.
Других решений пока нет …