ValitronはPHPでフォームからデータを受け取るときにデータをバリデーション(検証)する機能を提供するライブラリです。依存関係もなくインストールされるファイルは最小限、とてもシンプルで使いやすいライブラリです。
Valitronのインストール
composerでインストールします。プロジェクトのディレクトリに移動して、次のコマンドを実行してください。
composer require vlucas/valitron
composer.json
が生成されて、その中に vlucas/valitron
があればOKです。あら簡単。
% ls
composer.json composer.lock vendor
% less composer.json
{
"require": {
"vlucas/valitron": "^1.4"
}
}
Valitronの使い方
Valitronの使い方は次のようになります。
<?php
//ライブラリの読み込み
require_once __DIR__.'/vendor/autoload.php';
//フォームから渡されるデータの配列
$_POST = array(
'name' => '勘解由小路まさを',
'email' => ''
);
//インスタンスを作成
$検証 = new Valitron\Validator($_POST);
//バリデーションのルールを適用
$検証->rule('required', ['name', 'email']);
$検証->rule('email', 'email');
//バリデーションの実行
if($検証->validate()) {
echo 'バリデーションは成功しました';
}
else{
echo 'バリデーションは失敗しました';
}
//エラーメッセージが入った配列
var_dump($検証->errors());
/*
array(1) {
["email"]=>
array(2) {
[0]=>
string(17) "Email is required"
[1]=>
string(34) "Email is not a valid email address"
}
}
*/
インスタンスを作成
フォームから送信されたデータの配列 $_POST
を引数にして、インスタンスを作成します。(インスタンスを作成って言うかオブジェクトを作成って言うかいつも迷う←どうでもいい)
ルールの適用
rule()
メソッドで、どのルールをどのフィールドに適用するか指定していきます。
//1つのフィールドにルールを適用する場合
$検証->rule('ルール名', 'フィールド名');
//2つ以上のフィールドにルールを適用する場合
$検証->rule('ルール名', ['フィールド名1', 'フィールド名2', ...]);
//ルールによっては3つ以上の引数を取ることもあります
$検証->rule('length', 'username', 10);
バリデーションの実行
validate()
メソッドでバリデーションを実行します。検証に成功した場合は true
失敗した場合は false
を返します。
また、失敗した場合は errors()
でエラーメッセージを取得できます。上記の例では英語になっていますが、簡単に日本語化することができます。あとでやります。まぁ焦るな。
配列のバリデーション
データが配列の場合は *
を使って検証することができます。
//フォームから渡されるデータの配列
$_POST = array(
'animal' => array(
array('name' => 'インパラ'),
array('name' => 'チベットスナギツネ'),
array('name' => 'マンドリル'),
array('name' => '')
)
);
//バリデーションのルールを適用
$検証->rule('required', 'animal.*.name');
検証ルール
次の組み込みの検証ルールが使えます。
ルール | 説明 |
---|---|
required | 必須項目$検証->rule('required', 'name'); |
requiredWith | 指定した項目に値があれば必須$検証->rule('requiredWith', 'password', 'username'); |
requiredWithout | 指定した項目に値がなければ必須$検証->rule('requiredWith', 'username', 'first_name'); |
equals | 指定した項目と値が一致するか(メールアドレスやパスワードの確認)$検証->rule('equals', 'email', 'confirmEmail'); |
different | 指定した項目と値が異なるか$検証->rule('different', 'username', 'password'); |
accepted | 値が yes, on, 1, true か(チェックボックスやラジオボタン)$検証->rule('accepted', 'remember_me'); |
numeric | 数値かどうか$検証->rule('numeric', 'amount'); |
integer | 整数かどうか$検証->rule('integer', 'age'); |
boolean | 真偽値(true, false)かどうか$検証->rule('boolean', 'remember_me'); |
array | 配列かどうか$検証->rule('array', 'user_notifications'); |
length | 文字列が指定した文字数と一致するか$検証->rule('length', 'username', 10); |
lengthBetween | 文字列が指定した範囲の文字数か$検証->rule('lengthBetween', 'username', 3, 10); |
lengthMin | 文字列が指定した数以上の文字数か$検証->rule('lengthMin', 'username', 3); |
lengthMax | 文字列が指定した数以下の文字数か$検証->rule('lengthMax', 'username', 10); |
min | 数値が指定した数以上か$検証->rule('min', 'age', 18); |
max | 数値が指定した数以下か$検証->rule('max', 'age', 12); |
listContains | 配列が指定した値を含んでいるか$検証->rule('listContains', 'colors_arr', 'yellow'); |
in | 値が指定した配列の値を含んでいるか$検証->rule('in', 'color', ['blue', 'green', 'red', 'purple']); |
notIn | 値が指定した配列の値を含んでいないか(inの逆)$検証->rule('in', 'color', ['blue', 'green', 'red', 'purple']); |
ip | 値が有効なIPアドレスかどうか(IPv4, IPv6)$検証->rule('ip', 'user_ip'); |
ipv4 | 値が有効なIPv4アドレスかどうか$検証->rule('ipv4', 'user_ip'); |
ipv6 | 値が有効なIPv6アドレスかどうか$検証->rule('ipv6', 'user_ip'); |
値が有効なメールアドレスの形式かどうか$検証->rule('email', 'user_email'); | |
emailDNS | 値が有効なメールアドレスの形式かどうか(DNSチェックあり)$検証->rule('emailDNS', 'user_email'); |
url | 値が有効なURLの形式かどうか$検証->rule('url', 'website'); |
urlActive | 値が有効なURLの形式かどうか(DNSチェックあり)$検証->rule('urlActive', 'website'); |
alpha | 値がアルファベットのみか$検証->rule('alpha', 'username'); |
alphaNum | 値がアルファベットと数字のみか$検証->rule('alphaNum', 'username'); |
ascii | 値がASCII文字のみか$検証->rule('ascii', 'username'); |
slug | 値がURLスラッグ文字(a-z, 0-9, -, _)のみか$検証->rule('ascii', 'username'); |
regex | 値が指定した正規表現のパターンに一致するか$検証->rule('regex', 'username', '/^[a-z0-9]{3,16}$/'); |
date | 値が有効な日付か$検証->rule('date', 'created_at'); |
dateFormat | 値が指定した形式の有効な日付か$検証->rule('dateFormat', 'created_at', 'Y年m月d日'); |
dateBefore | 値が指定した日付より前の有効な日付か$検証->rule('dateBefore', 'created_at', '2018-10-13'); |
dateAfter | 値が指定した日付より後の有効な日付か$検証->rule('dateAfter', 'created_at', '2018-10-13'); |
contains | 値が指定した文字列を含むか$検証->rule('contains', 'username', 'man'); |
subset | 値が配列またはスカラー値で、指定した配列にすべて含まれるか$検証->rule('subset', 'colors', ['green', 'blue', 'orange']); |
containsUnique | 値が配列で、配列の値がすべて異なっているか$検証->rule('containsUnique', 'colors_arr'); |
creditCard | 値が有効なクレジットカード番号か$検証->rule('creditCard', 'credit_card'); カードブランドの指定も可能 (visa, mastercard, dinersclub, amex, discover) $検証->rule('creditCard', 'credit_card', ['visa', 'mastercard']); |
instanceOf | 値が指定したクラスのインスタンスか$検証->rule('instanceOf', 'date', \DateTime); |
optional | 値は必須ではないが、入力された場合は検証される$検証->rule('optional', 'username'); |
arrayHasKeys | 値は配列で、指定されたすべてのキーを含むか$検証->rule('arrayHasKeys', 'address', ['name', 'street', 'city']); |
おすすめの有能ルール
emailDNS
と urlActive
は、メールアドレスやURLのドメインが有効なものか、DNSに問い合わせて確認してくれます。試しにネット接続を切ってみたところ、有効なドメインでもバリデーションに失敗しました(実験くん)。こりゃ便利ですね。ユーザの入力ミスを防ぐのに使えそうです。
カスタムルール
カスタムルールを作ることができます。いえーい。絶対作りたい。インスタンスを作成する前に定義してください。
Valitron\Validator::addRule(
'ゆんゆん',
function($field, $value, array $params, array $fields){
if($value == 'ゆんゆん'){
return true;
}
else{
return false;
}
},
'{field}はゆんゆんしてません。'
);
addRule()
の1つめの引数はルールの名前です。ここでは「ゆんゆん」としました(なにそれ)。
2つめの引数はバリデーションをする関数です。
$field
は検証するフィールドのフィールド名です。$value
は検証するフィールドの値です。$params
はrule()
の3つめ以降の引数が入った配列です。$fields
はフォーム全体のフィールド名と値が入った連想配列です。- 検証に成功したら
true
失敗したらfalse
を返すようにします。
3つめの引数はエラーメッセージです。{field}
はフィールド名に置き換えられます。
エラーメッセージの日本語化
いちばん簡単な方法
エラーメッセージを日本語にするには、次のようにします。
//エラーメッセージの日本語化
Valitron\Validator::lang('ja');
//インスタンスを作成
$検証 = new Valitron\Validator($_POST);
//フィールド名の日本語化
$検証->labels([
'name' => '名前',
'email' => 'メールアドレス'
]);
自前の言語ファイルを使う方法
言語ファイル ja.php
を作成して次のようにして読み込みます。
//ja.phpがあるディレクトリを設定
Valitron\Validator::langDir(__DIR__.'/custom-lang');
//エラーメッセージの日本語化
Valitron\Validator::lang('ja');
ルールごとに設定する方法
ひとつひとつのルールにエラーメッセージを設定することもできます。ラムちゃん風にしてみました。
//ルールの後ろにチェーンする
$検証->rule('required', 'name')->message('{field}の入力は必須だっちゃ');
//さらにフィールド名を設定することも可能
$検証->rule('required', 'name')->message('{field}の入力は必須だっちゃ')->label('名前');
ルールの適用方法いろいろ
ここまで、rule()
メソッドでひとつずつルールを適用してきました。まとめてルールを適用するメソッド rules()
や mapFieldsRules()
を使う方法もあります。
ルールを配列にまとめる
$ルール = [
'required' => ['name','email'],
'email' => 'email',
'lengthMin' => [['email', 5]]
];
$検証->rules($ルール);
$検証->validate();
フィールドベースでルールを適用する
$ルール = [
'name' => 'required',
'email' => ['required', 'email', ['lengthMin', 5]]
];
$検証->mapFieldsRules($ルール);
$検証->validate();
あとがき
いかがでしたか。こんな便利なライブラリがあるなら、毎日バリデーションしたくなっちゃいますね(どういうこと)。
でわでわ
コメント