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';