バリデーター
composerには多くのバリデーターがあり、直接使用できます。例えば:
top-think/think-validate
respect/validation
バリデーター top-think/think-validate
説明
ThinkPHP公式バリデーター
プロジェクトアドレス
https://github.com/top-think/think-validate
インストール
composer require topthink/think-validate
クイックスタート
新規作成 app/index/validate/User.php
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
protected $message = [
'name.require' => '名称は必須です',
'name.max' => '名称は25文字以内でなければなりません',
'age.number' => '年齢は数字でなければなりません',
'age.between' => '年齢は1から120の間でなければなりません',
'email' => 'メール形式が無効です',
];
}
使用方法
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
注意
webmanではthink-validateのValidate::rule()
メソッドはサポートされていません。
バリデーター workerman/validation
説明
プロジェクトは https://github.com/Respect/Validation の日本語版です。
プロジェクトアドレス
https://github.com/walkor/validation
インストール
composer require workerman/validation
クイックスタート
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use support\Db;
class IndexController
{
public function index(Request $request)
{
$data = v::input($request->post(), [
'nickname' => v::length(1, 64)->setName('ニックネーム'),
'username' => v::alnum()->length(5, 64)->setName('ユーザー名'),
'password' => v::length(5, 64)->setName('パスワード')
]);
Db::table('user')->insert($data);
return json(['code' => 0, 'msg' => 'ok']);
}
}
jQueryでアクセスする
$.ajax({
url : 'http://127.0.0.1:8787',
type : "post",
dataType:'json',
data : {nickname:'トム', username:'tom cat', password: '123456'}
});
得られる結果:
{"code":500,"msg":"ユーザー名はアルファベット(a-z)と数字(0-9)のみを含むことができます"}
説明:
v::input(array $input, array $rules)
はデータの検証と収集に使用され、データの検証に失敗した場合はRespect\Validation\Exceptions\ValidationException
例外をスローします。検証が成功すると、検証されたデータ(配列)が返されます。
業務コードが検証例外をキャッチしない場合、webmanフレームワークは自動的に例外をキャッチし、HTTPリクエストヘッダーに基づいてjsonデータ(類似の{"code":500, "msg":"xxx"}
)または通常の例外ページを返します。返却形式が業務要件に合わない場合、開発者は自分でValidationException
例外をキャッチして必要なデータを返すことができます。以下の例のように:
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\ValidationException;
class IndexController
{
public function index(Request $request)
{
try {
$data = v::input($request->post(), [
'username' => v::alnum()->length(5, 64)->setName('ユーザー名'),
'password' => v::length(5, 64)->setName('パスワード')
]);
} catch (ValidationException $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
}
}
Validator 機能ガイド
use Respect\Validation\Validator as v;
// 単一ルールの検証
$number = 123;
v::numericVal()->validate($number); // true
// 複数ルールのチェーン検証
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// 最初の検証失敗の理由を取得
try {
$usernameValidator->setName('ユーザー名')->check('alg anet');
} catch (ValidationException $exception) {
echo $exception->getMessage(); // ユーザー名はアルファベット(a-z)と数字(0-9)のみを含むことができます
}
// すべての検証失敗の理由を取得
try {
$usernameValidator->setName('ユーザー名')->assert('alg anet');
} catch (ValidationException $exception) {
echo $exception->getFullMessage();
// 次のように表示されます
// - ユーザー名は以下の規則を満たす必要があります
// - ユーザー名はアルファベット(a-z)と数字(0-9)のみを含むことができます
// - ユーザー名は空白を含むことができません
var_export($exception->getMessages());
// 次のように表示されます
// array (
// 'alnum' => 'ユーザー名はアルファベット(a-z)と数字(0-9)のみを含むことができます',
// 'noWhitespace' => 'ユーザー名は空白を含むことができません',
// )
}
// カスタムエラーメッセージ
try {
$usernameValidator->setName('ユーザー名')->assert('alg anet');
} catch (ValidationException $exception) {
var_export($exception->getMessages([
'alnum' => 'ユーザー名はアルファベットと数字のみを含むことができます',
'noWhitespace' => 'ユーザー名は空白を含むことができません',
'length' => 'lengthが規則に従っているため、このメッセージは表示されません'
]));
// 次のように表示されます
// array(
// 'alnum' => 'ユーザー名はアルファベットと数字のみを含むことができます',
// 'noWhitespace' => 'ユーザー名は空白を含むことができません'
// )
}
// オブジェクトの検証
$user = new stdClass;
$user->name = 'アレクサンドル';
$user->birthdate = '1987-07-01';
$userValidator = v::attribute('name', v::stringType()->length(1, 32))
->attribute('birthdate', v::date()->minAge(18));
$userValidator->validate($user); // true
// 配列の検証
$data = [
'parentKey' => [
'field1' => 'value1',
'field2' => 'value2',
'field3' => true,
]
];
v::key(
'parentKey',
v::key('field1', v::stringType())
->key('field2', v::stringType())
->key('field3', v::boolType())
)
->assert($data); // check()またはvalidate()でも使用できます
// オプション検証
v::alpha()->validate(''); // false
v::alpha()->validate(null); // false
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true
// 否定ルール
v::not(v::intVal())->validate(10); // false
Validator の3つのメソッド validate()
check()
assert()
の違い
validate()
はブール値を返し、例外をスローしません
check()
は検証に失敗すると例外をスローし、$exception->getMessage()
で最初の検証失敗の理由を取得します
assert()
は検証に失敗すると例外をスローし、$exception->getFullMessage()
で全ての検証失敗の理由を取得できます
よく使われる検証ルールのリスト
Alnum()
文字と数字のみを含む
Alpha()
文字のみを含む
ArrayType()
配列タイプ
Between(mixed $minimum, mixed $maximum)
入力が他の2つの値の間にあるかどうかを検証します。
BoolType()
ブール型であるかどうかを検証します。
Contains(mixed $expectedValue)
入力が特定の値を含むかどうかを検証します。
ContainsAny(array $needles)
入力が少なくとも1つの定義された値を含むかどうかを検証します。
Digit()
入力が数字のみを含むかどうかを検証します。
Domain()
有効なドメインかどうかを検証します。
Email()
有効なメールアドレスかどうかを検証します。
Extension(string $extension)
サフィックスを検証します。
FloatType()
浮動小数点型であるかどうかを検証します。
IntType()
整数型であるかどうかを検証します。
Ip()
ip アドレスであるかどうかを検証します。
Json()
json データであるかどうかを検証します。
Length(int $min, int $max)
長さが与えられた範囲内にあるかどうかを検証します。
LessThan(mixed $compareTo)
長さが与えられた値より小さいかどうかを検証します。
Lowercase()
小文字であるかどうかを検証します。
MacAddress()
mac アドレスであるかどうかを検証します。
NotEmpty()
空でないかどうかを検証します。
NullType()
null であるかどうかを検証します。
Number()
数字であるかどうかを検証します。
ObjectType()
オブジェクトであるかどうかを検証します。
StringType()
文字列型であるかどうかを検証します。
Url()
url であるかどうかを検証します。
その他の検証ルールについては、https://respect-validation.readthedocs.io/en/2.0/list-of-rules/を参照してください。