LoginSignup
1
0

More than 1 year has passed since last update.

Laravelのカスタムバリデーションエラーメッセージでも翻訳した:otherを使いたいとき

Last updated at Posted at 2021-11-10

やりたいこと

カスタムバリデーターのエラーメッセージに
required_ifやrequired_unlessのように、他のフィールド名を含めたい。
その際、翻訳したフィールド名を使いたい。

翻訳ファイル

resources/lang/ja/validation.php
return [
  // 略
  'required_if'          => ':otherが:valueの場合、:attributeも指定してください。',
  'required_unless'      => ':otherが:valuesでない場合、:attributeを指定してください。',
  // 略
  'required_if_not_false' => ':otherを指定する場合は、:attributeも指定してください。', // <--追加

  'attributes' => [
    'field1'=>'フィールド1',
    'field2'=>'フィールド2',
    //略
  ]
];

自作のバリデータを追加

app/Providers/AppServiceProvide.php
    public function boot()
    {
        /**
         * !empty(other_field)の時だけ!empty()
         */
        //ルール
        Validator::extendImplicit(
            'required_if_not_false',
            [\App\Validators\SampleValidator::class, 'validateRequiredIfNotFalse'] //実装はクロージャでもなんでもよい
        );

        //カスタムメッセージ
    //lang/ja/validation.phpのrequired_if_not_falseの文章に対してクロージャが実行される
        Validator::replacer(
            'required_if_not_false',
            function ($message, $attribute, $rule, $parameters, $validator) {
                //getTranslator()でvalidator.php翻訳ファイルのattributeを引っ張ってきて突き合わせる
                return str_replace(':other', \Arr::get($validator->getTranslator()->get('validation.attributes'), $parameters[0]), $message);
            }
        );
    }

Ruleクラス でtrans()を使う時も、同様に自前で置換する必要がある。

Ruleクラスでmessage()の参考
trans('validation.required_if_not_false', ['other'=>'ここに翻訳したフィールド名が入るようにする'])

実際にバリデーションで使うとき

app/Http/Requests/SampleRequestクラスの例
public function rules()
{
  return [
    'field2' => [
      'required_if_not_false:field1'
    ]
  ];
}

ソースを深追いしたらもうちょっといい方法がありそうな気もする(translator周りはあまり詳しくないので・・・)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0