CakePHP で項目のチェックを行う。

## チェック構文

```php
class Model extends AppModel {
   $validate = array( /* チェック：後述 */ );
}

class ModelController extends AppController {

public function create () {
    $data = $this->request->data;

    // チェックのみを行う。
    $this->Model->set($data);
    if (!$this->Model->validates()) { echo "NG \n"; }

    // 登録と同時にチェックを行う。
    $this->Model->create();
    if (!$this->Model->save ($data)) { echo "NG \n"; }
    
    // 規定外のテンプレートを呼ぶ ( ctp は不要 )
    $this->render ( "edit" /*, layout = default */);
}

public function edit($id=0) {
    $data = $this->request->data;

    // チェックのみを行う。
    $this->Model->set($data);
    if (!$this->Model->validates()) { echo "NG \n"; }

    // 登録と同時にチェックを行う。
    $this->Model->set($data);
    if (!$this->Model->save ($data)) { echo "NG \n"; }
}

```

## 検証ルール


| Rule | Check | Sample |
|------:|:----------|:----------|
| notEmpty | 必須 | 'column' => 'notEmpty' |
| blank | 未入力チェック | 'column' => 'blank'
| boolean | 論理値チェック ( 0 or 1 ) | 'column' => 'boolean'
| custom | 正規表現 | 'column' => array('custom', '/0[0-9]0[-]?[0-9]{4}[-]?[0-9]{4}/ig')
| equalTo | 一致チェック | 'column' => 'equalTo'
| inList | リストチェック | 'column' => array('inList', array(1,2,3))
| isUnique | ユニークチェック(SQL発行) | 'column' => 'isUnique'
# 形式チェック

| Rule | Check | Sample |
|------:|:----------|:----------|
| ip | IP形式 | 'column' => 'ip'
| ip | IP形式(v4) | 'column' => array('ip', 'IPv4') /* 0.0.0.0 */
| ip | IP形式(v6) | 'column' => array('ip', 'IPv6') /* 0::0.0.0 */
| uuid | RFC-4122 (UUID形式であるかどうか)
| cc | クレジットカードチェック | 'column' => array('cc')
| cc | クレジットカードチェック(アメリカンエクスプレス) | 'column' => array('cc', 'amex')
| cc | クレジットカードチェック(ダイナースクラブ) | 'column' => array('cc', 'diners')
| cc | クレジットカードチェック(JCB) | 'column' => array('cc', 'jcb')
| cc | クレジットカードチェック(VISA) | 'column' => array('cc', 'visa')
| cc | クレジットカードチェック(VISA + JCB) | 'column' => array('cc', array('jcb', 'visa')
| email | メールアドレス形式 | 'column' => 'email'

# 日付チェック

| Rule | Check | Sample |
|------:|:----------|:----------|
| date | 日付 | 'column'=>'date'
| date | 日付 (yyyy-mm-dd or yy-mm-dd )| 'column'=>array('date', 'ymd')
| date | 日付 (yyyy-mm or yy-mm )| 'column'=>array('date', 'ym')
| datetime | 日付 | 'column'=>'datetime'
| datetime | 日付 (yyyy-mm-dd or yy-mm-dd )| 'column'=>array('datetime', 'ymd')
| datetime | 日付 (yyyy-mm or yy-mm )| 'column'=>array('datetime', 'ym')

# ファイル関連（BLOB/CLOB)

| Rule | Check | Sample |
|------:|:----------|:----------|
| fileSize | ファイルサイズチェック | 'column' => array('fileSize', '<=', '2MB')
| mimeType | MIMEタイプチェック | 'column' => array('mimeType', 'text/html')
| mimeType | MIMEタイプチェック （部分一致）| 'column' => array('mimeType', '#text/.+#')
| mimeType | MIMEタイプチェック（複数） | 'column' => array('mimeType', array('text/html','text/css'))
| extension | 拡張子チェック | 'column' => array('extension', array('jpg', 'gif', 'png') /* 参考 image */

# 文字列

| Rule | Check | Sample |
|------:|:----------|:----------|
| maxLength | 最大文字長 | 'column' => array('maxLength', 20)
| minLength | 最小文字長 | 'column' => array('minLength', 20)
| alphaNumeric | 英数チェック `/0-9a-f/i` | 'column' => 'alphaNumeric' |

# 数値

| Rule | Check | Sample |
|------:|:----------|:----------|
| numeric | 数値 | 'column' => 'numeric' |
| naturalNumber | 数値（自然数) | 'column' => 'naturalNumber' |
| decimal | 数値（不動小数点数）| 'column'=>'decimal' |
| decimal(10) | 数値（不動小数点数）| 'column'=>array |('decimal',10) |
| decimal(10,2) | 数値（不動小数点数）| 'column'=>array('decimal',10,2) |
| between | レンジチェック | 'column' => array('between',/*min*/10,/*max*/20)  |
| range | レンジチェック | 'column' => array('range',/*min*/10,/*max*/20)  |
| comparison | 数値比較（未満） | 'column' => array('comparison', 'is less', /*検証値*/25)
| comparison | 数値比較（以下） | 'column' => array('comparison', 'less or equal', /*検証値*/25)
| comparison | 数値比較（一致） | 'column' => array('comparison', 'equal', /*検証値*/25)
| comparison | 数値比較（不一致） | 'column' => array('comparison', 'not equal', /*検証値*/25)
| comparison | 数値比較（以上） | 'column' => array('comparison', 'greater or equal', /*検証値*/25)
| comparison | 数値比較（超過） | 'column' => array('comparison', 'is greater', /*検証値*/25)

以下は後日追記