【PHP】ピュアPHPでValidatorを使うライブラリ

Laravel

前回書いた記事を基に、

ライブラリとして機能を追加し、Composerでインストールできるようにしました。

GitHub - macocci7/purephp-validation: illuminate/validation wrapper for pure php
illuminate/validation wrapper for pure php. Contribute to macocci7/purephp-validation development by creating an account...

Passwordルールオブジェクト、Fileルールオブジェクトを使って、パスワードやファイルのバリデーションができるようになっています。

以下、使い方を記します。

前提条件

  • PHP8.2以降インストール済
  • Composerインストール済

インストール

プロジェクトフォルダのコマンドプロンプト上で次のコマンドを実行します。

composer require macocci7-purephp-validation

サンプルコード

パッケージ内のサンプルコードをコピーして使ってみましょう。

cp  -r vendor/macocci7/purephp-validation/examples/ ./
cd examples/

まずは「BasicUsage.php」を開いて中を見てみましょう。

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use Macocci7\PurephpValidation\ValidatorFactory as Validator;

// Input
$user = [
    'name' => 'fo',
    'email' => 'foo',
    'password' => 'pass',
];

// Valiation Rules
$rules = [
    'name' => 'required|string|min:3|max:10',
    'email' => 'required|string|email:rfc,dns',
    'password' => 'required|string|min:8|max:16',
];

// Validation
$validator = Validator::make($user, $rules);

// Checking Result
if ($validator->fails()) {
    var_dump($validator->errors()->messages());
} else {
    echo "🎊 Passed 🎉" . PHP_EOL;
}

「ValidatorFactory」をエイリアス「Validator」で使えるようにしています。

use Macocci7\PurephpValidation\ValidatorFactory as Validator;

$validator = Validator::make($user, $rules);

「Illuminate\Validation\Validator」のインスタンスが生成されて返るようになっています。

あとはLaravelのValidatorの使い方を踏襲するだけです。

バリデーションルールは次のようになっています。

$rules = [
    'name' => 'required|string|min:3|max:10',
    'email' => 'required|string|email:rfc,dns',
    'password' => 'required|string|min:8|max:16',
];

「name」必須、文字列、3文字以上、10文字以下

「email」必須、文字列、email形式(RFC、DNSチェック)

「password」必須、文字列、8文字以上、16文字以下

バリデーションルールの詳細は公式ドキュメントを参照してください。

▼公式(英語)

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

▼Readouble(日本語翻訳版)

11.x バリデーション Laravel

ルール違反があったかどうかは

$validator->fails()

で検出できます。

$validator->errors()->messages()

でエラーメッセージを配列で取得できます。

実行してみましょう。

バリデーションのエラーメッセージが表示されました。

「name」→「3文字以上ないとだめ」

「email」→「有効なメールアドレスでないとだめ」

「password」→「8文字以上ないとだめ」

となっています。

では、バリデーションを通過するように入力値を修正してみましょう。

// Input
$user = [
    'name' => 'foo',
    'email' => 'foo@macocci7.net',
    'password' => 'password',
];

実行してみます。

バリデーションを通過しました。

言語設定と言語フォルダ設定

バリデーションメッセージはデフォルト英語ですが、

日本語版も用意されています。

Validator::lang('ja');

$validator = Validator::make($data, $rules);

とすることで日本語メッセージにすることができます。

この日本語メッセージは、

「vendor/macocci7/purephp-validation/src/lang/ja/validation.php」

内に定義されているものです。

「lang」フォルダは好きな場所に設置でき、

「validation.php」の内容を編集することで、

メッセージを変更することができます。

▼設定変更

// 「lang」を設置したフォルダを指定
Validator::translationsRootPath(__DIR__ . '/');

Validator::lang('ja');

$validator = Validator::make($user, $rules);

▼実行結果

Passwordルールオブジェクト

Passwordルールオブジェクトを使うことで、

パスワード形式のルール設定をメソッドで指定することができます。

use Macocci7\PurephpValidation\Rules\PasswordWrapper as Password;

$validator = Validator::make(
    data: [ 'password' => 'pass' ],
    rules: [
        'password' => [
            'required',
            Password::min(8)        // 8文字以上
                ->max(16)           // 16文字以下
                ->letters()         // アルファベットを1文字以上
                ->mixedCase()       // 大文字1文字以上、小文字1文字以上
                ->numbers()         // 数字1文字以上
                ->symbols()         // 記号1文字以上
                ->uncompromised(),  // 漏洩していないパスワード
        ],
    ],
);

「uncompromised()」メソッドについては、公式ドキュメントによると

In addition, you may ensure that a password has not been compromised in a public password data breach leak using the uncompromised method:

Password::min(8)->uncompromised()

Internally, the Password rule object uses the k-Anonymity model to determine if a password has been leaked via the haveibeenpwned.com service without sacrificing the user’s privacy or security.

Validating Passwords | Validation – Laravel 11.x – The PHP Framework For Web Artisans

▼自動翻訳

さらに、公開パスワードのデータ漏洩時にパスワードが侵害されていないことを、侵害されない方法を使用して確認できます。

Password::min(8)- uncompromized()

内部的には、パスワード ルール オブジェクトは k-匿名性モデルを使用して、ユーザーのプライバシーやセキュリティを犠牲にすることなく、パスワードが haveibeenpwned.com サービス経由で漏洩したかどうかを判断します。

とのことです。

▼実行結果

「8文字以上でないとだめ。」

「大文字1文字上、小文字1文字以上ないとだめ。」

「記号1文字以上ないとだめ。」

「数字1文字以上ないとだめ。」

となっています。

Fileルールオブジェクト

Fileルールオブジェクトを使うことで、

ファイルの形式、サイズ、画像の解像度のチェック等を

ルール指定することができます。

use Illuminate\Validation\Rule;
use Macocci7\PurephpValidation\Rules\FileWrapper as File;
use Symfony\Component\HttpFoundation\File\File as SymfonyFile;

$path = __DIR__ . '/../storage/uploaded/foo.jpg';

$validator = Validator::make(
    data: [
        'photo' => new SymfonyFile($path),  // ファイルオブジェクト生成
    ],
    rules: [
        'photo' => [
            File::image()               // 画像形式
                ->min(10)               //  10KB以上
                ->max(144)              // 144KB以下
                ->dimensions(
                    Rule::dimensions()
                    ->maxWidth(200)     // 横200pix以下
                    ->maxHeight(300)    // 縦300pix以下
                ),
    ],
);

▼実行結果

messagesとattributesのカスタマイズ

このライブラリは「Illuminate\Validation\Validator」のラッパーなので、

公式ライブラリと同様に、

バリデーションメッセージの定義と項目名をカスタマイズできます。

$validator = Validator::make(
    data: [
        'login' => 'hoge',
        'password' => 'pass',
    ],
    rules: [
        'login' => 'required|email:rfc',
        'password' => 'required|string|min:8|max:16',
    ],
    messages: [
        'required' => ':attribute が欲しいの💖',
        'email' => ':attribute はメアドにしてね💖',
        'string' => ':attribute は文字列にしてね💖',
        'password.min' => ':attribute は :min 文字以上でね💖',
        'password.max' => ':attribute は :max 文字以下でね💖',
    ],
    attributes: [
        'login' => 'ログインID',
        'password' => 'パスワード',
    ],
);

▼実行結果

このような感じになります。

※2024/04/28追記:

オブジェクトのインスタンス判定ルールを追加しました。

コメント

タイトルとURLをコピーしました