Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

入力欄が別の時の期間カスタムバリデーション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' => '在籍終了期間を正しく選択してください',

        ];
    }
}
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
0
Help us understand the problem. What are the problem?