2

(几小时后将问题改写为更具描述性)

我需要一些关于理解Propel setters/validators在独立(非框架)开发中的建议。

关于验证的文档指出:

验证器可帮助您在将输入持久保存到数据库之前对其进行验证。

Propel...并且在验证器消息中,我们可以就用户可以在何处更正未通过验证的条目提供连贯的建议。

a 的示例用法validator如下:

$user = new User(); 
$user->setUsername("foo"); // only 3 in length, which is too short...
if ($objUser->validate()) {
...

我发现的问题是“如果你不能setXXX()验证它怎么办?”

我有一个列类型DATE,我邀请访问者在 Web 表单中输入日期。他们打错日期并提交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- 无论出于何种原因 - 它没有为该字段预期的值或如何处理它会发生什么。

我确实希望这是有道理的,并且有人可以向我指出一种方法,这意味着我只需要在一个地方验证输入。

4

2 回答 2

0

我已经编写了一个粗略的现成解决方案,可以让我:

  • 针对 a 预先验证字段CustomValidator而不将其设置在新对象中
  • 检索validator' 的消息以返回给用户

我接受表单输入,当然对其进行清理,然后创建一个对象:

$event = new Event();

考虑到我的用户表单,然后我预先检查我知道如果内容不好会致命的字段,并且仅在我的新对象中设置该字段,如果它可以验证:

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

flightCheckFail()如果表单中的数据将针对该字段进行验证,则方法将返回 false,如果validator失败,则返回错误消息。

该方法已添加到我的 Event 类中,如下所示。它的参数是字段名、类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(和 normal Propel Validation)可以正常继续。

如果有人可以改进这一点,我很乐意看到你的结果。

于 2012-03-07T16:30:23.317 回答
0

您还可以使用MatchValidator带有日期正则表达式的 , 不需要额外的功能

于 2015-02-11T07:03:51.780 回答