4.1 データのバリデーション(Data Validation)

あらゆるアプリケーションにおいて、データのバリデーションは重要です。これは、モデルのデータがアプリケーションのビジネスルールに必ず従うようにすることに役立ちます。例えば、パスワードは8文字以上であるとか、ユーザ名は必ずユニークにするといったことが挙げられます。バリデーションを定義することは、フォームの取り扱いをとても簡単にします。

バリデーションの仕組みは多くの異なる場面で使います。 この章ではモデルでの利用、基本的には save() メソッドを呼び出した時の振る舞いについてを説明します。バリデーションエラーをどのように取り扱うかについての詳細な情報は、FormHelperについての項目を参照してください。

データのバリデーションを行うには、まずモデルにバリデーションのルールを作成します。これは、モデルの定義の中の Model::validate 配列で行います。次の例を見てください。

<?php
class User extends AppModel {  
    var $name = 'User';
    var $validate = array();
}
?>
  1. <?php
  2. class User extends AppModel {
  3. var $name = 'User';
  4. var $validate = array();
  5. }
  6. ?>

この例では、User モデルに $validate 配列 を追加していますが、バリデーションのルールは何も存在しません。users テーブルに login、password、email、born というフィールドがあるとして、次の例では簡単なバリデーションのルールをこれらのフィールドに加えます。

<?php
class User extends AppModel {
    var $name = 'User';
    var $validate = array(
        'login' => 'alphaNumeric',
        'email' => 'email',
        'born' => 'date'
    );
}
?>
  1. <?php
  2. class User extends AppModel {
  3. var $name = 'User';
  4. var $validate = array(
  5. 'login' => 'alphaNumeric',
  6. 'email' => 'email',
  7. 'born' => 'date'
  8. );
  9. }
  10. ?>

この例は、モデルのフィールドに対してどのようにバリデーションのルールを追加できるかを表しています。「login」フィールドがアルファベットか数字のみ、「email」は電子メールアドレスとして有効な文字列、「born」は日付として有効な文字列が許可されます。バリデーションルールを定義すると、もしそのルールに従わないデータが送信された時に CakePHP のオートマジック(automagic)はフォームにエラーメッセージを表示します。

CakePHPはバリデーションのルールを多く持ち、それらを使うことは大変簡単です。あらかじめ組み込まれたルールには、電子メールのアドレス、URL、クレジットカードの番号を表すものもありますが、これらは後で説明します。

次の例は、組み込みのバリデーションルールを便利に使うための、より複雑な例です。

<?php
class User extends AppModel {
    var $name = 'User';
    var $validate = array(
        'login' => array(
            'alphanumeric' => array(
                'rule' => 'alphaNumeric',
                'required' => true,
                'message' => 'Alphabets and numbers only'
                ),
            'between' => array(
                'rule' => array('between', 5, 15),
            'message' => 'Between 5 to 15 characters'
            )
        ),
        'password' => array(
            'rule' => array('minLength', '8'),
            'message' => 'Mimimum 8 characters long'
        ),
        'email' => 'email',
        'born' => array(
            'rule' => 'date',
            'message' => 'Enter a valid date',
            'allowEmpty' => true
        )
    );
}
?>
  1. <?php
  2. class User extends AppModel {
  3. var $name = 'User';
  4. var $validate = array(
  5. 'login' => array(
  6. 'alphanumeric' => array(
  7. 'rule' => 'alphaNumeric',
  8. 'required' => true,
  9. 'message' => 'Alphabets and numbers only'
  10. ),
  11. 'between' => array(
  12. 'rule' => array('between', 5, 15),
  13. 'message' => 'Between 5 to 15 characters'
  14. )
  15. ),
  16. 'password' => array(
  17. 'rule' => array('minLength', '8'),
  18. 'message' => 'Mimimum 8 characters long'
  19. ),
  20. 'email' => 'email',
  21. 'born' => array(
  22. 'rule' => 'date',
  23. 'message' => 'Enter a valid date',
  24. 'allowEmpty' => true
  25. )
  26. );
  27. }
  28. ?>

フィールド「login」に対して、「文字の種類がアルファベットまたは数字」かつ「長さが5文字以上で15文字以下」という2つのバリデーションルールが定義されています。同様に、フィールド「password」は長さが8文字以上であり、「email」は電子メールアドレスとして有効な文字列、「born」は日付として有効な文字列であると定義されています。 また、データがバリデーションのルールに従わない時に、CakePHPは任意のメッセージ表示します。それををどのように追加するかに注目してください。

これまでの例の通り、1個のフィールドは複数のバリデーションのルールを持つことが出来ます。そして、もし使いたいルールが組み込まれていなければ、必要に応じて独自のバリデーションのルールを追加することができます。

さて、ここまででバリデーションがどのように動くかについての概要を説明しました。 次に、これらのルールをモデル中でどのように定義するのかを見ていきましょう。これには、「単純な配列で定義する」、「1個のフィールドに1個のルールを定義する」、「1個のフィールドに複数のルールを定義する」という3つの異なった方法があります。