Пользовательская проверка cakephp3

у меня есть 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 пусто я не получаю ошибку вообще.

Я делаю что-то не так или просто я не понимаю, как работает проверка?

2

Решение

Разрешите читать книгу для тебя:

Условная валидация

При определении правил проверки вы можете использовать клавишу включения, чтобы определить, когда
должно применяться правило проверки. Если оставить неопределенным, правило будет
всегда быть примененным Другие допустимые значения создаются и обновляются. Используя один
из этих значений правило будет применяться только для создания или обновления
операции.

Кроме того, вы можете предоставить вызываемую функцию, которая будет определять
следует ли применять конкретное правило:

'on' => function ($context) {
// Do your "other data" checks here
return !empty($context['data']['other_data']);
}

Так что просто определите условия в зависимости от ваших «других данных» в обратном вызове, чтобы применить правило только тогда, когда условия верны.

В качестве альтернативы вы можете манипулировать данными простой формы еще до того, как они будут проверены в beforeMarshal () обратный вызов таблицы и при необходимости измените данные формы или загрузите другой валидатор или измените валидатор.

2

Другие решения

Других решений пока нет …