Help us understand the problem. What is going on with this article?

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

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

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

もちろん入力欄を分けなければafterafter_or_equalbeforebefore_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' => '在籍終了期間を正しく選択してください',

        ];
    }
}
satorunooshie
経済学を学んでいる大学三年生です PHP, Kotlinを中心に学習しています 役に立てそうな英語の記事や詰まったところを共有していきます
https://satorunooshie.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away