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

私のカスタムバリデーターの1つがバリデーターメッセージを報告し、修正のためにフォームをもう一度ユーザーに返すことができることを願っていますが、これが最初に発生します:

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なんらかの理由で、フィールドに予期しない値を指定した場合に何が起こるか、またはそれをどのように処理するかについて、ドキュメントで言及されていません。

これが理にかなっており、入力を 1 か所で検証するだけでよいことを意味する方法を誰かが教えてくれることを願っています。

4

2 に答える 2

0

を使用することもできますMatchValidator。日付の正規表現を使用すると、追加の関数は必要ありません

于 2015-02-11T07:03:51.780 に答える
0

私は、次のことを可能にする大まかな準備ができているソリューションをまとめました。

  • 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(および通常のPropel Validation) 通常どおり続行されます。

誰かがこれを改善できるなら、私はあなたの結果を見たいです.

于 2012-03-07T16:30:23.317 に答える