2012-03-05 7 views
2

(質問時間後より説明する言い換え)PropelのORMバージョン1.6.4 -understandingバリ

私は、スタンドアロン(非フレームワーク)の開発にPropelsetters/validatorsを理解する上で少しアドバイスを必要としています。検査状態に

documentation

バリデータは、あなたがそれをデータベースに永続化する前に入力を検証するのに役立ちます。

...そしてバリデータメッセージでは、ユーザがPropelの検証に合格しないエントリを修正できる場所について一貫したアドバイスを提供することができます。

validatorの使用例は、読み取ります

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

私はこれを発見した問題である「何、それを検証するためではないsetXXX()することができますか?」

私はカラムタイプがDATEです。訪問者にウェブフォームで日付を入力するように依頼します。

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 (/): 
を:彼らは、しかし、これが最初に発生し、私は私のカスタムバリデータの一つが、バリデータメッセージを報告し、改正することがもう一度フォームをユーザーに返すことができるようになることを願っています日付の入力を間違えたと 03/18/20q2

を提出します - それができるようにするには意味がありません

$event= new Event(); 
    $event->setDateStart($form_value_for_date); // where values is "03/18/20q2" 

なぜそうなのか、私は理解して:私は(例えば)書いた後、私は発射する任意の単純またはCustomValidatorを得ることができなかった私のテストでは

作成して新しいものを操作しようとするたとえあなたがそれを保存する前であっても、あなたがそのフィールドに頼ることができなければ、オブジェクトです。

これは私を与えるジレンマがある:

致命的なエラーが無効な私のためにそれを扱うからPropel validationを防止エントリ(したがって、ユーザー)、有用なメッセージを送り返すことに起因することができれば、私のようにPropel validationを気にする必要があり私自身のセキュリティ/礼儀の検証と同様に?

Propelに何らかの理由で - フィールドに期待されない値、またはそれを処理する方法を指定した場合、何が起こるかのドキュメント内の言及が見つかりません。

私はこれが意味を持ち、誰かが1つの場所で入力を検証する必要があることを意味する方法で私を指摘することができれば幸いです。私は一緒に私にできるようになりますラフな準備ができて解決策をハッキングしてきました

答えて

0

へ:

  • 事前検証
  • ためvalidatorのメッセージを取得し、新しいオブジェクトでそれを設定せずにCustomValidatorに対するフィールドを私は、フォームの入力を取り、もちろんそれをサニタイズして、オブジェクトを作成し、ユーザー

に戻る:

心の中で私のユーザーフォームで

、私はその後、内容の悪い場合、私は知っているフィールドは致命的倒れるを事前にチェックし、唯一の私の新しいオブジェクトのフィールドを設定した場合、それだろう検証:

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

メソッドflightCheckFail()フォームのデータがフィールドに対して検証された場合は、validatorのエラーメッセージが失敗するとfalseを返します。

このメソッドは、以下のようにMy Eventクラスに追加されました。引数はフィールド名、(単にstrtotimeチェックを実行します)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; 

} 

は私がフォームで日付を扱う回避するためにこれを使用することができるはずですが、 Propelの他のタイプがこの種の処理を必要とするかもしれないかどうかチェックする必要があります。

この場合は、validatorというエラーメッセージが表示された場所でフォームの処理を停止し、返信することができます。ユーザーが有効なデータを入力すると、Propel(および通常のPropel Validation)が正常に続行されます。

誰かがこれを改善できる場合は、あなたの結果を見たいと思います。

0

また、MatchValidatorを使用することもできます。日付はRegExpで、余分な機能は不要です