例えば、年(yyyy)、月(mm)、日(dd)でPOSTされる値を日付の有効性のチェックをしたい場合、以下のように
public function rules()
{
return [
'yyyy' => [
'required',
new DateRule(
$this->yyyy,
$this->mm,
$this->dd,
)
],
];
}
DateRuleというカスタムバリデーションを作り、yyyyのチェックに併せて有効性のチェックをしても良いが、エラーメッセージはyyyyのところに表示されることになる。
@error('yyyy')<p class="erroer_text">{{ $message }}</p>@enderror
バリデート前にPOSTされた値を加工して、その加工した値をバリデートする方法。
つまり、yyyyとmmとddを連結した値をyyyymmddとしてPOSTされたようにして、yyyymmddとしてバリデートを行い、view側でのエラー判定は、@error(‘yyyymmdd’)で行う方法。
バリデート前に何か処理をしたい場合は、リクエストクラスにprepareForValidation()を追加してそのメソッド内に処理を記述すればOK。
protected function prepareForValidation()
{
$this->merge([
'yyyymmdd' => $this->input('yyyy').
$this->input('mm').
$this->input('dd'),
]);
}
mergeメソッドで変数を追加できる。
Rules()を以下のようにする。
public function rules()
{
return [
・
・
・
'yyyymmdd' => [
new DateRule(
$this->yyyy,
$this->mm,
$this->dd,
)
],
・
・
・
];
}
エラーメッセージの表示場所は、表示したいところに以下を記述すればOK
@error('yyyymmdd')<p class="erroer_text">{{ $message }}</p>@enderror
ちなみにバリデート通過後に加工したい場合は、passedValidation()を追加して処理を記述すればOK。
protected function passedValidation()
{
$this->merge([
'zip' => $this->input('zip1').
$this->input('zip2'),
]);
}
リクエストクラスで前処理を行っておけばコントローラ側の処理がスッキリするかもしれない。