入力欄が別の時の期間カスタムバリデーションLaravel5.5

入力欄が別の期間のバリデーションをかけようと思うと
``2015-3~2017-4``ではバリデーションがうまくかかるが、
``2018-8~2018-6``だとエラーを吐かなかったので
バリデーションをかける前に連結させました。
誰かの参考になればと思い、残しておきます

laravel5.5で``FormRequest``を使う場合コントローラの処理を実行する前にバリデーションがかかってしまうので、
先に文字列を連結させる必要がありました。
なので文字列を連結させてそれをフォームから送信させているようにしてバリデーションをかけるようにしました。

もちろん入力欄を分けなければ``after``や``after_or_equal``、``before``、``before_or_equal``などを使えばいいのですが。。
送信前にリクエストを加工するには6.xでは``prepareForValidation()``メソッドを使えばいいみたいなので参考にはならないと思います

まずはこれを追加してください

```php
use Illuminate\Validation\Validator;
```

その後にメインロジックを追加していきます
見ての通り、連結させて``$request``に追加しています
それに伴って

```php
	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に入るので、そこにバリデーションをかけるようにしましょう

```php
'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' => '在籍終了期間を正しく選択してください',

        ];
    }
}
```