Laravelのバリデーションで変数の使い方
なぜ気になったのか
ECサイトを制作中に、商品をカートに追加する際にデータベース上の商品の在庫数以上の数を買い物かごに入れることができてしまう。
バリデーションを利用するときに商品の在庫数はそれぞれ異なるので固定の値は設定できない。
商品ごとにデータベースの商品の在庫数をMAXとしてそれ以上買い物かごに入れる時にはバリデーションを発動してエラーメッセージを出したかったから。
まず試したこと
$data['test'] = 5;
$max = 10;
$validator = Validator::make($data, [
'test' => 'max:$max',
]);
これでは全くバリデーションは効かず
ではどうするべきか。
PHPで変数を文字列内で展開したい場合は変数を{ }
(波括弧)で囲って書くことで、文字列の中に変数があること明示している。
ただし、文字列の中に変数を入れる場合は、文字列を必ず" "
(ダブルクォーテーション)で囲む必要がある。
詳しくはPHPマニュアル
これを踏まえて下記で実行してみました。
$data['test'] = 5;
$max = 10;
$validator = Validator::make($data, [
'test' => "max:{$max}",
]);
しかしこれでもうまくいきませんでした。
何が必要なのか。
Laravelバリデーションのmin
max
size
などを利用するときは指定された値を判断する。
そのため、上記の書き方では文字列と判断され値は文字長を判断する。
詳しくはLaravel5.5 バリデーション
在庫数などの数値を判断する場合にはmax
の前に整数値であるバリデーションが必要なためinteger
を記述する必要がある。
これを踏まえると下記の書き方になる。
$data['test'] = 5;
$max = 10;
$validator = Validator::make($data, [
'test' => "integer|max:{$max}",
]);
細かい部分ですが、つまずいたポイントなので復習がてらにまとめてみました。