シンプルで使いやすい!バリデーションライブラリ「Valitron」の使い方

こんにちは、コバヤシです。

今回はバリデーションのライブラリである「Valitron」の使い方について書きたいと思います。

vlucas/valitronとは

  • シンプル
  • 最小限
  • エレガント
  • 依存関係なし

をうたっているだけあって、簡単で使いやすいバリデーションライブラリです。

github.com

実体のファイルはたった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)
email $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の方が直感的で使いやすいと感じました。

github.com

他にも色々なメソッドや記述方法があるので、興味を持たれた方はドキュメントを読んでみてください。