こんにちは、コバヤシです。
今回はバリデーションのライブラリである「Valitron」の使い方について書きたいと思います。
vlucas/valitronとは
- シンプル
- 最小限
- エレガント
- 依存関係なし
をうたっているだけあって、簡単で使いやすいバリデーションライブラリです。
実体のファイルはたった1ファイルと、とてもシンプルですが
独自バリデーションルールも作成できるので、様々なバリデーションに対応出来ると思います。
弊社でも自作のライブラリを使用していましたが、今では「Valitron」に切り替えています。
インストール
composerからインストールをします。
php composer.phar require vlucas/valitron
使い方
以下のように使用します。(公式のサンプルをそのまま使っています)
<?php $v = new Valitron\Validator($_POST); // 検証する値を引数にインスタンスを生成します $v->rule('required', ['name', 'email']); // ルールを設定します $v->rule('email', 'email'); if($v->validate()) { // 検証 echo "Yay! We're all good!"; } else { // Errors print_r($v->errors()); // エラー }
エラーメッセージの日本語化
そのまま使うと、エラーメッセージは英語なので日本語化します。
<?php Valitron\Validator::lang('ja'); // 追加 $v = new Valitron\Validator($_POST); $v->rule('required', ['name', 'email']); $v->rule('email', 'email'); if($v->validate()) { // 検証 echo "Yay! We're all good!"; } else { // Errors print_r($v->errors()); }
ただ、このままだとメッセージ部分は日本語になりますが、項目名に変数名がそのまま使われます。 なので、以下のようにラベルで日本語項目名を指定してあげます。
<?php Valitron\Validator::lang('ja'); $v = new Valitron\Validator($_POST); //項目名を指定します $v->labels([ 'name' => '名前', 'email' => 'メールアドレス' ]); $v->rule('required', ['name', 'email']); $v->rule('email', 'email'); if($v->validate()) { // 検証 echo "Yay! We're all good!"; } else { // Errors print_r($v->errors()); }
又、独自の言語ファイルを使用したい場合は、ディレクトリを作成し「Valitron\Validator::langDir」で指定します。
そしてその中に「ja.php」を作成し、メッセージを記述していきます。
デフォルトの言語ファイルが/vendor/vlucas/valitron/lang/にあるので参考にすると良いと思います。
<?php Valitron\Validator::langDir(__DIR__.'/lang'); Valitron\Validator::lang('ja');
カスタムエラーメッセージ
エラーメッセージをカスタマイズしたい場合は、以下のようにします。
<?php $v->rule('required', 'pref');->message('{field}を選択してください');
{field} の部分には項目名が入ります。
標準で使用できるルール
標準で使用できるバリデーションルールをまとめてみました。
バリデーション名 | 使用例 | 説明 |
---|---|---|
required | $v->rule('required', 'password'); | 入力必須 |
requiredWith | $v->rule('requiredWith', 'password', 'username'); | 指定したフィールドに値が入力されていた場合は入力必須 |
requiredWithout | $v->rule('requiredWithout', 'username', 'first_name’); | 指定したフィールドに値の入力が無かった場合は入力必須 |
equals | $v->rule('equals', 'password', 'confirmPassword'); | 指定した別のフィールドと値が一致するか |
different | $v->rule('different', 'username', 'password'); | 指定した別のフィールドと値が異なるか |
accepted | $v->rule('accepted', 'remember_me'); | yes, on, 1, trueの値であるか |
numeric | $v->rule('numeric', 'amount'); | 数値であるか |
integer | $v->rule('integer', 'age'); | 整数であるか |
boolean | $v->rule('boolean', 'remember_me'); | 真偽値であるか |
array | $v->rule('array', 'user_notifications'); | 配列かどうか |
listContains | $v->rule('listContains', 'color', 'yellow'); | 指定された値を含んでいるか |
length | $v->rule('length', 'username', 10); | 文字数が指定した数と同じか |
lengthBetween | $v->rule('lengthBetween', 'username', 1, 10); | 文字数が指定した範囲内か |
lengthMin | $v->rule('lengthMin', 'username', 5); | 文字数が指定した数以上か |
lengthMax | $v->rule('lengthMax', 'username', 10); | 文字数が指定した数以下か |
min | $v->rule('min', 'age', 18); | 最小 |
max | $v->rule('max', 'age', 12); | 最大 |
in | $v->rule('in', 'color', ['blue', 'green', 'red', 'purple']); | 指定された配列に値が含まれるか |
notIn | $v->rule('notIn', 'color', ['blue', 'green', 'red', 'purple']); | 指定された配列に値が含まれないか |
ip | $v->rule('ip', 'user_ip'); | 有効なIPアドレスかどうか(IPv4、IPv6) |
ipv4 | $v->rule('ipv4', 'user_ip'); | 有効なIPアドレスかどうか(IPv4) |
ipv6 | $v->rule('ipv6', 'user_ip'); | 有効なIPアドレスかどうか(IPv6) |
$v->rule('email', 'user_email'); | メールアドレスの形式か | |
emailDNS | $v->rule('emailDNS', 'user_email'); | 有効なDNSレコードまたは任意のタイプの有効な電子メールアドレスか |
url | $v->rule('url', 'website'); | URLの形式か |
urlActive | $v->rule('urlActive', 'website'); | 有効なURLか |
alpha | $v->rule('alpha', 'username'); | アルファベットのみであるか |
alphaNum | $v->rule('alphaNum', 'username'); | アルファベットと数字のみであるか |
ascii | $v->rule('ascii', 'username'); | ASCII文字のみであるか |
slug | $v->rule('slug', 'username'); | 値がURLスラグ文字(a-z、0-9、-、_)のみで構成されているか |
regex | $v->rule('regex', 'username', '/^[a-zA-Z0-9]{5,10}$/'); | 指定した正規表現のパターンに一致するか |
date | $v->rule('date', 'created_at'); | 有効な日付か |
dateFormat | $v->rule('dateFormat', 'created_at', 'Y-m-d'); | 指定した日付形式の有効な日付か |
dateBefore | $v->rule('dateBefore', 'created_at', '2019-10-13'); | 指定した日付以前の有効な日付か |
dateAfter | $v->rule('dateAfter', 'created_at', '2019-10-13'); | 指定した日付以降の有効な日付か |
contains | $v->rule('contains', 'username', 'man'); | 指定した文字列が、値の中にあるか |
subset | $v->rule('subset', 'colors', ['green', 'blue', 'orange']); | 値が、指定の配列にすべて含まれるか |
containsUnique | $v->rule('containsUnique', 'colors'); | 値が配列であり、配列内の値が一意であるか |
creditCard | $v->rule('creditCard', 'credit_card'); $v->rule('creditCard', 'credit_card', ['visa']); |
クレジットカードの番号かどうか オプションでカード会社の指定も可能 Visa 「visa」, Mastercard 「mastercard」, Dinersclub 「dinersclub」, American Express 「amex」 or Discover 「discover」 |
instanceOf | $v->rule('instanceOf', 'date', \DateTime); | 指定したクラスのインスタンスかどうか |
optional | $v->rule('optional', 'username'); | データに存在しない場合は、検証を行わない |
arrayHasKeys | $v->rule(['arrayHasKeys', 'address', ['name', 'street', 'city']); | 値が配列かつ指定した配列にキー値がすべて含まれるか |
配列のバリデーション
配列のバリデーションも「*」を使用することで可能です。
<?php $v = new Valitron\Validator(['users' => [['name' => 'tom'], ['name' => 'Tony']]]); $v->rule('required', 'users.*.name');
ただし、エラーがあったのが何番目のデータまでかは判断できないのが残念です。 Laravelのように*の部分が添え字に置き換えられません。
<?php Array ( [users.*.name] => Array ( [0] => 名前 を入力してください ) )
カスタムバリデーションの作り方
カスタムバリデーションを作る場合はaddRuleを使用します。
<?php Valitron\Validator::addRule('alwaysFail', function($field, $value, array $params, array $fields) { return false; }, 'エラーですよ');
上記の例では、ruleでalwaysFailを使用すれば作成したバリデーションでチェックが行われます。
<?php $v->rule('alwaysFail', 'foo');
又、カスタムバリデーションを作成するまでもない場合は、ruleで無名関数を使用することでも対応できます。
<?php $v->rule(function($field, $value, $params, $fields) { return false; }, 'foo')->message('エラーですよ');
まとめ
簡単にバリデーションが実装できることが判っていただけたかと思います。
有名なバリデーションのライブラリでは「Respect/Validation」があるのですが、自分的には使い勝手がイマイチ。 Valitronの方が直感的で使いやすいと感じました。
他にも色々なメソッドや記述方法があるので、興味を持たれた方はドキュメントを読んでみてください。