カスタムバリデーションのクラスを追加するには、サービスプロバイダーで次のようにクラスを登録します。

追加するクラスの名前や位置はどのようなものでもかまいせん。ここでは、ディレクトリパス app/Services に CustomVaidator.phpを作成し、AppServiceProvider に登録することにします。

app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;
 
use Validator;
use Illuminate\Support\ServiceProvider;
use App\Services\CustomValidator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
         Validator::resolver(function($translator, $data, $rules, $messages)
        {
            return new CustomValidator($translator, $data, $rules, $messages);
        });
    }
 
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

 

次に、標準の Validator を継承する CustomValidator を作成します。
前回 AppServiceProvier.php に直接登録したバリデーションルールを、こちらに移します。

app/Service/CustomValidator.php

<?php

namespace App\Services;

class CustomValidator extends \Illuminate\Validation\Validator 
{
    /**
     * kana
     *
     * @param string $attribute
     * @param string $value
     * @return bool
     */
     public function validateKana($attribute, $value)
     {
        // かな、半角空白、全角空白、全角記号を許可
        return preg_match("/^[ぁ-んー  !-@[-`{-~]+$/u", $value);
     }
}

こうして専用のバリデーションクラスを作成すると、それぞれのバリデーションルールは通常のメソッドとして実行できるようになり、ユニットテストの作成も容易になります。

$bool = CustomValidator::validateKana('kana', $request->get('kana'));

 

前回との重複になりますが、エラーメッセージをバリデーション言語ファイルの「Validation Language Lines」グループに追加します。

'unique' => ':attribute に指定された値はすでに存在しています',
'url'    => ':attribute のフォーマットが正しくありません',
 
// カスタムバリデーション
 
'kana'   => ':attribute は全角のひらがなで入力してください',

これでふりがなバリデーションをどこでも利用できるようになりました。

'name_kana' => 'required|kana',

次回から、このクラスにいろいろなルールを登録していきましょう。

 

ところで、ふりがなに「カタカナ」を強要するサイト設計が多いことに苛立つのは私だけでしょうか?
無駄にカタカナを入力するとIMEの辞書学習が汚れ、その後の漢字変換のリズムが崩れるのです。名簿などの入力作業をすると誰でも体験できるでしょう。

カタカナルールは昔ながらの紙文化の遺物なのでしょう。手書きならばそのほうが識別しやすいに違いないですが、電子データにその配慮は必要ありませんよね。
メルマガ購読の申し込みはこちらから。

By ymikome