バリデータとは

バリデータはschema.xmlファイルで参照されデータが追加されるカラムが従わなければならないルールです。schema.xmlファイルで複数のルールエントリをバリデータエントリごとに適用することも出来ます。バリデータはPHPレベルで適用され、それらは作成されたオブジェクトのミューテータ関数に投入されます、それらはデータベース自身上で制約としては作成されませんので警告されます データベースに取り組むために他の言語も使用する場合、テーブルにアクセスする時にこれらは強制されません。

どのように行うか

ここにどのようにvalidate()を使用するのかアイディアを提供してくれるちょっとしたコードスニペットがあります。4のminLengthを持つユーザネーム上でminLengthバリデータのインスタンスを伴うUserオブジェクトを持つことを前提とします。(schema.xmlにバリデータを追加する方法の例に関してはminLengthバリデータをご覧下さい)

$objUser = new User();
// Set a username with length 3, which is too short...
$objUser->setUsername("foo");

if ($objUser->validate()) {

    // それを保存します、バリデーションエラーを得ない、もしくは望むことは何でもするので。
    $objUser->save(); 

} else {

    // 何かが間違っている。validationFailuresを取得して取り扱うことが出来る。
    // インスタンスのためにメッセージを出力する。
    $validationFailuresArray = $objUser->getValidationFailures();
    foreach($validationFailuresArray as $objValidationFailure) {

        echo $objValidationFailure->getMessage() . "<br />\n";

    }

}


バリデータ

下記の方でPropel(1.1と1.2)に現在存在するバリデータのリストとそれぞれの使い方の例を見ることが出来ます。

  • MatchValidator
  • MaxLengthValidator
  • MaxValueValidator
  • MinLengthValidator
  • MinValueValidator
  • NotMatchValidator
  • RequiredValidator
  • UniqueValidator
  • ValidValuesValidator

MatchValidator

<validator column="username">
  <!-- allow strings that match the email adress pattern -->
   <rule
    name="match"
    value="/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/"
    message="Please enter a valid email address." />
</validator>

MatchValidatorはカラムに対する正規表現の選択を実行するために使用されることに留意して下さい。これはpregであってeregではありません。正規表現についてもっと詳しい情報はhttp://www.php.net/preg_match をご覧下さい。

MaxLengthValidator

<!-- LONGVARCHAR has length completely ignored by some databases -->
<column name="comment" type="LONGVARCHAR" required="true" />
<validator column="comment">
  <rule
    name="maxLength"
    value="1024"
    message="Comments can be no larger than ${value} in size" />
</validator>

カラムタグに指定されたsize属性がある場合、バリデータルールでそれを再び値として指定する必要がないことに留意して下さい。これは自動的に行われるからです。

MaxValueValidator

<column name="security_level" type="INTEGER" required="true" />
<validator column="security_level">
  <rule
    name="maxValue"
    value="1000"
    message="Maximum security level is ${value} !" />
</validator>

MinLengthValidator

<column name="username" type="VARCHAR" size="34" required="true" />
<validator column="username">
  <rule
    name="minLength"
    value="4"
    message="Username must be at least ${value} characters !" />
</validator>

MinValueValidator

<column name="cost" type="INTEGER" required="true" />
<validator column="cost">
  <rule
    name="minValue"
    value="0"
    message="Products can cost us negative $ can they?" />
</validator>

NotMatchValidator

<column name="ISBN" type="VARCHAR" size="20" required="true" />
<validator column="ISBN">
  <!-- disallow everything that's not a digit or minus -->
  <rule
    name="notMatch"
    value="/[^\d-]+/"
    message="Please enter a valid ISBN" />
</validator>

matchとは反対に、正規表現がtrueを返す場合これはfalseを返します。

RequiredValidator

<column name="username" type="VARCHAR" size="25" required="true" />
<validator column="username">
  <rule
    name="required"
    message="Username is required." />
</validator>

カラム上のrequired=trueは同じことをしますが、クリーンなエラーは出力しません、人によってバリデータエラーはよりシンプルかもしれません。

UniqueValidator

<column name="username" type="VARCHAR" size="25" required="true" />
<validator column="username">
  <rule
    name="unique"
    message="Username already exists !" />
</validator>

ユニークバリデータではなくユニークインデックスが必要なことがよくあります。

ValidValuesValidator

<column name="address_type" type="VARCHAR" required="true" default="delivery" />
<validator column="address_type">
  <rule
    name="validValues"
    value="account|delivery"
    message="Please select a valid address type." />
</validator>

|で区切られたリストの中から値を許可する

組み合わせの例

<column name="security_level" type="INTEGER" required="true" default="10" />
<validator column="security_level" translate="none">
  <rule
    name="minValue"
    value="0"
    message="Invalid security level, range: 0-10" />
  <rule
    name="maxValue"
    value="10"
    message="Invalid security level, range: 0-10" />
</validator>

ご覧の通り、一つのカラムに対して複数のバリデータを実行させることも出来ます

独自のバリデータを追加する方法

独自のバリデータを追加することは可能です。いくつか覚えておかなければならないことがあります!独自のバリデータを追加するとき次のことを行います:

1. 独自のバリデータオブジェクトを作成します。BasicValidatorを拡張することによってこれを行います。

require_once 'propel/validator/BasicValidator.php';

/**
 * emailフィールドのためのシンプルなバリデータ。
 * 
 * @package propel.validator
 */
class EmailValidator implements BasicValidator
{

        // 警告: この関数が論理型を返すことを確認して下さい!trueもしくはfalseのどちらかです。(Propelはこのことについてとても厳密です)
        // これをすることで多くのフラストレーションを経験せずに済みます :P
	public function isValid (ValidatorMap $map, $str) {

		return preg_match("'^[a-z0-9_.=-]+@(?:[a-z0-9-]+\.)+([a-z]{2,4})\$'i", $str) !== 0;

	}
}

  • 再び警告: isValid()がtrueもしくはfalseの論理値を返すことを確認して下さい。Propelはこのことにとても厳密です。混合型の値を返されると動作しません。

2. schema.xmlを編集してあなたのバリデータを追加します。

<validator column="<column_name>">
    <rule name="class" class="my.dir.EmailValidator" message="Invalid e-mail address!" />
</validator>

  • name="class"を使用してclass= 属性を追加していることを確認して下さい。
  • クラス属性はディレクトリを指定します(とオブジェクト)。PHPのinclude_pathが適切に設定されていることが重要なので、my.dir.YourValidatorはinclude_pathにあるディレクトリの一つから相対的に含むことが出来ます。

将来動作するバリデーション(おそらく)

Propel 2.0において、バリデーションはsave()関数で適切に行われます。またより多くのバリデータが組み込まれます!少しウィッシュリストがあります。

  • EmailValidator
  • RangeValidator
  • LengthValidator
  • HexValidator/HashValidator
  • NoHTMLValidator
  • Others?

EmailValidator

これはどのようにアドレスを熱心にテストするのかを決定するルール経由で設定されるフラグ付きのシンプルでスマートな電子メールバリデータです。

RangeValidator

一つのカラム上でMinValueとMaxValueの代わりに、それをRangeValidatorしてその空無情の2つの代わりに一つのバリデータを持ちます。

LengthValidator

文字列の長さのために意外はRangeValidatorと同じです。

HexValidator/HashValidator

基本的なヘックステストであるべき、もしくは入力が特定のハッシュの有効なハッシュであることをテストするかどうか決定されていません。あるいはこれをそのタイプのために0-9a-fと正しい文字カウントを要求することを知っているHashValidatorに切り替えます。 HexValidatorとして残された場合、それが要求されるように文字カウントの0-9a-fのためにテストされます。

NoHTMLValidator

HTML(安全であるもしくはでない)がフィールドにある場合に吐き出す何か