양식 요청 유효성 검사에서 여러 필드를 하나로 결합하여 유효성 검사하는 방법
8223 단어 PHP라라벨laravel5.5
소개
2개의 필드를 1개로 정리해 밸리데이션하고 싶었지만,
수구에 방법을 모르고 소스를 쫓아 버렸으므로 남겨 둡니다.
전제
이런 녀석
post되어 오는 데이터는 일단 이하 같은 느낌으로 설명
입력란
키
값
시작일
start_date
연월일
시작 시간
start_time
시분초
종료일
end_date
연월일
종료 시간
end_time
시분초
어리석게 하면 어떻게 될까
코드 쓰기의 게으름이므로 문자로 흐름을 쓰면 ...
그리고, 바리에이션 끝난 후인가, withValidator적인 녀석으로,
게으른 & 중복.
그리고 어쩌면 _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에 씁니다(아마)
그럼~.
Reference
이 문제에 관하여(양식 요청 유효성 검사에서 여러 필드를 하나로 결합하여 유효성 검사하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sh-ogawa/items/3b6611f7400f5d910e77
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
/**
* @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'
],
];
}
복수 필드에 대한 밸리데이션의 방법(required_if라든지 사용하는 방법)은 비교적 잘 나와 있지만,
복수 필드를 합체시켜 1개의 필드로서 밸리데이션 하는 방법은, 정보가 없기 때문에 써 보았습니다.
최근 코드가 실리지 않는 기사는 전부는 뭐라고 쓰고 있으므로 오랜만에 Qiita에 투고해 보았습니다만,
뭔가 미리보기 모드가 보기 쉬워진 것 같은... 신경 탓일지도.
또, 코드가 실리는 것을 쓸 때는 Qiita에 씁니다(아마)
그럼~.
Reference
이 문제에 관하여(양식 요청 유효성 검사에서 여러 필드를 하나로 결합하여 유효성 검사하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sh-ogawa/items/3b6611f7400f5d910e77텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)