やりたいこと
カスタムバリデーターのエラーメッセージに
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周りはあまり詳しくないので・・・)