入力欄が別の期間のバリデーションをかけようと思うと
2015-3~2017-4
ではバリデーションがうまくかかるが、
2018-8~2018-6
だとエラーを吐かなかったので
バリデーションをかける前に連結させました。
誰かの参考になればと思い、残しておきます
laravel5.5でFormRequest
を使う場合コントローラの処理を実行する前にバリデーションがかかってしまうので、
先に文字列を連結させる必要がありました。
なので文字列を連結させてそれをフォームから送信させているようにしてバリデーションをかけるようにしました。
もちろん入力欄を分けなければafter
やafter_or_equal
、before
、before_or_equal
などを使えばいいのですが。。
送信前にリクエストを加工するには6.xではprepareForValidation()
メソッドを使えばいいみたいなので参考にはならないと思います
まずはこれを追加してください
use Illuminate\Validation\Validator;
その後にメインロジックを追加していきます
見ての通り、連結させて$request
に追加しています
それに伴って
protected function validationData()
{
$this->addStartOfRegisterDate();
$this->addEndOfRegisterDate();
$this->addStartOfEnrollmentDate();
$this->addEndOfEnrollmentDate();
return parent::validationData();
}
private function addStartOfRegisterDate()
{
$start_of_register_year = (string)$this->request->get('start_period_of_register_year');
if ($start_of_register_year === '') return;
$start_of_register_month = (string)$this->request->get('start_period_of_register_month');
if ($start_of_register_month === '') return;
$start_of_register_date = $start_of_register_year . '-' . $start_of_register_month;
$this->request->add(['start_of_register_date' => $start_of_register_date]);
}
private function addEndOfRegisterDate()
{
$end_of_register_year = (string)$this->request->get('end_period_of_register_year');
if ($end_of_register_year == '') return;
$end_of_register_month = (string)$this->request->get('end_period_of_register_month');
if ($end_of_register_month == '') return;
$end_of_register_date = $end_of_register_year . '-' . $end_of_register_month;
$this->request->add(['end_of_register_date' => $end_of_register_date]);
}
private function addStartOfEnrollmentDate()
{
$start_of_enrollment_year = (string)$this->request->get('start_period_of_enrollment_year');
if ($start_of_enrollment_year === '') return;
$start_of_enrollment_month = (string)$this->request->get('start_period_of_enrollment_month');
if ($start_of_enrollment_month === '') return;
$start_of_enrollment_date = $start_of_enrollment_year . '-' . $start_of_enrollment_month;
$this->request->add(['start_of_enrollment_date' => $start_of_enrollment_date]);
}
private function addEndOfEnrollmentDate()
{
$end_of_enrollment_year = (string)$this->request->get('end_period_of_enrollment_year');
if ($end_of_enrollment_year == '') return;
$end_of_enrollment_month = (string)$this->request->get('end_period_of_enrollment_month');
if ($end_of_enrollment_month == '') return;
$end_of_enrollment_date = $end_of_enrollment_year . '-' . $end_of_enrollment_month;
$this->request->add(['end_of_enrollment_date' => $end_of_enrollment_date]);
}
これによって連結された文字列が$requestに入るので、そこにバリデーションをかけるようにしましょう
'start_of_register_date' => 'nullable|before_or_equal:end_of_register_date',
'end_of_register_date' => 'nullable|after_or_equal:start_of_register_date',
'start_of_enrollment_date' => 'nullable|before_or_equal:end_of_enrollment_date',
'end_of_enrollment_date' => 'nullable|after_or_equal:start_of_enrollment_date',
これをrules()
のreturn
に追加しましょう
全体を見るとこんな感じですー
MypageUpdateRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;
class MypageUpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'birth_year' => 'nullable|integer|min:' . config('common.validate_min.birth_year') . '|max:' . config('common.validate_max.birth_year'),
'birth_month' => 'nullable|integer|min:' . config('common.validate_min.birth_month') . '|max:' . config('common.validate_max.birth_month'),
'birth_day' => 'nullable|integer|min:' . config('common.validate_min.birth_day') . '|max:' . config('common.validate_max.birth_day'),
'start_period_of_register_year' => 'nullable|string|required_with:company_name,start_period_of_register_month,end_period_of_register_month|integer|min:1969|max:date(Y)',
'start_period_of_register_month' => 'nullable|string|required_with:company_name,start_period_of_register_year,end_period_of_register_year|integer|min:1|max:12',
'start_of_register_date' => 'nullable|before_or_equal:end_of_register_date',
'end_period_of_register_year' => 'nullable|string|required_with:company_name,start_period_of_register_month,end_period_of_register_month|integer|min:1969|max:date(Y)',
'end_period_of_register_month' => 'nullable|string|required_with:company_name,end_period_of_register_year,start_period_of_register_year|integer|min:1|max:12',
'end_of_register_date' => 'nullable|after_or_equal:start_of_register_date',
'start_period_of_enrollment_year' => 'nullable|string|required_with:school_name,start_period_of_enrollment_month,end_period_of_enrollment_month|integer|min:1969|max:date(Y)',
'start_period_of_enrollment_month' => 'nullable|string|required_with:school_name,start_period_of_enrollment_year,end_period_of_enrollment_year|integer|min:1|max:12',
'start_of_enrollment_date' => 'nullable|before_or_equal:end_of_enrollment_date',
'end_period_of_enrollment_year' => 'nullable|string|required_with:school_name,start_period_of_enrollment_month,end_period_of_enrollment_month|integer|min:1969|max:date(Y)',
'end_period_of_enrollment_month' => 'nullable|string|required_with:school_name,start_period_of_enrollment_year,end_period_of_enrollment_year|integer|min:1|max:12',
'end_of_enrollment_date' => 'nullable|after_or_equal:start_of_enrollment_date',
];
}
protected function validationData()
{
$this->addStartOfRegisterDate();
$this->addEndOfRegisterDate();
$this->addStartOfEnrollmentDate();
$this->addEndOfEnrollmentDate();
return parent::validationData();
}
private function addStartOfRegisterDate()
{
$start_of_register_year = (string)$this->request->get('start_period_of_register_year');
if ($start_of_register_year === '') return;
$start_of_register_month = (string)$this->request->get('start_period_of_register_month');
if ($start_of_register_month === '') return;
$start_of_register_date = $start_of_register_year . '-' . $start_of_register_month;
$this->request->add(['start_of_register_date' => $start_of_register_date]);
}
private function addEndOfRegisterDate()
{
$end_of_register_year = (string)$this->request->get('end_period_of_register_year');
if ($end_of_register_year == '') return;
$end_of_register_month = (string)$this->request->get('end_period_of_register_month');
if ($end_of_register_month == '') return;
$end_of_register_date = $end_of_register_year . '-' . $end_of_register_month;
$this->request->add(['end_of_register_date' => $end_of_register_date]);
}
private function addStartOfEnrollmentDate()
{
$start_of_enrollment_year = (string)$this->request->get('start_period_of_enrollment_year');
if ($start_of_enrollment_year === '') return;
$start_of_enrollment_month = (string)$this->request->get('start_period_of_enrollment_month');
if ($start_of_enrollment_month === '') return;
$start_of_enrollment_date = $start_of_enrollment_year . '-' . $start_of_enrollment_month;
$this->request->add(['start_of_enrollment_date' => $start_of_enrollment_date]);
}
private function addEndOfEnrollmentDate()
{
$end_of_enrollment_year = (string)$this->request->get('end_period_of_enrollment_year');
if ($end_of_enrollment_year == '') return;
$end_of_enrollment_month = (string)$this->request->get('end_period_of_enrollment_month');
if ($end_of_enrollment_month == '') return;
$end_of_enrollment_date = $end_of_enrollment_year . '-' . $end_of_enrollment_month;
$this->request->add(['end_of_enrollment_date' => $end_of_enrollment_date]);
}
public function messages()
{
return [
'birth_year.integer' => '正しい年を選択してください',
'birth_year.max' => '正しい年を選択してください',
'birth_year.min' => '正しい年を選択してください',
'birth_year.required_with' => '月と日も選択してください',
'birth_month.integer' => '正しい月を選択してください',
'birth_month.max' => '正しい月を選択してください',
'birth_month.min' => '正しい月を選択してください',
'birth_month.required_with' => '年と日も選択してください',
'birth_day.integer' => '正しい日を選択してください',
'birth_day.max' => '正しい日を選択してください',
'birth_day.min' => '正しい日を選択してください',
'birth_day.required_with' => '月と日も選択してください',
'start_period_of_register_year.integer' => '在籍期間を正しく選択してください',
'start_period_of_register_year.max' => '在籍期間を正しく選択してください',
'start_period_of_register_year.min' => '在籍期間を正しく選択してください',
'start_period_of_register_year.required_with' => '年も選択してください',
'start_period_of_register_month.integer' => '在籍期間を正しく選択してください',
'start_period_of_register_month.max' => '在籍期間を正しく選択してください',
'start_period_of_register_month.min' => '在籍期間を正しく選択してください',
'start_period_of_register_month.required_with' => '月も選択してください',
'start_of_register_date.before_or_equal' => '在籍開始期間を正しく選択してください',
'end_period_of_register_year.integer' => '在籍期間を正しく選択してください',
'end_period_of_register_year.max' => '在籍期間を正しく選択してください',
'end_period_of_register_year.min' => '在籍期間を正しく選択してください',
'end_period_of_register_year.required_with' => '年も選択してください',
'end_period_of_register_month.integer' => '在籍期間を正しく選択してください',
'end_period_of_register_month.max' => '在籍期間を正しく選択してください',
'end_period_of_register_month.min' => '在籍期間を正しく選択してください',
'end_period_of_register_month.required_with' => '月も選択してください',
'end_of_register_date.after_or_equal' => '在籍終了期間を正しく選択してください',
'start_period_of_enrollment_year.integer' => '在籍期間を正しく選択してください',
'start_period_of_enrollment_year.max' => '在籍期間を正しく選択してください',
'start_period_of_enrollment_year.min' => '在籍期間を正しく選択してください',
'start_period_of_enrollment_year.required_with' => '年も選択してください',
'start_period_of_enrollment_month.integer' => '在籍期間を正しく選択してください',
'start_period_of_enrollment_month.max' => '在籍期間を正しく選択してください',
'start_period_of_enrollment_month.min' => '在籍期間を正しく選択してください',
'start_period_of_enrollment_month.required_with' => '月も選択してください',
'start_of_enrollment_date.before_or_equal' => '在籍開始期間を正しく選択してください',
'end_period_of_enrollment_year.integer' => '在籍期間を正しく選択してください',
'end_period_of_enrollment_year.max' => '在籍期間を正しく選択してください',
'end_period_of_enrollment_year.min' => '在籍期間を正しく選択してください',
'end_period_of_enrollment_year.required_with' => '年も選択してください',
'end_period_of_enrollment_month.integer' => '在籍期間を正しく選択してください',
'end_period_of_enrollment_month.max' => '在籍期間を正しく選択してください',
'end_period_of_enrollment_month.min' => '在籍期間を正しく選択してください',
'end_period_of_enrollment_month.required_with' => '月も選択してください',
'end_of_enrollment_date.after_or_equal' => '在籍終了期間を正しく選択してください',
];
}
}