📐
LaravelのValidationでdifferentを使用した際、重複した内容のエラーがでないようにする
概要
Laravelでデータの更新フォームのValidationを実装したときdifferentの設定の仕方を間違えて、ユーザーに重複したエラーを表示するよう実装しそうになったので、その改善をしたという内容です。
Laravelでdifferentあまり使ったことがない人が対象になります。
ちなみにdifferentとは...
LaravelのValidation ruleの一つで、フィールドが指定されたフィールドと異なった値を指定されていることをバリデートするというものです。
参考: Laravel 9.x バリデーション
環境
- php: 8.0.2
- Laravel: 9.28
要件
データの更新フォームに入力された機器番号Aと機器番号Bにそれぞれ重複がない状態を正としたいというものです。例えば下記のようなデータとしましょう。
Validationにひっかかるパターン
機器番号 | 入力された値 |
---|---|
machine_id_a | 0000 |
machine_id_b | 0000 |
Validationにひっかからないパターン
機器番号 | 入力された値 |
---|---|
machine_id_a | 0000 |
machine_id_b | 1234 |
実装方法
最初こう書いてました。
Bad...
class UpdateRequest extends FormRequest
{
public function rules()
{
return [
'machine_id_a' => [
'different:machine_id_b',
],
'machine_id_b' => [
'different:machine_id_a',
],
];
}
}
Validationに引っかかるパターンの入力値
が送信された場合、エラーの出力結果はこうなります。
1. machine_id_aとmachine_id_bには、異なるものを指定してください。
2. machine_id_bとmachine_id_aには、異なるものを指定してください。
人間が受け取る意味合いとしては同じものが出力されてしまいました。
Good!
というわけで下記のように書き直しました。
class UpdateRequest extends FormRequest
{
public function rules()
{
return [
'machine_id_a' => [
'different:machine_id_b',
],
];
}
}
Validationに引っかかるパターンの入力値
が送信された場合、エラーの出力結果はこうなります。
1. machine_id_aとmachine_id_bには、異なるものを指定してください。
これでユーザーに重複した内容のエラーが表示されなくなりました。
まとめ
differentを使うときは、重複してほしくない値のどちらか一方にのみdifferentをつけましょう。
Discussion