駆け出しエンジニアの勉強記録

アラフォー女の未経験すぎる業界での勉強記録

カスタムバリデーション

確認用入力した値(cinfirm_my_number)が入力した個人番号(my_number)と一致しない時にバリデーションメッセージを表示させる。

vueファイル

<div>
<InputLabel for="my_number" value="個人番号" />

<TextInput 
id="my_number"   //ここの入力値と
type="text"
class="mt-1 block w-full"
v-model="form.my_number"
required
autocomplete="my_number"
/>

<InputError class="mt-2" :message="form.errors.my_number" />
</div>

<div>
<InputLabel for="confirm_my_number" value="確認用" />

<TextInput
id="confirm_my_number"  //ここの入力値が一致しているか
type="text"
class="mt-1 block w-full"
v-model="form.confirm_my_number"
required
autocomplete="confirm_my_number"
/>
// 以下に設定したエラーメッセージが表示される
<InputError class="mt-2" :message="form.errors.confirm_my_number" />
</div>


「一致確認のルールを設定するファイル」を作成するコマンド
php artisan make:rule MatchMyNumber(ファイル名)

/app/Rules/MatchMyNumber.php作成される

public function validate(string $attribute, mixed $value, Closure $fail): void
{
$otherValue = request()->input('my_number'); // $otheValueにmy_numberを代入

if ($value !== $otherValue) { // $valueにはconfirm_my_numberの値が入ってる  ※別途下記参照
$fail('確認用は個人番号と一致している必要があります。'); // 表示させたいメッセージ
}
}


リクエストファイルに

use App\Rules\MatchMyNumber; // リクエストファイルをuseする
 
public function rules(): array
{
return [
'my_number' => ['max:12'],
'confirm_my_number' => ['max:12' , new MatchMyNumber], // new ファイル名で設定
];

public function attributes() // エラーメッセージで表示させたいform名を書く
{
return [
'my_number' => 'マイナンバー',
];
}


※リクエストファイルの
'confirm_my_number' => ['max:12', new MatchMyNumber],  
で'confirm_my_number'がMatchNumberファイルのフィールド名(要はname)として設定されてて、そのフィールドに入力されたものが、ルールファイルで$valueにセットされている。