Я использую входной фильтр со стандартными валидаторами / фильтрами ZF2. Однако я также расширяю \My\InputFilter::isValid
метод, включающий проверку для конкретного домена, например сравнение определенных частей дат.
В этом методе, как я могу сигнализировать, что проверка не удалась, с конкретным сообщением об ошибке для неисправных элементов? Я могу вернуть false из метода, но это не дает дополнительной информации о том, почему проверка не удалась.
то есть:
public function isValid($context = null){
$latestCollectionInput = $this->get('latestCollectionTime');
$requestedCollectionTime = $this->get('requestedCollectionTime');
$date1 = \DateTime::createFromFormat('d/m/Y H:i', $latestCollectionInput->getRawValue());
$date2 = \DateTime::createFromFormat('d/m/Y H:i', $requestedCollectionTime->getRawValue());
if($date1->format('N') !== $date2->format('N')){
/* how to return failed validation for these elements */
}
return parent::isValid($context);
}
в AbstractValidator
класс есть error
метод для этой цели. Вы можете найти это здесь на линии 329 на GitHub.
Поэтому, когда во время проверки вы обнаружите, что значение является недействительным, вы можете сделать:
$this->error($key, $value);
Обычно ключи хранятся в классе валидатора как константы:
const ERROR_DATE_NOT_VALID = 'dateNotValid';
const ERROR_NOT_FUTURE_DATE = 'dateNotFutureDate';
И соответствующие сообщения хранятся в $messageTemplates
массив:
protected $messageTemplates = array(
self::ERROR_DATE_NOT_VALID => "Date must be a string and must be formatted as yyyy-mm-dd",
self::ERROR_NOT_FUTURE_DATE => "The provided date must be in the future",
);
Когда входной фильтр собирает сообщения об ошибках при неудачной проверке, переданный вами ключ будет использоваться для поиска сообщения в списке шаблонов. Эти сообщения будут возвращены. Поэтому, когда вы выдаете ошибку, используя ключ, как это:
$this->error(self::ERROR_DATE_NOT_VALID, $value);
Сообщение, которое будет возвращено, будет:
"Date must be a string and must be formatted as yyyy-mm-dd"
Узнайте больше о написании пользовательских валидаторов здесь, в официальных документах ZF2
Других решений пока нет …