LoginSignup
2
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-22

入力欄が別の期間のバリデーションをかけようと思うと
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' => '在籍終了期間を正しく選択してください',

        ];
    }
}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0