bugfix> php > 投稿

さて、私はここで非常に困難な状況に陥っており、すでに存在する重要なものが欠けているか、Laravelがそれを今のところ達成する方法を提供していないと思います。 メッセージ内で置換するカスタムプレースホルダーを使用して、カスタム検証エラーメッセージを指定したいと思います。それに関する問題:私は regex を使用しています検証ルール、これについてLaravelドキュメント 不要なセパレータの動作を避けるために、配列に渡したほうがよいことを明示的に指摘しています。状況は次のとおりです: name.regex を検証するためのグローバルな多言語メッセージを指定したい 、私はそうしました:

'custom' => [
    'name' => [
        'regex' => 'The :attribute must corespond to the given format: :format!'
    ]
]

ご覧のように、カスタムプレースホルダー :format を配置しましたそのメッセージには、 name さまざまなクラスの属性さまざまな正規表現に一致させます。そのため、検証に沿って、指定された各正規表現の人間が読み取れるカスタム説明を(パラメーターとして)入力できるようにしたいと思います。 だから私は私のコントローラーで次のことをしています:

$input = Input::all();
$validator = Validator::make($input, [
        'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u']
    ]);

私も Validator::replacer() を持っています私の AppServiceProvider.php の方法 :format を置き換える必要がありますメッセージ内のプレースホルダー:

Validator::replacer('regex', function($message, $attr, $rule, $parameters){
        return str_replace(':format', "I would like to be able to somehow retrieve the custom format description here, but using \$parameters[] is not an option", $message);
    });

regex の問題検証ルールでは、たとえば次のように、バリデーターでパラメーターを渡すことは実際には許可されていません。

$validator = Validator::make($input, [
        'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u,Thats my custom validator format description']
    ]);

正規表現を完全に台無しにしてしまうからです(そうするべきです)。だから私は$パラメータを使用することはできません1私の replacer() の$プレースホルダーを置き換えます。さらに、検証ルールのコンマ区切りのパラメーターとして文全体を渡す必要があるのは本当に不便です。そのため、この概念はニーズに適合しません。

ザ・ :format 値は動的であり、異なるクラスの name 全体で大きく変化しますフィールドの要件です。そのため、現在のバリデータインスタンスのプロパティとして動的多言語記述を設定する必要があります。おそらく最も便利なシナリオは次のようなものだと思いました。

$validator = Validator::make($input, [
        'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u', 'format:Current name requirements described here.']
    ]);

そして、Laravelはどういうわけかその :format を知っていますそのインスタンスのメッセージのどこかで現在のルールに置き換える必要があります。この追加パラメーターを検証ルールとして明示的に追加し、後で管理することを考えましたが、クロスルール接続を実現することはできません(言い換えると、新しい format のパラメーターを取得するにはルールとそれを regex で使用するルール)。 私はその問題にどのように取り組むべきか本当に知りません、そして、どんな助けでも大歓迎です。前もって感謝します!

追伸私はこの方法で毎回メッセージ全体を指定できることを知っています:

$input = Input::all();
$validator = Validator::make($input, [
        'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u']
    ],
[
    'name.regex' => 'My custom message here'
]);

しかし、メッセージ全体を毎回入力する必要はありません。後で他のプレースホルダー(グローバルなど)が含まれる可能性があり、 validator.php 経由で提供される多言語ベースのメッセージを使用するためです。ファイルなので、実際には :format を置き換える必要がありますのみ。

回答 2 件
  • カスタムルールを作成できます。

    php artisan make:rule CustomRegex
    
    

    次に、コンストラクターを更新して、正規表現と形式の説明の両方をサポートします。

    <?php
    namespace App\Rules;
    use Illuminate\Contracts\Validation\Rule;
    class CustomRegex implements Rule
    {
        /** @var string $attribute The attribute of we are validating. */
        public $attribute;
        /** @var string $description The description of the regex format. */
        public $description;
        /** @var string $regex The regex to validate. */
        public $regex;
        /**
         * Create a new rule instance.
         *
         * @param string $regex The regex to validate.
         * @param string $description The description of the regex format.
         * @return void
         */
        public function __construct(string $regex, string $description)
        {
            $this->regex = $regex;
            $this->description = $description;
        }
        /**
         * Determine if the validation rule passes.
         *
         * @param  string  $attribute
         * @param  mixed  $value
         * @return bool
         */
        public function passes($attribute, $value)
        {
            $this->attribute = $attribute;
            return preg_match($this->regex, $value);
        }
        /**
         * Get the validation error message.
         *
         * @return string
         */
        public function message()
        {
            return trans('validation.custom.name', [
                'attribute' => $this->attribute,
                'format' => $this->description
            ]);
        }
    }
    
    

    そして、検証するとき:

    use App\Rules\CustomRegex;
    request()->validate([
        'name' => [
            'required', new CustomRegex('/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u', 'The description of your format')
        ]
    ]);
    
    

    次に、出力メッセージは次のようになります。

    The name must corespond to the given format: The description of your format!

  • Laravel 5.6で理解できる最も簡単な方法は、クロージャーを使用することです:

    $validator = Validator::make($input, 
        [
            'name' => 
               [
                 'required',
                 function($attribute, $value, $fail) {
                     $regex = '/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u';
                     if (!preg_match($regex, $value)) {
                        return $fail('Your custom message with' .
                        $attribute . ' name and its value = ' . $value);
                     }
                 },
               ]
        ]);
    
    

    このクロージャ内に、必要なものを追加できます。読み取り可能な形式のフォームを計算して、エラーメッセージに追加できます。

あなたの答え