양식 요청 유효성 검사에서 여러 필드를 하나로 결합하여 유효성 검사하는 방법

소개



2개의 필드를 1개로 정리해 밸리데이션하고 싶었지만,
수구에 방법을 모르고 소스를 쫓아 버렸으므로 남겨 둡니다.

전제


  • 연월일과 시분초를 따로 지정하지 않으면 이케 없는 Form을 가지고 있는 화면.
  • 기간 지정하고 싶기 때문에, From - To로 필드 가지고 있다

  • 이런 녀석


    post되어 오는 데이터는 일단 이하 같은 느낌으로 설명


    입력란




    시작일
    start_date
    연월일

    시작 시간
    start_time
    시분초

    종료일
    end_date
    연월일

    종료 시간
    end_time
    시분초


    어리석게 하면 어떻게 될까



    코드 쓰기의 게으름이므로 문자로 흐름을 쓰면 ...
  • start_date 형식 검사
  • start_time 형식 검사
  • end_date 형식 검사
  • end_time 형식 검사

  • 그리고, 바리에이션 끝난 후인가, withValidator적인 녀석으로,
  • start_date와 start_time을 붙여 Carbon이나 무언가의 날짜 시스템 인스턴스를 얻는다.
  • end_date와 end_time을 붙여 Carbon 또는 무언가의 날짜 시스템 인스턴스 얻기
  • 얻은 날짜 시스템의 인스턴스 비교

  • 게으른 & 중복.
    그리고 어쩌면 _date와 _time을 붙인 후에 포맷 체크도 하지 않으면 괜찮을 것 같다.
    (withValidator는 validation이 fail이라고 불리지 않을까?라면 불필요)

    솔루션



    Illuminate\Foundation\Http\FormRequest::validationData 메서드 덮어쓰기
    
    /**
     * @inheritdoc
     */
    protected function validationData()
    {
        $this->addStartAt();
        $this->addEndAt();
        return parent::validationData();
    }
    
    /**
     * start_dateとstart_timeからstart_atを作ってリクエストパラメータに追加する
     */
    private function addStartAt()
    {
        $start_date = (string)$this->request->get('start_date');
        if ($start_date === '') {
            return;
        }
        $start_time = (string)$this->request->get('start_time');
        if ($start_time === '') {
            $start_time = '00:00:00';
        }
        $start_at = $start_date . ' ' . $start_time;
        $this->request->add(['start_at' => $start_at]);
    }
    
    /**
     * end_dateとend_timeからend_atを作ってリクエストパラメータに追加する
     */
    private function addEndAt()
    {
        $end_date = (string)$this->request->get('end_date');
        if ($end_date === '') {
            return;
        }
        $end_time = (string)$this->request->get('end_time');
        if ($end_time === '') {
            $end_time = '23:59:59';
        }
        $end_at = $end_date . ' ' . $end_time;
        $this->request->add(['end_at' => $end_at]);
    }
    
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
                'start_at' => [
                    'nullable',
                    'date',
                    'before_or_equal:end_at'
                ],
                'end_at' => [
                    'nullable',
                    'date',
                    'after_or_equal:start_at'
                ],
            ];
    }
    
    

    validationData는 검증되기 전에 호출되는 메소드이므로,
    이것을 오버라이드(override) 해 임의의 파라미터를 request 파라미터에 추가한다.

    양식 요청 유효성 검사의 경우,
    $this->request->add()로 임의의 파라미터를 늘릴 수 있으므로, 밸리데이션전에 더한다···라면 길리 있다고 하는 판단.

    파라미터는 캐릭터 라인으로 건네주므로, date 포맷이 되어 있습니까? 라든지 바리에이션 맡길 수 있고,
    from - to의 줄이 맞을지도 Laravel 맡길 수 있기 때문에 코드도 깨끗이.

    이것으로 _date, _time의 체크 불필요하게 된다.
    단, _date, _time으로 형식이 엄격하게 정해져 있다면,
    각각 제대로 체크해 입력 에러가 있으면 화면상에서 알 수 있도록 해 준다, 정도의 배려는 필요합니다.

    사이고에게



    복수 필드에 대한 밸리데이션의 방법(required_if라든지 사용하는 방법)은 비교적 잘 나와 있지만,
    복수 필드를 합체시켜 1개의 필드로서 밸리데이션 하는 방법은, 정보가 없기 때문에 써 보았습니다.

    최근 코드가 실리지 않는 기사는 전부는 뭐라고 쓰고 있으므로 오랜만에 Qiita에 투고해 보았습니다만,
    뭔가 미리보기 모드가 보기 쉬워진 것 같은... 신경 탓일지도.

    또, 코드가 실리는 것을 쓸 때는 Qiita에 씁니다(아마)

    그럼~.

    좋은 웹페이지 즐겨찾기