(перефразировал вопрос часами, чтобы он был более информативным)
Мне нужен небольшой совет для понимания Propel
setters
/ validators
в автономной (не-фреймворковой) разработке.
Документация о состояниях проверки:
Валидаторы помогают вам проверить ввод перед сохранением его в базе данных.
... и в сообщениях валидатора мы можем предоставить согласованный совет о том, где пользователи могут исправлять записи, которые не проходят проверку Propel
.
Пример использования validator
гласит:
$user = new User();
$user->setUsername("foo"); // only 3 in length, which is too short...
if ($objUser->validate()) {
...
Проблема, с которой я столкнулся, заключается в том, что «если вы не можете setXXX()
проверить ее?»
У меня есть тип столбца DATE
, и я приглашаю посетителя ввести дату в веб-форму. Они неправильно набирают дату и отправляют 03/18/20q2
Я бы надеялся, что один из моих пользовательских валидаторов сможет сообщить о сообщении валидатора и еще раз вернуть форму пользователю для внесения изменений, однако это происходит в первую очередь:
Fatal error: Uncaught exception 'PropelException' with message 'Error parsing date/time value: '03/18/20q2' [wrapped: DateTime::__construct() [<a href='datetime.--construct'>datetime.--construct</a>]: Failed to parse time string (03/18/aaa) at position 5 (/):
В моих тестах я не мог заставить ни одного простого или CustomValidator
выстрелить, как только написал (например):
$event= new Event();
$event->setDateStart($form_value_for_date); // where values is "03/18/20q2"
Я понимаю, почему это так - не имеет смысла иметь возможность создавать и пытаться манипулировать новым объектом, если вы не можете полагаться на его поля, даже до того, как сохраните его.
Дилемма, которую это дает мне:
Если из-за неверной записи может произойти фатальная ошибка, из-за которой Propel validation
не сможет обработать ее для меня (и, следовательно, пользователя) и отправить обратно полезное сообщение, следует ли мне беспокоиться о Propel validation
, а также о моей собственной проверке безопасности / вежливости
Я не могу найти упоминания в документах о том, что произойдет, если вы дадите Propel
- по какой-либо причине - значение, которое оно не ожидает для поля, или как с ним обращаться.
Я надеюсь, что это имеет смысл, и что кто-то может указать мне на метод, который будет означать, что мне нужно проверять ввод только в одном месте.