검증이란
검증이란, 사용자로부터 송신된 데이터가 기대하는 형식이나 조건을 만족하고 있는지를 검증하는 것입니다. Laravel은 리퀘스트 오브젝트의validate 메서드나 전용의 폼 리퀘스트 클래스를 사용한, 심플하고 강력한 검증 기능을 제공하고 있습니다.
컨트롤러에서의 검증
$request->validate()의 사용법
컨트롤러의 메서드 내에서 $request->validate()를 호출하는 것이, 가장 심플한 검증 방법입니다.
검증에 실패하면, Laravel은 사용자를 이전 화면으로 자동으로 리다이렉트하고, 에러 정보를 세션에 보존합니다.
라우트를 정의합니다.
validate 메서드에는 필드명을 키, 규칙을 값으로 한 배열을 전달합니다.
규칙은 파이프 |로 구분하거나, 배열로 지정할 수 있습니다.
주요 검증 규칙
이용 가능한 모든 검증 규칙은 공식 문서에서 확인할 수 있습니다.
메일 주소의 상세한 검증
email 규칙에는, 검증 방법을 지정하는 파라미터를 추가할 수 있습니다.
rfc는 RFC에 준거한 형식을, dns는 메일 주소의 도메인에 유효한 MX 레코드가 있는지를 검증합니다. dns는 실제로 DNS lookup을 실행하지만, 개별 메일박스가 존재하는지 여부는 판정하지 않습니다.
fluent한 Rule 빌더를 사용해 같은 검증을 기술할 수도 있습니다.
dns 밸리데이터는 실제로 DNS lookup을 실행해, 메일 주소의 도메인에 유효한 MX 레코드가 있는지를 확인합니다. 단, 개별 메일박스가 존재하는지 여부는 판정하지 않습니다.
테스트에서는 live DNS lookup에 의존하지 않도록, Validator::fakeDnsLookups를 사용해 dns lookup을 fake할 수 있습니다. rfc 등 다른 지정한 검증은 평소대로 실행됩니다.
배열의 키 검증
array_keys 규칙은, 대상 값이 PHP 배열이며, 모든 키가 지정된 목록에 포함되어 있는지를 확인합니다. 키는 하나 이상 지정할 필요가 있습니다.
Rule::arrayKeys 메서드를 사용합니다.
검증 완료 데이터의 이용
validate 메서드의 반환값은, 검증에 통과한 데이터만을 포함하는 배열입니다.
신뢰할 수 있는 데이터로서 안전하게 사용할 수 있습니다.
Blade 템플릿에서의 에러 표시
검증에 실패하면, Laravel은$errors 변수를 모든 뷰에서 자동적으로 이용할 수 있도록 합니다.
web 미들웨어 그룹에 포함되는 ShareErrorsFromSession 미들웨어가 이를 담당하고 있습니다.
모든 에러를 일람 표시
필드별로 에러를 표시
@error 디렉티브를 사용하면, 특정 필드의 에러를 인라인으로 표시할 수 있습니다.
폼 리퀘스트
폼 리퀘스트란
검증 로직이 복잡해진 경우는, “폼 리퀘스트” 클래스에 잘라 내는 것이 효과적입니다. 폼 리퀘스트는 검증과 인가의 로직을 하나의 클래스에 정리한 커스텀 리퀘스트 클래스입니다.폼 리퀘스트의 작성
make:request Artisan 명령으로 폼 리퀘스트 클래스를 생성합니다.
app/Http/Requests/StorePostRequest.php가 생성됩니다.
rules() 메서드
검증 규칙을 배열로 반환합니다. 컨트롤러의 validate 메서드에 전달하는 배열과 같은 형식입니다.
authorize() 메서드
이 리퀘스트를 실행할 권한이 있는지를 판정합니다.
true를 반환하면 인가 OK, false를 반환하면 403 응답이 자동적으로 반환됩니다.
인증된 사용자만 허가하는 경우, auth()->check()로 확인할 수 있습니다.
튜토리얼에서는 true를 반환해 두면 문제없습니다.
컨트롤러에의 주입
폼 리퀘스트는 컨트롤러 메서드의 타입 힌트로서 지정하는 것만으로 사용할 수 있습니다. 컨트롤러가 호출되기 전에 검증이 실행되기 때문에, 메서드 내에 검증 코드를 작성할 필요는 없습니다.$request->validated()로 검증 완료 데이터만을 취득할 수 있습니다.
비밀번호의 복잡도와 길이의 지정
Password 룰 오브젝트로, 비밀번호의 복잡도와 함께 최소·최대 문자수를 지정할 수 있습니다.
min()은 최소 문자수를, max()는 최대 문자수를 지정합니다. max()를 설정하는 것으로, 스토리지나 서드파티 서비스와의 연계로 상정되는 상한을 선언한 위에서, 복잡한 비밀번호를 허용할 수 있습니다.
실천 예: 투고 폼의 작성과 보존
폼의 표시부터 송신·검증·보존까지의 일련의 플로우입니다.1
라우트의 정의
2
폼 리퀘스트의 작성
3
컨트롤러의 구현
4
Blade 템플릿의 작성
Blade 폼에는 반드시
@csrf 디렉티브를 포함해 주세요. CSRF 토큰이 없으면 Laravel은 419 에러를 반환합니다.다음 단계
HTTP 리퀘스트
리퀘스트 오브젝트를 사용한 데이터 취득 방법을 되돌아봅니다.