FuelPHPの標準バリデーションルール総まとめ

目次
こんにちは。
開発チームのワイルド担当、まんだいです。
今回は、FuelPHP標準のバリデーションルールについて、知ってることや意外な使い方など、ドキュメントに載っていない情報をなるべく盛り込んでお届けしたいと思います。
なお、FuelPHPのバージョンは1.7.2で確認しております。
required
| ルール名 | 引数 |
|---|---|
| required | なし |
requiredは必須項目のチェックで、「false」、「null」、「空文字」、「要素を持たない空の配列」以外の時、パスできます。
required以外のバリデーションルールは、空文字でパスできてしまうのに注意が必要です。
required_with
| ルール名 | 引数 |
|---|---|
| required_with | $fieldname |
$fieldnameの名前を持つフィールドのデータがrequiredルールをパスした時のみ、requiredルールが適用されます。
チェックボックスにチェックが付いていた場合、テキストボックスの中身をバリデートする、みたいな使い方でしょうか。
match_value
| ルール名 | 引数 |
|---|---|
| match_value | $compare, $strict = false |
$compareのデータと同じかどうかを比較します。
$compareは、文字列、数字の場合、「===」による型も含めた比較をします。
また、$strictがfalseの場合、「==」による型を無視した比較をします。
$compareが配列の場合、配列を走査し、順に「===」による型も含めた比較をします。
同じものがあった場合、バリデーションをパスします。
$strictがfalseの場合、「==」による型を無視した比較をします。
match_pattern
| ルール名 | 引数 |
|---|---|
| match_pattern | $pattern |
preg_match関数による正規表現を用いたパターンマッチを行います。
Fuelphpのfieldsetで入力フォームを高速かつエレガントかつワイルドに量産してみる | 株式会社ビヨンドにもサンプルがありますので合わせてご確認いただければと思います。
match_field
| ルール名 | 引数 |
|---|---|
| match_field | $field |
$fieldで指定したフィールドと型チェックを含めた比較をします。
このルールには、strictの指定はできないので「===」の場合と空文字の場合のみ、パスします。
match_collection
| ルール名 | 引数 |
|---|---|
| match_collection | $collection = array(), $strict = false |
$collectionが配列の場合、in_array関数で配列内の値と比較します。
$strictがtrueの場合、in_array関数の第三引数にtrueがセットされ、型チェックも含めた厳密な比較を実施します。
$collectionが配列ではない場合、与えられた引数全てを配列にセットし、in_array関数による比較を実施します。
例えば、「1, true, 2, 'test3'」というデータを引数にした場合、フォームから1を入力しても、$strictにtrueがセットされているためパスできません(POST送信された数字は文字列扱いのため)。
実質、このバリデーションをパスできる文字列はtest3のみという事になります。
また、「1, 'true', 2, 'test3'」というデータを引数にした場合、$strictにtrueがセットされているように見えますが、ブール値ではないため、型チェックなしの比較となります。
よって、POST送信されたデータをバリデーションする場合は、「true」、「test3」の2つがパスできる事になります。
仕様が不明瞭でわかりにくい、かつmatch_valueルールで第一引数を配列にした時と同じ挙動をするため、$collectionに配列以外のデータを入力して使用するのは思わぬ落とし穴になりそうです。
min_length
| ルール名 | 引数 |
|---|---|
| min_length | $length |
文字列のサイズが$length以上の場合、パスできます。
サイズが0の場合(=空文字)もパスできますので、$length = 1としたところで必須項目の検証にはなりません。
max_length
| ルール名 | 引数 |
|---|---|
| max_length | $length |
文字列のサイズが$length以下の場合、パスできます。
exact_length
| ルール名 | 引数 |
|---|---|
| exact_length | $length |
文字列のサイズが$lengthの場合、パスできます。
サイズが0の場合(=空文字)もパスできますので、requiredとセットで使う事が多いかもしれません。
valid_date
| ルール名 | 引数 |
|---|---|
| valid_date | $format = null, $strict = true |
与えられた文字列が、日時のフォーマットに沿ったデータかどうか検証します。
空文字の場合、パスできるのは言わずもがなですが、$formatを敢えて指定する必要はないというのはドキュメントしか見ていないと中々気付けないでしょう。
$formatにフォーマットをセットした場合、date_parse_from_format関数によって$formatに基いたパースが行われます。
$formatがnullの場合、date_parse関数によって、パースするので、フォーマットを決め打ちする必要がありません(日付としてパースできてしまうデータが誤ってパスする可能性もある訳ですが)。
$formatにnullをセットした場合のメリットとしては、「Y-m-d」と「Y/m/d」の両方がパスできるルールにできるという事でしょうか。
valid_email
| ルール名 | 引数 |
|---|---|
| valid_email | なし |
filter_var関数を使って、メールアドレスとして妥当な文字列かを検証します。
filter_var関数でのメールアドレス検証はpreg_match関数を使って自前の正規表現を通すより遥かに安全です。
valid_emails
| ルール名 | 引数 |
|---|---|
| valid_emails | $separator (optional) |
$separatorに設定された文字列で入力データをexplodeで分解した後、ループでvalid_emailルールの検証します。
なお、$separatorのデフォルト値は「,」になっています。
valid_url
| ルール名 | 引数 |
|---|---|
| valid_url | なし |
filter_var関数を使って、URLとして妥当な文字列かを検証します。
filter_var関数の落とし穴として、マルチバイト文字を含むURLは実在するURLだとしてもパスできません。
valid_ip
| ルール名 | 引数 |
|---|---|
| valid_ip | なし |
filter_var関数を使って、IPアドレスとして妥当な文字列かを検証します。
IPv4、IPv6問わず検証できます。
numeric_min
| ルール名 | 引数 |
|---|---|
| numeric_min | $min_val |
入力値が数字として$min_val以上かどうかを検証します。
内部的には入力値と$min_valをfloatにキャストして比較するので、小数も比較もできます。
numeric_max
| ルール名 | 引数 |
|---|---|
| numeric_max | $max_val |
入力値が数字として$max_val以下かどうかを検証します。
内部的には入力値と$max_valをfloatにキャストして比較するので、小数も比較もできます。
numeric_between
| ルール名 | 引数 |
|---|---|
| numeric_between | $min_val, $max_val |
入力値が数字として$min_val以上、 $max_val以下であるかを検証します。
numeric_minルールとnumeric_maxルールを同時に検証している内容です。
valid_string
| ルール名 | 引数 |
|---|---|
| valid_string | $flags = array('alpha', 'utf8') |
ルールを選ぶだけで汎用的な正規表現を組み立てて検証を行います。
match_patternでも同等のものはできますが、込み入った正規表現でないなら、正規表現を読む必要がない分見通しは良いかも知れません。
$flagsに格納される配列が取り得る文字列は、以下の通りです。
| フラグ | 対象の文字 |
|---|---|
| alpha | 大文字小文字アルファベット |
| numeric | 0~9の数字 |
| specials | アルファベット([:alpha:]でパターンマッチされる文字列) |
| spaces | 半角スペース |
| newlines | \r \n |
| tabs | \t |
| punctuation | . , ! ? : ; & |
| singlequotes | ' |
| doublequotes | " |
| dashes | _ - |
| forwardslashes | / |
| backslashes | \ |
| brackets | [ ] |
| braces | ( ) |
| utf8 | { } |
内部処理では、これらのルールを組み合わせて、正規表現を組み立てています。
配列で幾つか指定する必要がある訳ですが、入力データの形式が決まっている場合、データフォーマットに沿ったルールを自動的にセットしてくれる隠し機能があります。
URLであれば、「$flags = 'url_safe'」とするだけで、'alpha', 'numeric', 'dashes'の3つのフラグが設定されます。
このようなルール(複数のルールがセットになった、ルールセット?)が実は隠し機能として存在しています。
| ルールセット名 | 設定されるルール |
|---|---|
| alpha | alpha, utf8 |
| alpha_numeric | alpha, utf8, numeric |
| specials | specials, utf8 |
| url_safe | alpha, numeric, dashes |
| integer, numeric | numeric |
| float | numeric, dots |
| quotes | singlequotes, doublequotes |
| slashes | forwardslashes, backslashes |
| all | alpha, utf8, numeric, specials, spaces, newlines, tabs, punctuation, singlequotes, doublequotes, dashes, forwardslashes, backslashes, brackets, braces |
allのやけくそっぷりがハンパないですね(いつ使うんだよ)。
以上です。
1