Validation 推进ORM版本1.6.4-了解验证器

Validation 推进ORM版本1.6.4-了解验证器,validation,orm,propel,custom-validators,Validation,Orm,Propel,Custom Validators,几个小时后重新编写了问题,使其更具描述性 我需要一些关于在独立的非框架开发中理解设置器/验证器的建议 关于验证的报告指出: 验证器帮助您在将输入持久化到数据库之前验证输入 。。。在验证程序消息中,我们可以提供一致的建议,说明用户可以在哪里更正未通过验证的条目 验证程序的示例用法如下: 我发现的问题是“如果您无法设置xxx以验证它怎么办?” 我有一个列类型的日期,我邀请访问者在web表单中输入日期。他们错误地键入了日期,并于20q2年3月18日提交 我希望我的一个自定义验证器能够报告一条验证器消息

几个小时后重新编写了问题,使其更具描述性

我需要一些关于在独立的非框架开发中理解设置器/验证器的建议

关于验证的报告指出:

验证器帮助您在将输入持久化到数据库之前验证输入

。。。在验证程序消息中,我们可以提供一致的建议,说明用户可以在哪里更正未通过验证的条目

验证程序的示例用法如下:

我发现的问题是“如果您无法设置xxx以验证它怎么办?”

我有一个列类型的日期,我邀请访问者在web表单中输入日期。他们错误地键入了日期,并于20q2年3月18日提交

我希望我的一个自定义验证器能够报告一条验证器消息,并再次将表单返回给要修改的用户,但这首先发生:

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 (/): 
我理解为什么会这样——如果您不能依赖新对象的字段,即使在保存它之前,也无法创建并尝试操作它,这是没有意义的

这给我带来的困境是:

如果致命错误可能是由于无效输入导致无法为我和用户处理推进验证并发送回有用消息,那么我是否应该处理推进验证以及我自己的安全/礼貌验证

在文档中,我找不到任何关于如果您出于任何原因给Propel一个字段预期不到的值,或者如何处理该值会发生什么的内容


我真的希望这是有意义的,有人能告诉我一种方法,这意味着我只需要在一个地方验证输入。

我已经拼凑出一个粗略的解决方案,它将允许我:

根据CustomValidator预先验证字段,而不在新对象中设置它 检索验证程序的消息以返回给用户 我接受表单输入,当然对其进行清理,然后创建一个对象:

$event = new Event();
考虑到我的用户表单,然后我预先检查我知道的字段,如果内容不好,该字段将致命地掉落,并且只有在我的新对象中设置该字段,如果它将验证:

    if ($check = $event->flightCheckFail('StartingDate','DateValidator',$sanitisedFormVal))
      echo $check;
    else
      $event->setStartingDate($sanitisedFormVal);
方法flightCheckFail将返回false,如果表单中的数据将根据字段进行验证,则返回验证程序的错误消息(如果失败)

该方法已添加到我的事件类中,如下所示。它的参数是字段名、仅运行strotime检查的CustomValidator类和经过清理的表单值:

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;

}
我应该能够使用它来处理表单中的日期,但我需要检查spreep中的哪些其他类型可能需要这种处理

我可以在报告验证器错误消息的地方停止表单处理并将其发送回。当用户输入有效数据时,推进和正常推进验证将正常继续


如果有人能在这方面有所改进,我希望看到您的结果。

我已经拼凑了一个粗略的解决方案,它将允许我:

根据CustomValidator预先验证字段,而不在新对象中设置它 检索验证程序的消息以返回给用户 我接受表单输入,当然对其进行清理,然后创建一个对象:

$event = new Event();
考虑到我的用户表单,然后我预先检查我知道的字段,如果内容不好,该字段将致命地掉落,并且只有在我的新对象中设置该字段,如果它将验证:

    if ($check = $event->flightCheckFail('StartingDate','DateValidator',$sanitisedFormVal))
      echo $check;
    else
      $event->setStartingDate($sanitisedFormVal);
方法flightCheckFail将返回false,如果表单中的数据将根据字段进行验证,则返回验证程序的错误消息(如果失败)

该方法已添加到我的事件类中,如下所示。它的参数是字段名、仅运行strotime检查的CustomValidator类和经过清理的表单值:

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;

}
我应该能够使用它来处理表单中的日期,但我需要检查spreep中的哪些其他类型可能需要这种处理

我可以在报告验证器错误消息的地方停止表单处理并将其发送回。当用户输入有效数据时,推进和正常推进验证将正常继续

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

你也可以使用带有日期RegExp的MatchValidator,不需要额外的函数

你也可以使用带有日期RegExp的MatchValidator,不需要额外的函数