バリデーター

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/を参照してください

さらなる情報

訪問先 https://respect-validation.readthedocs.io/en/2.0/