環境
Laravel v8
問題
以下のように電話番号をブロックごとに分けて管理しているとします。
tel1 - tel2 - tel3
今回の例ではこの3つのフィールドを合わせて11桁までにするといったバリデーションをかけたいとします。
その場合、3つのフィールドを一つのものとして扱う必要がありますが、Laravelの標準バリデーションルールにはそのようなものに対応する方法はありません。
解決法
方針
- リクエストクラス内で三つのフィールドをくっつけた値を追加する。
- 追加された値に対してrules配列の中で適応したいルールを記述する。
実装
リクエストクラス
validationData メソッドをオーバーライドし、リクエストがバリデーションされる直前に3つの値をくっつけて新たな値を作り、それをマージするといった段取りです。
public function attributes()
{
return [
"tel_all" => "電話番号",
];
}
/**
* @inheritDoc
*/
public function validationData()
{
$this->addTelAll();
return parent::validationData();
}
/**
* To validate for whole tel number
*/
private function addTelAll()
{
$tel1 = $this->request->get('tel1');
$tel2 = $this->request->get('tel2');
$tel3 = $this->request->get('tel3');
$telAll = $tel1 . $tel2 . $tel3;
$this->merge([
'tel_all' => $telAll,
]);
}
public function rules()
{
$rules = [
'tel_all' => 'required|numeric|digits_between:1,11',
];
return $rules;
}
参考