Propel ORM Версия 1.6.4 - понимание валидаторов - PullRequest
2 голосов
/ 05 марта 2012

(перефразировал вопрос часами, чтобы он был более информативным)

Мне нужен небольшой совет для понимания 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 - по какой-либо причине - значение, которое оно не ожидает для поля, или как с ним обращаться.

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2015

Вы также можете использовать MatchValidator с датой RegExp, без необходимости в дополнительных функциях

0 голосов
/ 07 марта 2012

Я взломал грубое готовое решение, которое позволит мне:

  • Предварительная проверка поля по CustomValidator без установки его в новом объекте
  • Получить сообщение validator для возврата пользователю

Я беру ввод данных формы, конечно же очищаю их, а затем создаю объект:

$event = new Event();

С моимИмея в виду пользовательскую форму, я тогда предварительно проверю поле, которое я знаю, смертельно упадет, если содержимое плохое, и установлю поле в моем новом объекте, только если будет validate:

    if ($check = $event->flightCheckFail('StartingDate','DateValidator',$sanitisedFormVal))
      echo $check;
    else
      $event->setStartingDate($sanitisedFormVal);

Метод flightCheckFail() вернет false, если данные из формы будут проверены по полю, в случае сбоя он возвращает сообщение об ошибке validator.

Методыдобавлен в мой класс событий следующим образом.Его аргументами являются имя поля, класс CustomValidator (который просто запускает проверку strtotime) и значение очищенной формы:

public function flightCheckFail($name,$validatorClass,$value) {

    $colname = $this->getPeer()->getTableMap()->getColumnByPhpName($name)->getName();

    $validators = $this->getPeer()->getTableMap()->getColumn($colname)->getValidators();

    foreach($validators as $validatorMap)
      if ($validatorMap->getClass() == $validatorClass) {

        $validator = BasePeer::getValidator($validatorMap->getClass());

        if ( $validator->isValid($validatorMap, $value) === false)
           $failureMessage = $validatorMap->getMessage();

      } // if $validatorMap->getClass() == $validatorClass

    if($failureMessage)
      return $failureMessage;
    else
      return false;

}

Я должен иметь возможность использовать это для обходаобработка дат в формах, но мне нужно проверить, какие другие типы в Propel могут требовать такого рода обработки.

Я могу остановить обработку формы, где бы она ни сообщала об ошибке validator, и отправить ееназад.Когда пользователь вводит действительные данные, Propel (и обычно Propel Validation) продолжает работать в обычном режиме.

Если кто-то может улучшить это, я хотел бы увидеть ваши результаты.

...