Laravel の Validator に全角・半角対応の文字数チェックのルールを追加する

Laravel 5.5 の Validator は、フォームの入力値などのチェックにとても便利ですが、文字数チェックをしてくれる max ルールは、全角文字を1文字としてカウントするので、全角を2文字としてカウントする文字数チェックのルールがありません。

そこで、Validator に新しいルールを追加します。

Validator ルールの拡張

新しいルールの追加は、Validator の extend メソッドを使います。ルール名を max_width として、指定した文字数を超える場合にエラーになるように拡張します。評価対象の値 ($value) は mb_strwidth 関数で文字数をカウントします。また、指定した文字数は引数配列 ($parameters)に入ってきます。

引数は一つなので $parameters[0] と比較し、最大値以下であれば、ルールに適合するので true を、最大値を超えている場合は false を返します。

エラーメッセージに指定した文字数を入れたいので、$validator の addReplacer メソッドを使って、エラーメッセージ内の :max を指定した文字数に置き換えます。

Validator::extend('max_width', function ($attribute, $value, $parameters, $validator) {
    $validator->addReplacer('max_width', function ($message, $attribute, $rule, $parameters) {
        return str_replace([':max'], $parameters, $message);
    });
    return mb_strwidth($value) < = $parameters[0];
});

拡張するコードは、ルールを使う前であればどこでも構いませんが、app/AppServiceProvider.php の boot 関数に記述すると、アプリケーションのどこでも使えるようになります。

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('max_width', function ($attribute, $value, $parameters, $validator) {
            $validator->addReplacer('max_width', function ($message, $attribute, $rule, $parameters) {
                return str_replace([':max'], $parameters, $message);
            });
            return mb_strwidth($value) < = $parameters[0];
        });
…

エラーメッセージの追加

Validator のエラーメッセージは resource/lang にある各言語フォルダーに validation.php に書かれているので、追加した max_width ルールに適合しなかった場合のエラーメッセージを追加します。

'max_width' => 'The :attribute may not be greater than :max characters.',

max ルールと同じメッセージにしています。

:attribute はキーが、:max には指定した文字数が置きかわります。

全角・半角対応の文字数チェックのルールの使い方

max_width を使ったルールは、ルール配列のキーにチェックする変数配列のキーを、ルール配列の値に max_width とコロン (:)、最大文字数を指定します。


use Validator;

$requests['value'] = '...';
$rules['value'] = 'max_width:20';
$validator = Validator::make($requests, $rules);

もちろん、Validator なのでパイプ (|) を使って、複数のルールを指定できます。

$rules['value'] = 'nullable|max_width:50';

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です