유효성 검사
업데이트됨번역일: 2026년 10월 28일
이 페이지는 원문이 업데이트되어 번역이 갱신되었습니다.
- 원문 수정
- 2026년 10월 25일
- 번역 갱신
- 2026년 10월 28일
유효성 검사
- 소개
- 유효성 검사 빠르게 시작하기
- 폼 리퀘스트 유효성 검사
- Validator 직접 생성하기
- 검증된 입력값 다루기
- 오류 메시지 다루기
- 사용 가능한 유효성 검사 규칙
- 조건부로 규칙 추가하기
- 배열 유효성 검사
- 파일 유효성 검사
- 비밀번호 유효성 검사
- 커스텀 유효성 검사 규칙
소개
Laravel은 애플리케이션으로 들어오는 데이터를 검증하는 여러 가지 방법을 제공합니다. 가장 흔히 쓰는 방법은 모든 HTTP 요청 객체에서 사용할 수 있는 validate 메서드입니다. 이 문서에서는 그 밖의 다른 방식도 함께 살펴봅니다.
Laravel에는 데이터에 적용할 수 있는 편리한 유효성 검사 규칙이 매우 다양하게 내장되어 있으며, 특정 데이터베이스 테이블에서 값이 유일한지까지 검사할 수 있습니다. 이 문서에서 각 규칙을 자세히 다루므로, 읽고 나면 Laravel의 유효성 검사 기능을 전반적으로 파악할 수 있습니다.
유효성 검사 빠르게 시작하기
Laravel의 강력한 유효성 검사 기능을 이해하기 위해, 폼을 검증하고 오류 메시지를 사용자에게 다시 보여주는 전체 과정을 하나의 예제로 따라가 보겠습니다. 이 개요를 읽고 나면 들어오는 요청 데이터를 Laravel로 검증하는 방법을 큰 그림에서 이해할 수 있습니다.
라우트 정의하기
먼저 routes/web.php 파일에 다음과 같은 라우트가 정의되어 있다고 가정하겠습니다.
use App\Http\Controllers\PostController;
Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);GET 라우트는 새 블로그 게시글을 작성하는 폼을 보여주고, POST 라우트는 작성된 게시글을 데이터베이스에 저장합니다.
컨트롤러 만들기
다음으로 위 라우트로 들어오는 요청을 처리하는 간단한 컨트롤러를 살펴보겠습니다. store 메서드는 일단 비워 두겠습니다.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*/
public function create(): View
{
return view('post.create');
}
/**
* Store a new blog post.
*/
public function store(Request $request): RedirectResponse
{
// Validate and store the blog post...
$post = /** ... */
return to_route('post.show', ['post' => $post->id]);
}
}유효성 검사 로직 작성하기
이제 store 메서드에 새 게시글을 검증하는 로직을 채워 넣을 차례입니다. 이를 위해 Illuminate\Http\Request 객체가 제공하는 validate 메서드를 사용합니다. 유효성 검사 규칙을 통과하면 코드가 평소처럼 계속 실행됩니다. 반대로 검사에 실패하면 Illuminate\Validation\ValidationException 예외가 발생하고, 적절한 오류 응답이 사용자에게 자동으로 전달됩니다.
일반적인 HTTP 요청에서 검사에 실패하면 이전 URL로 되돌아가는 리다이렉트 응답이 생성됩니다. 요청이 XHR 요청이라면 유효성 검사 오류 메시지를 담은 JSON 응답이 반환됩니다.
validate 메서드를 더 잘 이해하기 위해 store 메서드로 돌아가 보겠습니다.
/**
* Store a new blog post.
*/
public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
// The blog post is valid...
return redirect('/posts');
}보시는 것처럼 유효성 검사 규칙을 validate 메서드에 배열로 넘깁니다. 사용 가능한 모든 규칙은 별도로 정리되어 있으니 지금 다 알아야 한다고 걱정하지 않으셔도 됩니다. 다시 한 번 말씀드리면, 검사에 실패했을 때는 적절한 응답이 자동으로 만들어지고, 검사에 통과하면 컨트롤러가 그대로 이어서 실행됩니다.
또한 validateWithBag 메서드를 사용하면 요청을 검증하면서 오류 메시지를 이름이 지정된 에러 백에 저장할 수 있습니다.
$validated = $request->validateWithBag('post', [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);첫 번째 검사 실패에서 멈추기
어떤 속성에 대해 첫 번째 검사가 실패하면 나머지 규칙은 더 이상 실행하고 싶지 않을 때가 있습니다. 이럴 때는 해당 속성에 bail 규칙을 지정합니다.
$request->validate([
'title' => ['bail', 'required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);이 예제에서 title 속성의 unique 규칙이 실패하면 max 규칙은 검사하지 않습니다. 규칙은 지정한 순서대로 검사됩니다.
중첩된 속성에 대한 참고 사항
들어오는 HTTP 요청에 "중첩된" 필드 데이터가 있다면, 유효성 검사 규칙에서 "점(dot)" 표기법으로 해당 필드를 지정할 수 있습니다.
$request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'author.name' => ['required'],
'author.description' => ['required'],
]);반대로 필드 이름 자체에 마침표가 들어 있다면, 마침표 앞에 백슬래시를 붙여 이스케이프하면 "점" 표기법으로 해석되지 않도록 명시할 수 있습니다.
$request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'v1\.0' => ['required'],
]);유효성 검사 오류 표시하기
그렇다면 요청 필드가 주어진 규칙을 통과하지 못하면 어떻게 될까요? 앞서 설명했듯이 Laravel은 사용자를 이전 위치로 자동으로 리다이렉트합니다. 이때 모든 유효성 검사 오류와 요청 입력값도 세션에 플래시됩니다.
$errors 변수는 web 미들웨어 그룹에 포함된 Illuminate\View\Middleware\ShareErrorsFromSession 미들웨어를 통해 애플리케이션의 모든 뷰에 공유됩니다. 이 미들웨어가 적용되어 있으면 뷰에서 $errors 변수가 항상 정의되어 있으므로, 별도 확인 없이 안전하게 사용할 수 있습니다. $errors 변수는 Illuminate\Support\MessageBag의 인스턴스입니다. 이 객체를 다루는 방법은 관련 문서를 참고하세요.
따라서 이 예제에서는 유효성 검사에 실패하면 사용자가 컨트롤러의 create 메서드로 리다이렉트되고, 뷰에서 오류 메시지를 표시할 수 있습니다.
<!-- /resources/views/post/create.blade.php -->
<h1>Create Post</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Create Post Form -->오류 메시지 커스터마이징
Laravel에 내장된 각 유효성 검사 규칙에는 애플리케이션의 lang/en/validation.php 파일에 정의된 오류 메시지가 있습니다. 애플리케이션에 lang 디렉터리가 없다면 lang:publish Artisan 명령어로 Laravel이 해당 디렉터리를 생성하도록 할 수 있습니다.
lang/en/validation.php 파일에는 각 유효성 검사 규칙에 대응하는 번역 항목이 들어 있습니다. 애플리케이션의 필요에 맞게 이 메시지들을 자유롭게 수정해도 됩니다.
또한 이 파일을 다른 언어 디렉터리로 복사해 애플리케이션이 사용하는 언어로 메시지를 번역할 수도 있습니다. Laravel의 지역화에 대해 더 알고 싶다면 지역화 문서를 참고하세요.
WARNING
기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. Laravel의 언어 파일을 커스터마이징하려면 lang:publish Artisan 명령어로 먼저 파일을 발행(publish)하세요.
XHR 요청과 유효성 검사
이 예제에서는 전통적인 폼으로 애플리케이션에 데이터를 전송했습니다. 하지만 많은 애플리케이션이 JavaScript 기반 프런트엔드에서 XHR 요청을 받습니다. XHR 요청 중에 validate 메서드를 사용하면 Laravel은 리다이렉트 응답을 만들지 않습니다. 대신 모든 유효성 검사 오류를 담은 JSON 응답을 생성하며, 이 JSON 응답은 HTTP 상태 코드 422와 함께 전송됩니다.
`@error` 디렉티브
@error Blade 디렉티브를 사용하면 특정 속성에 유효성 검사 오류 메시지가 있는지 간단히 확인할 수 있습니다. @error 디렉티브 안에서는 $message 변수를 출력해 오류 메시지를 표시할 수 있습니다.
<!-- /resources/views/post/create.blade.php -->
<label for="title">Post Title</label>
<input
id="title"
type="text"
name="title"
class="@error('title') is-invalid @enderror"
/>
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror이름이 지정된 에러 백을 사용한다면, @error 디렉티브의 두 번째 인자로 에러 백의 이름을 전달할 수 있습니다.
<input ... class="@error('title', 'post') is-invalid @enderror">폼 값 다시 채우기
유효성 검사 오류 때문에 Laravel이 리다이렉트 응답을 만들 때, 프레임워크는 요청의 모든 입력값을 세션에 자동으로 플래시합니다. 덕분에 다음 요청에서 이 입력값을 쉽게 꺼내 사용자가 제출하려던 폼을 다시 채울 수 있습니다.
이전 요청에서 플래시된 입력값을 가져오려면 Illuminate\Http\Request 인스턴스의 old 메서드를 호출합니다. old 메서드는 이전에 플래시된 입력 데이터를 세션에서 꺼내 옵니다.
$title = $request->old('title');Laravel은 전역 old 헬퍼도 제공합니다. Blade 템플릿에서 이전 입력값을 표시한다면 폼을 다시 채울 때 old 헬퍼를 쓰는 편이 더 편리합니다. 해당 필드에 이전 입력값이 없으면 null이 반환됩니다.
<input type="text" name="title" value="{{ old('title') }}">선택 입력 필드에 대한 참고 사항
Laravel은 기본적으로 애플리케이션의 전역 미들웨어 스택에 TrimStrings와 ConvertEmptyStringsToNull 미들웨어를 포함합니다. 이 때문에 "선택" 입력 필드에서 null 값을 유효하지 않은 값으로 취급하지 않게 하려면, 해당 필드에 nullable을 지정해야 하는 경우가 많습니다. 예를 들면 다음과 같습니다.
$request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
'publish_at' => ['nullable', 'date'],
]);이 예제는 publish_at 필드가 null이거나 유효한 날짜 표현이어야 함을 지정합니다. 규칙 정의에 nullable 수정자를 추가하지 않으면 유효성 검사기는 null을 유효하지 않은 날짜로 간주합니다.
유효성 검사 오류 응답 형식
애플리케이션에서 Illuminate\Validation\ValidationException 예외가 발생했고 들어온 HTTP 요청이 JSON 응답을 기대하는 경우, Laravel은 오류 메시지를 자동으로 포맷하여 422 Unprocessable Entity HTTP 응답으로 반환합니다.
아래는 유효성 검사 오류에 대한 JSON 응답 형식의 예입니다. 중첩된 오류 키는 "점(dot)" 표기법 형태로 평탄화(flatten)된다는 점에 유의하세요.
{
"message": "The team name field must be a string. (and 4 more errors)",
"errors": {
"team_name": [
"The team name field must be a string.",
"The team name field must be at least 1 characters."
],
"authorization.role": [
"The selected authorization.role is invalid."
],
"users.0.email": [
"The users.0.email field is required."
],
"users.2.email": [
"The users.2.email field must be a valid email address."
]
}
}폼 리퀘스트 유효성 검사
폼 리퀘스트 만들기
더 복잡한 유효성 검사 시나리오에서는 "폼 리퀘스트(form request)"를 만들어 쓰는 것이 좋습니다. 폼 리퀘스트는 자체 유효성 검사 및 인가 로직을 캡슐화한 커스텀 요청 클래스입니다. 폼 리퀘스트 클래스를 만들려면 make:request Artisan CLI 명령어를 사용합니다.
php artisan make:request StorePostRequest생성된 폼 리퀘스트 클래스는 app/Http/Requests 디렉터리에 위치합니다. 이 디렉터리가 없다면 make:request 명령어를 실행할 때 함께 생성됩니다. Laravel이 생성한 모든 폼 리퀘스트에는 authorize와 rules라는 두 메서드가 있습니다.
짐작하셨겠지만, authorize 메서드는 현재 인증된 사용자가 해당 요청이 나타내는 동작을 수행할 수 있는지 판단하고, rules 메서드는 요청 데이터에 적용할 유효성 검사 규칙을 반환합니다.
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
];
}NOTE
rules 메서드의 시그니처에는 필요한 의존성을 타입 힌트로 지정할 수 있습니다. 이 의존성은 Laravel 서비스 컨테이너를 통해 자동으로 해결됩니다.
그렇다면 유효성 검사 규칙은 어떻게 평가될까요? 컨트롤러 메서드에서 해당 요청 클래스를 타입 힌트로 지정하기만 하면 됩니다. 들어온 폼 리퀘스트는 컨트롤러 메서드가 호출되기 전에 검증되므로, 컨트롤러에 유효성 검사 로직을 어지럽게 늘어놓을 필요가 없습니다.
/**
* Store a new blog post.
*/
public function store(StorePostRequest $request): RedirectResponse
{
// The incoming request is valid...
// Retrieve the validated input data...
$validated = $request->validated();
// Retrieve a portion of the validated input data...
$validated = $request->safe()->only(['name', 'email']);
$validated = $request->safe()->except(['name', 'email']);
// Store the blog post...
return redirect('/posts');
}유효성 검사에 실패하면 사용자를 이전 위치로 돌려보내는 리다이렉트 응답이 생성됩니다. 오류도 세션에 플래시되어 화면에 표시할 수 있습니다. 요청이 XHR 요청이었다면 유효성 검사 오류의 JSON 표현을 포함한 422 상태 코드의 HTTP 응답이 사용자에게 반환됩니다.
NOTE
Inertia 기반 Laravel 프런트엔드에 실시간 폼 리퀘스트 유효성 검사를 추가하고 싶으신가요? Laravel Precognition을 확인해 보세요.
추가 유효성 검사 수행하기
처음 유효성 검사가 끝난 뒤에 추가 검사를 수행해야 할 때가 있습니다. 이럴 때는 폼 리퀘스트의 after 메서드를 사용합니다.
after 메서드는 유효성 검사가 끝난 뒤 호출될 callable 또는 클로저의 배열을 반환해야 합니다. 전달된 callable은 Illuminate\Validation\Validator 인스턴스를 받으므로, 필요하면 추가 오류 메시지를 등록할 수 있습니다.
use Illuminate\Validation\Validator;
/**
* Get the "after" validation callables for the request.
*/
public function after(): array
{
return [
function (Validator $validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add(
'field',
'Something is wrong with this field!'
);
}
}
];
}앞서 설명했듯이 after 메서드가 반환하는 배열에는 호출 가능한(invokable) 클래스도 담을 수 있습니다. 이런 클래스의 __invoke 메서드는 Illuminate\Validation\Validator 인스턴스를 받습니다.
use App\Validation\ValidateShippingTime;
use App\Validation\ValidateUserStatus;
use Illuminate\Validation\Validator;
/**
* Get the "after" validation callables for the request.
*/
public function after(): array
{
return [
new ValidateUserStatus,
new ValidateShippingTime,
function (Validator $validator) {
//
}
];
}첫 번째 검사 실패에서 멈추기
요청 클래스에 StopOnFirstFailure 어트리뷰트를 추가하면, 하나의 유효성 검사 실패가 발생하는 즉시 모든 속성에 대한 검사를 중단하도록 유효성 검사기에 알릴 수 있습니다.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\StopOnFirstFailure;
use Illuminate\Foundation\Http\FormRequest;
#[StopOnFirstFailure]
class StorePostRequest extends FormRequest
{
// ...
}정의되지 않은 필드 거부하기
요청 클래스에 FailOnUnknownFields 어트리뷰트를 추가하면, 요청의 유효성 검사 규칙에 정의되지 않은 필드가 들어왔을 때 Laravel이 이를 거부하도록 할 수 있습니다.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\FailOnUnknownFields;
use Illuminate\Foundation\Http\FormRequest;
#[FailOnUnknownFields]
class StorePostRequest extends FormRequest
{
public function rules(): array
{
return [
'title' => ['required', 'string'],
'body' => ['required', 'string'],
];
}
}AppServiceProvider에서 모든 폼 리퀘스트에 이 동작을 전역으로 활성화할 수도 있습니다.
use Illuminate\Foundation\Http\FormRequest;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
FormRequest::failOnUnknownFields();
}필요하다면 어트리뷰트에 false를 전달해 특정 요청에서만 이 동작을 비활성화할 수 있습니다.
#[FailOnUnknownFields(false)]
class PublicWebhookRequest extends FormRequest
{
// ...
}정의되지 않은 필드를 거부하면 예상치 못한 입력 키가 애플리케이션 깊숙이 흘러 들어가는 것을 막아, 대량 할당(mass assignment) 계열의 문제에 대한 추가 보호막이 될 수 있습니다. 그렇더라도 모델의 $fillable / $guarded 속성은 여전히 설정해야 하며, 신뢰할 수 있는 검증된 입력값만 저장해야 합니다.
리다이렉트 위치 커스터마이징
폼 리퀘스트 유효성 검사에 실패하면 사용자를 이전 위치로 돌려보내는 리다이렉트 응답이 생성됩니다. 이 동작은 자유롭게 바꿀 수 있으며, 폼 리퀘스트에 RedirectTo 어트리뷰트를 사용하면 됩니다.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\RedirectTo;
use Illuminate\Foundation\Http\FormRequest;
#[RedirectTo('/dashboard')]
class StorePostRequest extends FormRequest
{
// ...
}이름이 지정된 라우트로 리다이렉트하고 싶다면 대신 RedirectToRoute 어트리뷰트를 사용합니다.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\RedirectToRoute;
use Illuminate\Foundation\Http\FormRequest;
#[RedirectToRoute('dashboard')]
class StorePostRequest extends FormRequest
{
// ...
}에러 백 커스터마이징
폼 리퀘스트 유효성 검사에 실패하면 오류는 default 에러 백에 플래시됩니다. 오류를 다른 이름이 지정된 에러 백에 저장해야 한다면, 폼 리퀘스트에 ErrorBag 어트리뷰트를 사용할 수 있습니다.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\ErrorBag;
use Illuminate\Foundation\Http\FormRequest;
#[ErrorBag('login')]
class LoginRequest extends FormRequest
{
// ...
}폼 리퀘스트 인가하기
폼 리퀘스트 클래스에는 authorize 메서드도 들어 있습니다. 이 메서드에서 인증된 사용자가 특정 리소스를 수정할 권한이 실제로 있는지 판단할 수 있습니다. 예를 들어 사용자가 수정하려는 블로그 댓글의 소유자가 맞는지 확인할 수 있습니다. 대개 이 메서드 안에서 인가 게이트와 정책을 사용하게 됩니다.
use App\Models\Comment;
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}모든 폼 리퀘스트는 Laravel의 기본 요청 클래스를 상속하므로, user 메서드로 현재 인증된 사용자에 접근할 수 있습니다. 또한 위 예제의 route 메서드 호출에도 주목하세요. 이 메서드는 호출된 라우트에 정의된 URI 파라미터에 접근하게 해 주며, 아래 예제의 {comment} 파라미터가 그 예입니다.
Route::post('/comment/{comment}');따라서 애플리케이션에서 라우트 모델 바인딩을 활용한다면, 해석된 모델을 요청의 프로퍼티로 접근해 코드를 더 간결하게 만들 수 있습니다.
return $this->user()->can('update', $this->comment);authorize 메서드가 false를 반환하면 403 상태 코드의 HTTP 응답이 자동으로 반환되고 컨트롤러 메서드는 실행되지 않습니다.
요청에 대한 인가 로직을 애플리케이션의 다른 곳에서 처리할 계획이라면, authorize 메서드를 완전히 제거하거나 단순히 true를 반환하도록 둘 수 있습니다.
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}NOTE
authorize 메서드의 시그니처에는 필요한 의존성을 타입 힌트로 지정할 수 있습니다. 이 의존성은 Laravel 서비스 컨테이너를 통해 자동으로 해결됩니다.
오류 메시지 커스터마이징
폼 리퀘스트가 사용하는 오류 메시지는 messages 메서드를 오버라이드해 커스터마이징할 수 있습니다. 이 메서드는 속성 / 규칙 쌍과 그에 해당하는 오류 메시지를 담은 배열을 반환해야 합니다.
/**
* Get the error messages for the defined validation rules.
*
* @return array<string, string>
*/
public function messages(): array
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}유효성 검사 속성명 커스터마이징
Laravel에 내장된 유효성 검사 규칙의 오류 메시지 중 상당수에는 :attribute 플레이스홀더가 들어 있습니다. 검증 메시지의 :attribute 플레이스홀더를 사용자 지정 속성명으로 바꾸고 싶다면, attributes 메서드를 오버라이드해 커스텀 이름을 지정할 수 있습니다. 이 메서드는 속성 / 이름 쌍을 담은 배열을 반환해야 합니다.
/**
* Get custom attributes for validator errors.
*
* @return array<string, string>
*/
public function attributes(): array
{
return [
'email' => 'email address',
];
}유효성 검사를 위한 입력값 준비하기
유효성 검사 규칙을 적용하기 전에 요청 데이터를 준비하거나 정제(sanitize)해야 한다면 prepareForValidation 메서드를 사용할 수 있습니다.
use Illuminate\Support\Str;
/**
* Prepare the data for validation.
*/
protected function prepareForValidation(): void
{
$this->merge([
'slug' => Str::slug($this->slug),
]);
}마찬가지로, 유효성 검사가 끝난 뒤에 요청 데이터를 정규화해야 한다면 passedValidation 메서드를 사용할 수 있습니다.
/**
* Handle a passed validation attempt.
*/
protected function passedValidation(): void
{
$this->replace(['name' => 'Taylor']);
}Validator 직접 생성하기
요청 객체의 validate 메서드를 사용하고 싶지 않다면, Validator 파사드로 유효성 검사기 인스턴스를 직접 생성할 수 있습니다. 파사드의 make 메서드가 새 유효성 검사기 인스턴스를 생성합니다.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class PostController extends Controller
{
/**
* Store a new blog post.
*/
public function store(Request $request): RedirectResponse
{
$validator = Validator::make($request->all(), [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
if ($validator->fails()) {
return redirect('/post/create')
->withErrors($validator)
->withInput();
}
// Retrieve the validated input...
$validated = $validator->validated();
// Retrieve a portion of the validated input...
$validated = $validator->safe()->only(['name', 'email']);
$validated = $validator->safe()->except(['name', 'email']);
// Store the blog post...
return redirect('/posts');
}
}make 메서드의 첫 번째 인자는 검증할 데이터이고, 두 번째 인자는 데이터에 적용할 유효성 검사 규칙의 배열입니다.
요청 검증이 실패했는지 확인한 뒤에는 withErrors 메서드로 오류 메시지를 세션에 플래시할 수 있습니다. 이 메서드를 사용하면 리다이렉션 후 $errors 변수가 뷰에 자동으로 공유되므로, 사용자에게 오류를 쉽게 다시 보여줄 수 있습니다. withErrors 메서드는 유효성 검사기, MessageBag, 또는 PHP array를 받습니다.
첫 번째 검사 실패에서 멈추기
stopOnFirstFailure 메서드는 하나의 유효성 검사 실패가 발생하는 즉시 모든 속성에 대한 검사를 중단하도록 유효성 검사기에 알립니다.
if ($validator->stopOnFirstFailure()->fails()) {
// ...
}자동 리다이렉션
유효성 검사기 인스턴스를 직접 만들면서도 HTTP 요청의 validate 메서드가 제공하는 자동 리다이렉션을 활용하고 싶다면, 기존 유효성 검사기 인스턴스에서 validate 메서드를 호출하면 됩니다. 검사에 실패하면 사용자는 자동으로 리다이렉트되고, XHR 요청이라면 JSON 응답이 반환됩니다.
Validator::make($request->all(), [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
])->validate();검사에 실패했을 때 오류 메시지를 이름이 지정된 에러 백에 저장하려면 validateWithBag 메서드를 사용합니다.
Validator::make($request->all(), [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
])->validateWithBag('post');이름이 지정된 에러 백
한 페이지에 폼이 여러 개 있다면, 유효성 검사 오류를 담은 MessageBag에 이름을 붙여 특정 폼의 오류 메시지만 가져오고 싶을 수 있습니다. 이를 위해서는 withErrors의 두 번째 인자로 이름을 전달합니다.
return redirect('/register')->withErrors($validator, 'login');그러면 $errors 변수에서 이름이 지정된 MessageBag 인스턴스에 접근할 수 있습니다.
{{ $errors->login->first('email') }}오류 메시지 커스터마이징
필요하다면 Laravel이 제공하는 기본 오류 메시지 대신 유효성 검사기 인스턴스가 사용할 커스텀 오류 메시지를 지정할 수 있습니다. 커스텀 메시지를 지정하는 방법은 여러 가지입니다. 먼저, Validator::make 메서드의 세 번째 인자로 커스텀 메시지를 전달할 수 있습니다.
$validator = Validator::make($input, $rules, $messages = [
'required' => 'The :attribute field is required.',
]);이 예제에서 :attribute 플레이스홀더는 검증 대상 필드의 실제 이름으로 치환됩니다. 검증 메시지에서는 다른 플레이스홀더도 사용할 수 있습니다. 예를 들면 다음과 같습니다.
$messages = [
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute value :input is not between :min - :max.',
'in' => 'The :attribute must be one of the following types: :values',
];특정 속성에 대한 커스텀 메시지 지정하기
특정 속성에만 커스텀 오류 메시지를 지정하고 싶을 때가 있습니다. 이럴 때는 "점(dot)" 표기법을 사용하며, 속성 이름을 먼저 쓰고 그 뒤에 규칙을 씁니다.
$messages = [
'email.required' => 'We need to know your email address!',
];커스텀 속성 값 지정하기
Laravel에 내장된 오류 메시지 중 상당수에는 검증 대상 필드나 속성의 이름으로 치환되는 :attribute 플레이스홀더가 들어 있습니다. 특정 필드에서 이 플레이스홀더를 대체할 값을 바꾸고 싶다면, Validator::make 메서드의 네 번째 인자로 커스텀 속성 배열을 전달합니다.
$validator = Validator::make($input, $rules, $messages, [
'email' => 'email address',
]);추가 유효성 검사 수행하기
처음 유효성 검사가 끝난 뒤에 추가 검사를 수행해야 할 때가 있습니다. 이럴 때는 유효성 검사기의 after 메서드를 사용합니다. after 메서드는 클로저 또는 callable 배열을 받으며, 이들은 유효성 검사가 끝난 뒤 호출됩니다. 전달된 callable은 Illuminate\Validation\Validator 인스턴스를 받으므로, 필요하면 추가 오류 메시지를 등록할 수 있습니다.
use Illuminate\Support\Facades\Validator;
$validator = Validator::make(/* ... */);
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add(
'field', 'Something is wrong with this field!'
);
}
});
if ($validator->fails()) {
// ...
}앞서 설명했듯이 after 메서드는 callable 배열도 받습니다. "검증 후" 로직을 호출 가능한(invokable) 클래스로 캡슐화했다면 특히 편리하며, 이런 클래스는 __invoke 메서드를 통해 Illuminate\Validation\Validator 인스턴스를 받습니다.
use App\Validation\ValidateShippingTime;
use App\Validation\ValidateUserStatus;
$validator->after([
new ValidateUserStatus,
new ValidateShippingTime,
function ($validator) {
// ...
},
]);검증된 입력값 다루기
폼 리퀘스트나 직접 생성한 유효성 검사기 인스턴스로 요청 데이터를 검증한 뒤에는, 실제로 검증을 거친 요청 데이터만 꺼내 쓰고 싶을 수 있습니다. 여러 방법이 있습니다. 먼저 폼 리퀘스트나 유효성 검사기 인스턴스에서 validated 메서드를 호출할 수 있습니다. 이 메서드는 검증된 데이터의 배열을 반환합니다.
$validated = $request->validated();
$validated = $validator->validated();또는 폼 리퀘스트나 유효성 검사기 인스턴스에서 safe 메서드를 호출할 수도 있습니다. 이 메서드는 Illuminate\Support\ValidatedInput 인스턴스를 반환합니다. 이 객체는 only, except, all 메서드를 제공하여 검증된 데이터의 일부 또는 전체 배열을 가져올 수 있습니다.
$validated = $request->safe()->only(['name', 'email']);
$validated = $request->safe()->except(['name', 'email']);
$validated = $request->safe()->all();또한 Illuminate\Support\ValidatedInput 인스턴스는 반복(iterate)할 수 있고 배열처럼 접근할 수도 있습니다.
// Validated data may be iterated...
foreach ($request->safe() as $key => $value) {
// ...
}
// Validated data may be accessed as an array...
$validated = $request->safe();
$email = $validated['email'];검증된 데이터에 필드를 추가하고 싶다면 merge 메서드를 호출합니다.
$validated = $request->safe()->merge(['name' => 'Taylor Otwell']);검증된 데이터를 컬렉션 인스턴스로 가져오려면 collect 메서드를 호출합니다.
$collection = $request->safe()->collect();오류 메시지 다루기
Validator 인스턴스에서 errors 메서드를 호출하면 Illuminate\Support\MessageBag 인스턴스를 얻게 되며, 이 객체에는 오류 메시지를 다루는 데 유용한 여러 메서드가 있습니다. 모든 뷰에 자동으로 제공되는 $errors 변수 역시 MessageBag 클래스의 인스턴스입니다.
필드의 첫 번째 오류 메시지 가져오기
특정 필드의 첫 번째 오류 메시지를 가져오려면 first 메서드를 사용합니다.
$errors = $validator->errors();
echo $errors->first('email');필드의 모든 오류 메시지 가져오기
특정 필드의 모든 메시지를 배열로 가져와야 한다면 get 메서드를 사용합니다.
foreach ($errors->get('email') as $message) {
// ...
}배열 형태의 폼 필드를 검증하는 경우, * 문자를 사용해 각 배열 요소의 모든 메시지를 가져올 수 있습니다.
foreach ($errors->get('attachments.*') as $message) {
// ...
}모든 필드의 모든 오류 메시지 가져오기
모든 필드의 모든 메시지를 배열로 가져오려면 all 메서드를 사용합니다.
foreach ($errors->all() as $message) {
// ...
}필드에 메시지가 있는지 확인하기
has 메서드로 특정 필드에 오류 메시지가 존재하는지 확인할 수 있습니다.
if ($errors->has('email')) {
// ...
}언어 파일에서 커스텀 메시지 지정하기
Laravel에 내장된 각 유효성 검사 규칙에는 애플리케이션의 lang/en/validation.php 파일에 정의된 오류 메시지가 있습니다. 애플리케이션에 lang 디렉터리가 없다면 lang:publish Artisan 명령어로 Laravel이 해당 디렉터리를 생성하도록 할 수 있습니다.
lang/en/validation.php 파일에는 각 유효성 검사 규칙에 대응하는 번역 항목이 들어 있습니다. 애플리케이션의 필요에 맞게 이 메시지들을 자유롭게 수정해도 됩니다.
또한 이 파일을 다른 언어 디렉터리로 복사해 애플리케이션이 사용하는 언어로 메시지를 번역할 수도 있습니다. Laravel의 지역화에 대해 더 알고 싶다면 지역화 문서를 참고하세요.
WARNING
기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. Laravel의 언어 파일을 커스터마이징하려면 lang:publish Artisan 명령어로 먼저 파일을 발행(publish)하세요.
특정 속성에 대한 커스텀 메시지
애플리케이션의 유효성 검사 언어 파일에서 특정 속성과 규칙 조합에 사용할 오류 메시지를 커스터마이징할 수 있습니다. 이를 위해 애플리케이션의 lang/xx/validation.php 언어 파일의 custom 배열에 메시지를 추가합니다.
'custom' => [
'email' => [
'required' => 'We need to know your email address!',
'max' => 'Your email address is too long!'
],
],언어 파일에서 속성명 지정하기
Laravel에 내장된 오류 메시지 중 상당수에는 검증 대상 필드나 속성의 이름으로 치환되는 :attribute 플레이스홀더가 들어 있습니다. 검증 메시지의 :attribute 부분을 사용자 지정 값으로 바꾸고 싶다면, lang/xx/validation.php 언어 파일의 attributes 배열에 커스텀 속성명을 지정하면 됩니다.
'attributes' => [
'email' => 'email address',
],WARNING
기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. Laravel의 언어 파일을 커스터마이징하려면 lang:publish Artisan 명령어로 먼저 파일을 발행(publish)하세요.
언어 파일에서 값 지정하기
Laravel에 내장된 일부 유효성 검사 규칙의 오류 메시지에는 요청 속성의 현재 값으로 치환되는 :value 플레이스홀더가 들어 있습니다. 그런데 때로는 검증 메시지의 :value 부분을 그 값의 다른 표현으로 바꾸고 싶을 수 있습니다. 예를 들어 payment_type 값이 cc이면 신용카드 번호가 필수라고 지정한 다음 규칙을 살펴보겠습니다.
Validator::make($request->all(), [
'credit_card_number' => ['required_if:payment_type,cc']
]);이 유효성 검사 규칙에 실패하면 다음과 같은 오류 메시지가 생성됩니다.
The credit card number field is required when payment type is cc.결제 유형 값으로 cc를 그대로 표시하는 대신, lang/xx/validation.php 언어 파일에 values 배열을 정의하여 사용자에게 더 친숙한 값 표현을 지정할 수 있습니다.
'values' => [
'payment_type' => [
'cc' => 'credit card'
],
],WARNING
기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. Laravel의 언어 파일을 커스터마이징하려면 lang:publish Artisan 명령어로 먼저 파일을 발행(publish)하세요.
이 값을 정의하고 나면 유효성 검사 규칙은 다음과 같은 오류 메시지를 생성합니다.
The credit card number field is required when payment type is credit card.사용 가능한 유효성 검사 규칙
아래는 사용 가능한 모든 유효성 검사 규칙과 그 기능의 목록입니다.
불리언
문자열
Active URL Alpha Alpha Dash Alpha Numeric Ascii Confirmed Current Password Different Doesnt Start With Doesnt End With Email Ends With Enum Hex Color In IP Address JSON Lowercase MAC Address Max Min Not In Regular Expression Not Regular Expression Same Size Starts With String Uppercase URL ULID UUID
숫자
Between Decimal Different Digits Digits Between Greater Than Greater Than Or Equal Integer Less Than Less Than Or Equal Max Max Digits Min Min Digits Multiple Of Numeric Same Size
배열
날짜
파일
Between Dimensions Encoding Extensions File Image Max Min MIME Types MIME Type By File Extension Size
데이터베이스
유틸리티
Any Of Bail Exclude Exclude If Exclude Unless Exclude With Exclude Without Filled Missing Missing If Missing Unless Missing With Missing With All Nullable Present Present If Present Unless Present With Present With All Prohibited Prohibited If Prohibited If Accepted Prohibited If Declined Prohibited Unless Prohibits Required Required If Required If Accepted Required If Declined Required Unless Required With Required With All Required Without Required Without All Required Array Keys Sometimes
규칙 빌더
문자열 외에도, 많은 유효성 검사 규칙을 Illuminate\Validation\Rule 클래스의 메서드로 정의할 수 있습니다. 이 메서드들은 IDE 자동 완성을 지원하며 문자열 규칙과 함께 조합해 쓸 수 있습니다.
use Illuminate\Validation\Rule;
'name' => [Rule::required(), Rule::string()->max(255)],
'terms' => [Rule::accepted()],
'enabled' => [Rule::boolean()],
'website' => [Rule::nullable(), Rule::activeUrl()],메서드 이름은 Rule::hexColor(), Rule::macAddress(), Rule::requiredArrayKeys(['name', 'email'])처럼 카멜 케이스를 사용합니다. 다른 필드에 의존하는 규칙은 필드 이름이나 비교할 값을 인자로 받습니다.
'terms' => [Rule::acceptedIf('account_type', ['personal', 'business'])],
'nickname' => [Rule::excludeWith('name')],
'email' => [Rule::requiredWithout(['phone', 'mobile'])],
'settings' => [Rule::presentIf('account_type', 'business')],acceptedIf, declinedIf, missingIf, missingUnless, presentIf, presentUnless 메서드는 비교할 값 하나 또는 비교할 값의 배열을 받습니다. requiredWith, requiredWithAll, requiredWithout, requiredWithoutAll, missingWith, missingWithAll, presentWith, presentWithAll, prohibits 같은 메서드는 필드 이름의 배열이나 여러 개의 필드 이름 인자를 받습니다.
정규 표현식은 regex와 notRegex 메서드로도 정의할 수 있습니다.
'username' => [Rule::required(), Rule::regex('/^[a-z]+$/i')],
'code' => [Rule::notRegex('/^test-/i')],accepted
검증 대상 필드는 "yes", "on", 1, "1", true, "true" 중 하나여야 합니다. "서비스 약관" 동의 여부 등을 검증할 때 유용합니다.
accepted_if:anotherfield,value,...
검증 대상 필드는, 검증 중인 다른 필드가 지정한 값과 같을 경우 "yes", "on", 1, "1", true, "true" 중 하나여야 합니다. "서비스 약관" 동의 여부 등을 검증할 때 유용합니다.
active_url
검증 대상 필드는 PHP dns_get_record 함수 기준으로 유효한 A 또는 AAAA 레코드를 가져야 합니다. 제공된 URL의 호스트명은 dns_get_record에 전달되기 전에 PHP parse_url 함수로 추출됩니다.
active_url이나 email:dns처럼 DNS 조회를 수행하는 유효성 검사 규칙을 테스트할 때는 Validator::fakeDnsLookups 메서드를 사용할 수 있습니다. 이 메서드는 규칙의 다른 검증 동작은 유지한 채 DNS 조회만 가짜로 처리합니다.
use Illuminate\Support\Facades\Validator;
Validator::fakeDnsLookups();after:_date_
검증 대상 필드는 주어진 날짜 이후의 값이어야 합니다. 날짜는 PHP strtotime 함수에 전달되어 유효한 DateTime 인스턴스로 변환됩니다.
'start_date' => ['required', 'date', 'after:tomorrow']strtotime으로 평가할 날짜 문자열을 전달하는 대신, 날짜를 비교할 다른 필드를 지정할 수도 있습니다.
'finish_date' => ['required', 'date', 'after:start_date']편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더로 만들 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->after(today()->addDays(7)),
],afterToday와 todayOrAfter 메서드를 사용하면 각각 "오늘 이후여야 한다", "오늘이거나 오늘 이후여야 한다"는 조건을 플루언트하게 표현할 수 있습니다.
'start_date' => [
'required',
Rule::date()->afterToday(),
],after\_or\_equal:_date_
검증 대상 필드는 주어진 날짜와 같거나 그 이후의 값이어야 합니다. 자세한 내용은 after 규칙을 참고하세요.
편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더로 만들 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->afterOrEqual(today()->addDays(7)),
],anyOf
Rule::anyOf 유효성 검사 규칙을 사용하면 검증 대상 필드가 주어진 여러 규칙 집합 중 하나라도 만족하면 되도록 지정할 수 있습니다. 예를 들어 다음 규칙은 username 필드가 이메일 주소이거나, 대시를 포함한 영숫자 문자열이면서 길이가 6자 이상인지를 검증합니다.
use Illuminate\Validation\Rule;
'username' => [
'required',
Rule::anyOf([
['string', 'email'],
['string', 'alpha_dash', 'min:6'],
]),
],alpha
검증 대상 필드는 \p{L}과 \p{M}에 포함된 유니코드 알파벳 문자로만 이루어져 있어야 합니다.
이 유효성 검사 규칙을 ASCII 범위의 문자(a-z, A-Z)로 제한하려면 규칙에 ascii 옵션을 지정합니다.
'username' => ['alpha:ascii'],alpha_dash
검증 대상 필드는 \p{L}, \p{M}, \p{N}에 포함된 유니코드 영숫자 문자와 ASCII 대시(-), ASCII 밑줄(_)로만 이루어져 있어야 합니다.
이 유효성 검사 규칙을 ASCII 범위의 문자(a-z, A-Z, 0-9)로 제한하려면 규칙에 ascii 옵션을 지정합니다.
'username' => ['alpha_dash:ascii'],alpha_num
검증 대상 필드는 \p{L}, \p{M}, \p{N}에 포함된 유니코드 영숫자 문자로만 이루어져 있어야 합니다.
이 유효성 검사 규칙을 ASCII 범위의 문자(a-z, A-Z, 0-9)로 제한하려면 규칙에 ascii 옵션을 지정합니다.
'username' => ['alpha_num:ascii'],array
검증 대상 필드는 PHP array여야 합니다.
array 규칙에 추가 값을 지정하면, 입력 배열의 모든 키가 규칙에 지정한 값 목록에 포함되어 있어야 합니다. 다음 예제에서 입력 배열의 admin 키는 array 규칙에 지정한 값 목록에 없으므로 유효하지 않습니다.
use Illuminate\Support\Facades\Validator;
$input = [
'user' => [
'name' => 'Taylor Otwell',
'username' => 'taylorotwell',
'admin' => true,
],
];
Validator::make($input, [
'user' => ['array:name,username'],
]);일반적으로 배열에 포함될 수 있는 키는 항상 명시해 두는 것이 좋습니다.
array_keys:_foo_,_bar_,...
검증 대상 필드는 모든 키가 주어진 목록에 포함된 PHP array여야 합니다. 키는 최소 하나 이상 지정해야 합니다.
'user' => ['array_keys:name,username'],편의를 위해 Rule::arrayKeys 메서드를 사용할 수도 있습니다.
'user' => [Rule::arrayKeys('name', 'username')],ascii
검증 대상 필드는 7비트 ASCII 문자로만 이루어져 있어야 합니다.
bail
해당 필드에서 첫 번째 유효성 검사 실패가 발생하면 이후 규칙의 실행을 중단합니다.
bail 규칙은 검사에 실패한 특정 필드에 대해서만 검증을 멈추지만, stopOnFirstFailure 메서드는 하나의 유효성 검사 실패가 발생하는 즉시 모든 속성에 대한 검증을 중단하도록 유효성 검사기에 알립니다.
if ($validator->stopOnFirstFailure()->fails()) {
// ...
}before:_date_
검증 대상 필드는 주어진 날짜 이전의 값이어야 합니다. 날짜는 PHP strtotime 함수에 전달되어 유효한 DateTime 인스턴스로 변환됩니다. 또한 after 규칙과 마찬가지로, date 값으로 검증 중인 다른 필드의 이름을 지정할 수 있습니다.
편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더로도 만들 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->before(today()->subDays(7)),
],beforeToday와 todayOrBefore 메서드를 사용하면 각각 "오늘 이전이어야 한다", "오늘이거나 오늘 이전이어야 한다"는 조건을 플루언트하게 표현할 수 있습니다.
'start_date' => [
'required',
Rule::date()->beforeToday(),
],before\_or\_equal:_date_
검증 대상 필드는 주어진 날짜와 같거나 그 이전의 값이어야 합니다. 날짜는 PHP strtotime 함수에 전달되어 유효한 DateTime 인스턴스로 변환됩니다. 또한 after 규칙과 마찬가지로, date 값으로 검증 중인 다른 필드의 이름을 지정할 수 있습니다.
편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더로도 만들 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->beforeOrEqual(today()->subDays(7)),
],between:_min_,_max_
검증 대상 필드의 크기는 주어진 min 이상 max 이하(경계값 포함)여야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 방식으로 평가됩니다.
boolean
검증 대상 필드는 불리언으로 형 변환할 수 있어야 합니다. 허용되는 입력값은 true, false, 1, 0, "1", "0"입니다.
strict 파라미터를 사용하면 값이 true 또는 false일 때만 유효한 것으로 간주합니다.
'foo' => ['boolean:strict']또는 Rule::boolean 메서드에 true를 전달해 엄격한 검증을 활성화할 수도 있습니다.
'foo' => [Rule::boolean(true)],confirmed
검증 대상 필드와 일치하는 {field}_confirmation 필드가 있어야 합니다. 예를 들어 검증 대상 필드가 password라면, 입력에 일치하는 password_confirmation 필드가 있어야 합니다.
커스텀 확인 필드 이름을 전달할 수도 있습니다. 예를 들어 confirmed:repeat_username은 repeat_username 필드가 검증 대상 필드와 일치해야 한다는 뜻입니다.
Rule::confirmed 메서드를 사용하고 customField 메서드로 커스텀 확인 필드를 지정할 수도 있습니다.
'username' => [Rule::confirmed()->customField('repeat_username')],contains:_foo_,_bar_,...
검증 대상 필드는 주어진 파라미터 값을 모두 포함하는 배열이어야 합니다. 이 규칙은 배열을 implode해야 하는 경우가 많으므로, Rule::contains 메서드로 규칙을 플루언트하게 구성할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'roles' => [
'required',
'array',
Rule::contains(['admin', 'editor']),
],
]);doesnt_contain:_foo_,_bar_,...
검증 대상 필드는 주어진 파라미터 값을 하나도 포함하지 않는 배열이어야 합니다. 이 규칙은 배열을 implode해야 하는 경우가 많으므로, Rule::doesntContain 메서드로 규칙을 플루언트하게 구성할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'roles' => [
'required',
'array',
Rule::doesntContain(['admin', 'editor']),
],
]);current_password
검증 대상 필드는 인증된 사용자의 비밀번호와 일치해야 합니다. 규칙의 첫 번째 파라미터로 인증 가드를 지정할 수 있습니다.
'password' => ['current_password:api']또는 Rule::currentPassword 메서드를 사용하고 guard 메서드로 인증 가드를 지정할 수도 있습니다.
'password' => [Rule::currentPassword()->guard('api')],date
검증 대상 필드는 PHP strtotime 함수 기준으로 유효한 비상대(non-relative) 날짜여야 합니다.
date_equals:_date_
검증 대상 필드는 주어진 날짜와 같아야 합니다. 날짜는 PHP strtotime 함수에 전달되어 유효한 DateTime 인스턴스로 변환됩니다.
편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더로 만들 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [Rule::date()->equals('2026-01-01')],equals 메서드는 날짜 문자열, DateTimeInterface 인스턴스, 또는 비교할 다른 필드의 이름을 받습니다.
date_format:_format_,...
검증 대상 필드는 주어진 형식(format) 중 하나와 일치해야 합니다. 필드를 검증할 때는 date와 date_format 중 하나만 사용해야 하며 둘을 함께 사용하면 안 됩니다. 이 유효성 검사 규칙은 PHP DateTime 클래스가 지원하는 모든 형식을 지원합니다.
편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더로 만들 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->format('Y-m-d'),
],decimal:_min_,_max_
검증 대상 필드는 숫자여야 하며 지정한 자릿수의 소수점 이하 자리를 가져야 합니다.
// Must have exactly two decimal places (9.99)...
'price' => ['decimal:2']
// Must have between 2 and 4 decimal places...
'price' => ['decimal:2,4']declined
검증 대상 필드는 "no", "off", 0, "0", false, "false" 중 하나여야 합니다.
declined_if:anotherfield,value,...
검증 대상 필드는, 검증 중인 다른 필드가 지정한 값과 같을 경우 "no", "off", 0, "0", false, "false" 중 하나여야 합니다.
different:_field_
검증 대상 필드는 field 와 다른 값이어야 합니다.
digits:_value_
검증 대상 정수는 길이가 정확히 value 자리여야 합니다.
digits_between:_min_,_max_
검증 대상 정수의 길이는 주어진 min 이상 max 이하여야 합니다.
dimensions
검증 대상 파일은 규칙의 파라미터로 지정한 크기 제약 조건을 만족하는 이미지여야 합니다.
'avatar' => ['dimensions:min_width=100,min_height=200']사용 가능한 제약 조건은 min_width, max_width, min_height, max_height, width, height, ratio, min_ratio, max_ratio 입니다.
ratio 제약 조건은 너비를 높이로 나눈 값으로 표현해야 합니다. 3/2 같은 분수나 1.5 같은 실수로 지정할 수 있습니다.
'avatar' => ['dimensions:ratio=3/2']_min_ratio_와 max_ratio 제약 조건으로 허용되는 가로세로 비율의 범위를 정의할 수 있습니다.
'avatar' => ['dimensions:min_ratio=1/2,max_ratio=3/2']이 규칙은 인자가 여러 개 필요하므로, Rule::dimensions 메서드로 규칙을 플루언트하게 구성하는 편이 더 편리한 경우가 많습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'avatar' => [
'required',
Rule::dimensions()
->maxWidth(1000)
->maxHeight(500)
->ratio(3 / 2),
],
]);minRatio, maxRatio, ratioBetween 메서드로도 비율 제약 조건을 플루언트하게 정의할 수 있습니다.
Rule::dimensions()->ratioBetween(min: 1 / 2, max: 3 / 2);distinct
배열을 검증할 때, 검증 대상 필드에 중복된 값이 있어서는 안 됩니다.
'foo.*.id' => ['distinct']distinct는 기본적으로 느슨한(loose) 변수 비교를 사용합니다. 엄격한(strict) 비교를 사용하려면 규칙 정의에 strict 파라미터를 추가합니다.
'foo.*.id' => ['distinct:strict']규칙의 인자에 ignore_case를 추가하면 대소문자 차이를 무시합니다.
'foo.*.id' => ['distinct:ignore_case']또는 Rule::distinct 메서드를 사용하고 필요에 따라 strict, ignoreCase 메서드를 체이닝할 수 있습니다.
'foo.*.id' => [Rule::distinct()->strict()->ignoreCase()],doesnt_start_with:_foo_,_bar_,...
검증 대상 필드는 주어진 값들 중 어느 것으로도 시작하지 않아야 합니다.
doesnt_end_with:_foo_,_bar_,...
검증 대상 필드는 주어진 값들 중 어느 것으로도 끝나지 않아야 합니다.
검증 대상 필드는 이메일 주소 형식이어야 합니다. 이 유효성 검사 규칙은 이메일 주소 검증에 egulias/email-validator 패키지를 사용합니다. 기본적으로 RFCValidation 검증기가 적용되지만, 다른 검증 방식도 적용할 수 있습니다.
'email' => ['email:rfc,dns']위 예제는 RFCValidation과 DNSCheckValidation 검증을 적용합니다. 적용할 수 있는 검증 방식의 전체 목록은 다음과 같습니다.
rfc:RFCValidation- 지원되는 RFC에 따라 이메일 주소를 검증합니다.strict:NoRFCWarningsValidation- 지원되는 RFC에 따라 이메일을 검증하되, 경고가 발견되면(예: 끝에 붙은 마침표, 연속된 마침표) 실패 처리합니다.dns:DNSCheckValidation- 이메일 주소의 도메인에 유효한 MX 레코드가 있는지 확인합니다.spoof:SpoofCheckValidation- 이메일 주소에 동형이의(homograph) 문자나 오인을 유발하는 유니코드 문자가 포함되어 있지 않은지 확인합니다.filter:FilterEmailValidation- PHP의filter_var함수 기준으로 이메일 주소가 유효한지 확인합니다.filter_unicode:FilterEmailValidation::unicode()- PHP의filter_var함수 기준으로 이메일 주소가 유효한지 확인하되, 일부 유니코드 문자를 허용합니다.
편의를 위해 이메일 유효성 검사 규칙은 플루언트 규칙 빌더로 만들 수 있습니다.
use Illuminate\Validation\Rule;
$request->validate([
'email' => [
'required',
Rule::email()
->rfcCompliant(strict: false)
->validateMxRecord()
->preventSpoofing()
],
]);dns 검증기는 실제 DNS 조회를 수행해 주소의 도메인에 유효한 MX 레코드가 있는지 확인합니다. 개별 메일함이 존재하는지까지 판단하지는 않습니다.
테스트가 실제 DNS 조회에 의존해서는 안 되므로, Validator::fakeDnsLookups 메서드로 DNS 조회를 가짜로 처리하면서 rfc 같은 나머지 요청된 검증은 계속 실행되도록 할 수 있습니다.
use Illuminate\Support\Facades\Validator;
Validator::fakeDnsLookups();이렇게 하면 테스트 중에도 애플리케이션의 기존 유효성 검사 규칙을 그대로 사용할 수 있습니다.
'email' => ['required', 'email:rfc,dns'],WARNING
dns와 spoof 검증기를 사용하려면 PHP intl 확장이 필요합니다.
encoding:*encoding_type*
검증 대상 필드는 지정한 문자 인코딩과 일치해야 합니다. 이 규칙은 PHP의 mb_check_encoding 함수를 사용해 주어진 파일 또는 문자열 값의 인코딩을 확인합니다. 편의를 위해 encoding 규칙은 Laravel의 플루언트 파일 규칙 빌더로 구성할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\File;
Validator::validate($input, [
'attachment' => [
'required',
File::types(['csv'])
->encoding('utf-8'),
],
]);ends_with:_foo_,_bar_,...
검증 대상 필드는 주어진 값들 중 하나로 끝나야 합니다.
enum
Enum 규칙은 검증 대상 필드가 유효한 enum 값을 담고 있는지 검증하는 클래스 기반 규칙입니다. Enum 규칙은 생성자 인자로 enum의 이름만 받습니다. 원시(primitive) 값을 검증할 때는 Enum 규칙에 백업(backed) Enum을 제공해야 합니다.
use App\Enums\ServerStatus;
use Illuminate\Validation\Rule;
$request->validate([
'status' => [Rule::enum(ServerStatus::class)],
]);Enum 규칙의 only와 except 메서드로 유효한 것으로 간주할 enum 케이스를 제한할 수 있습니다.
Rule::enum(ServerStatus::class)
->only([ServerStatus::Pending, ServerStatus::Active]);
Rule::enum(ServerStatus::class)
->except([ServerStatus::Pending, ServerStatus::Active]);when 메서드를 사용하면 Enum 규칙을 조건부로 수정할 수 있습니다.
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
Rule::enum(ServerStatus::class)
->when(
Auth::user()->isAdmin(),
fn ($rule) => $rule->only(...),
fn ($rule) => $rule->only(...),
);exclude
검증 대상 필드는 validate 및 validated 메서드가 반환하는 요청 데이터에서 제외됩니다.
exclude_if:_anotherfield_,_value_
anotherfield 필드가 value 와 같으면, 검증 대상 필드는 validate 및 validated 메서드가 반환하는 요청 데이터에서 제외됩니다.
복잡한 조건부 제외 로직이 필요하다면 Rule::excludeIf 메서드를 사용할 수 있습니다. 이 메서드는 불리언 값 또는 클로저를 받습니다. 클로저를 전달하면 검증 대상 필드를 제외해야 하는지 여부를 true 또는 false로 반환해야 합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => [Rule::excludeIf($request->user()->is_admin)],
]);
Validator::make($request->all(), [
'role_id' => [Rule::excludeIf(fn () => $request->user()->is_admin)],
]);exclude_unless:_anotherfield_,_value_
anotherfield 필드가 value 와 같지 않으면, 검증 대상 필드는 validate 및 validated 메서드가 반환하는 요청 데이터에서 제외됩니다. value 가 null이면(exclude_unless:name,null), 비교 필드가 null이거나 요청 데이터에 비교 필드가 없는 경우를 제외하고는 검증 대상 필드가 제외됩니다.
복잡한 조건부 제외 로직이 필요하다면 Rule::excludeUnless 메서드를 사용할 수 있습니다. 이 메서드는 불리언 값 또는 클로저를 받습니다. 클로저를 전달하면 검증 대상 필드를 제외하지 않아야 하는지 여부를 true 또는 false로 반환해야 합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => [Rule::excludeUnless($request->user()->is_admin)],
]);
Validator::make($request->all(), [
'role_id' => [Rule::excludeUnless(fn () => $request->user()->is_admin)],
]);exclude_with:_anotherfield_
anotherfield 필드가 존재하면, 검증 대상 필드는 validate 및 validated 메서드가 반환하는 요청 데이터에서 제외됩니다.
exclude_without:_anotherfield_
anotherfield 필드가 존재하지 않으면, 검증 대상 필드는 validate 및 validated 메서드가 반환하는 요청 데이터에서 제외됩니다.
exists:_table_,_column_
검증 대상 필드는 지정한 데이터베이스 테이블에 존재해야 합니다.
Exists 규칙의 기본 사용법
'state' => ['exists:states']column 옵션을 지정하지 않으면 필드 이름이 사용됩니다. 따라서 이 경우 규칙은 states 데이터베이스 테이블에, 요청의 state 속성 값과 일치하는 state 컬럼 값을 가진 레코드가 있는지 검증합니다.
커스텀 컬럼 이름 지정하기
데이터베이스 테이블 이름 뒤에 컬럼 이름을 붙이면 유효성 검사 규칙이 사용할 데이터베이스 컬럼 이름을 명시적으로 지정할 수 있습니다.
'state' => ['exists:states,abbreviation']경우에 따라 exists 쿼리에 특정 데이터베이스 커넥션을 사용해야 할 수도 있습니다. 이럴 때는 테이블 이름 앞에 커넥션 이름을 붙이면 됩니다.
'email' => ['exists:connection.staff,email']테이블 이름을 직접 지정하는 대신, 테이블 이름을 결정하는 데 사용할 Eloquent 모델을 지정할 수도 있습니다.
'user_id' => ['exists:App\Models\User,id']유효성 검사 규칙이 실행하는 쿼리를 커스터마이징하고 싶다면 Rule 클래스를 사용해 규칙을 플루언트하게 정의할 수 있습니다.
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function (Builder $query) {
$query->where('account_id', 1);
}),
],
]);Rule::exists 메서드로 생성한 exists 규칙이 사용할 데이터베이스 컬럼 이름은 exists 메서드의 두 번째 인자로 컬럼 이름을 전달해 명시적으로 지정할 수 있습니다.
'state' => [Rule::exists('states', 'abbreviation')],값의 배열이 데이터베이스에 존재하는지 검증해야 할 때도 있습니다. 검증할 필드에 exists 규칙과 array 규칙을 함께 추가하면 됩니다.
'states' => ['array', Rule::exists('states', 'abbreviation')],이 두 규칙이 한 필드에 함께 지정되면, Laravel은 주어진 모든 값이 지정한 테이블에 존재하는지 확인하는 단일 쿼리를 자동으로 만듭니다.
extensions:_foo_,_bar_,...
검증 대상 파일은 나열된 확장자 중 하나에 해당하는, 사용자가 지정한 확장자를 가져야 합니다.
'photo' => ['required', 'extensions:jpg,png'],file
검증 대상 필드는 정상적으로 업로드된 파일이어야 합니다.
filled
검증 대상 필드는 존재할 때 비어 있어서는 안 됩니다.
gt:_field_
검증 대상 필드는 주어진 field 또는 value 보다 커야 합니다. 두 필드는 같은 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 규칙으로 평가됩니다.
gte:_field_
검증 대상 필드는 주어진 field 또는 value 보다 크거나 같아야 합니다. 두 필드는 같은 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 규칙으로 평가됩니다.
hex_color
검증 대상 필드는 16진수 형식의 유효한 색상 값이어야 합니다.
image
검증 대상 파일은 이미지(jpg, jpeg, png, bmp, gif, webp, avif, heic, heif)여야 합니다.
WARNING
기본적으로 image 규칙은 XSS 취약점 가능성 때문에 SVG 파일을 허용하지 않습니다. SVG 파일을 허용해야 한다면 image 규칙에 allow_svg 지시자를 지정하세요(image:allow_svg).
in:_foo_,_bar_,...
검증 대상 필드는 주어진 값 목록에 포함되어야 합니다. 이 규칙은 배열을 implode해야 하는 경우가 많으므로, Rule::in 메서드로 규칙을 플루언트하게 구성할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
],
]);in 규칙을 array 규칙과 함께 사용하면, 입력 배열의 모든 값이 in 규칙에 지정한 값 목록에 포함되어 있어야 합니다. 다음 예제에서 입력 배열의 LAS 공항 코드는 in 규칙에 지정한 공항 목록에 없으므로 유효하지 않습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
$input = [
'airports' => ['NYC', 'LAS'],
];
Validator::make($input, [
'airports' => [
'required',
'array',
],
'airports.*' => Rule::in(['NYC', 'LIT']),
]);in_array:_anotherfield_.*
검증 대상 필드는 anotherfield 의 값들 안에 존재해야 합니다.
in_array_keys:_value_.*
검증 대상 필드는 주어진 값 중 하나 이상을 키로 가진 배열이어야 합니다.
'config' => ['array', 'in_array_keys:timezone']integer
검증 대상 필드는 정수여야 합니다.
strict 파라미터를 사용하면 타입이 integer인 경우에만 유효한 것으로 간주합니다. 정수 값을 가진 문자열은 유효하지 않은 것으로 처리됩니다.
'age' => ['integer:strict']WARNING
이 유효성 검사 규칙은 입력값이 "integer" 변수 타입인지 확인하는 것이 아니라, PHP의 FILTER_VALIDATE_INT 규칙이 허용하는 타입인지만 확인합니다. 입력값이 숫자인지까지 검증해야 한다면 이 규칙을 numeric 유효성 검사 규칙과 함께 사용하세요.
ip
검증 대상 필드는 IP 주소여야 합니다.
Rule::ip 메서드를 사용할 수도 있으며, 필요하다면 IP 버전을 4 또는 6으로 제한할 수 있습니다.
'ip_address' => [Rule::ip()],
'ipv4_address' => [Rule::ip()->version(4)],
'ipv6_address' => [Rule::ip()->version(6)],ipv4
검증 대상 필드는 IPv4 주소여야 합니다.
ipv6
검증 대상 필드는 IPv6 주소여야 합니다.
json
검증 대상 필드는 유효한 JSON 문자열이어야 합니다.
lt:_field_
검증 대상 필드는 주어진 field 보다 작아야 합니다. 두 필드는 같은 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 규칙으로 평가됩니다.
lte:_field_
검증 대상 필드는 주어진 field 보다 작거나 같아야 합니다. 두 필드는 같은 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 규칙으로 평가됩니다.
lowercase
검증 대상 필드는 소문자여야 합니다.
list
검증 대상 필드는 리스트(list)인 배열이어야 합니다. 배열의 키가 0부터 count($array) - 1까지의 연속된 숫자로 이루어져 있으면 리스트로 간주합니다.
mac_address
검증 대상 필드는 MAC 주소여야 합니다.
max:_value_
검증 대상 필드는 최댓값 value 보다 작거나 같아야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 방식으로 평가됩니다.
max_digits:_value_
검증 대상 정수의 최대 길이는 value 자리입니다.
mimetypes:_text/plain_,...
검증 대상 파일은 주어진 MIME 타입 중 하나와 일치해야 합니다.
'video' => ['mimetypes:video/avi,video/mpeg,video/quicktime'],
'media' => ['mimetypes:image/*,video/*'],업로드된 파일의 MIME 타입을 판별하기 위해 파일 내용을 읽고 프레임워크가 MIME 타입을 추측하는데, 이는 클라이언트가 제공한 MIME 타입과 다를 수 있습니다.
mimes:_foo_,_bar_,...
검증 대상 파일은 나열된 확장자 중 하나에 해당하는 MIME 타입을 가져야 합니다.
'photo' => ['mimes:jpg,bmp,png']확장자만 지정하면 되지만, 이 규칙은 실제로 파일 내용을 읽고 MIME 타입을 추측하여 MIME 타입을 검증합니다. MIME 타입과 그에 대응하는 확장자의 전체 목록은 다음 위치에서 확인할 수 있습니다.
https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
MIME 타입과 확장자
이 유효성 검사 규칙은 MIME 타입과 사용자가 파일에 지정한 확장자가 일치하는지는 확인하지 않습니다. 예를 들어 mimes:png 규칙은 유효한 PNG 내용을 담은 파일이라면 파일 이름이 photo.txt여도 유효한 PNG 이미지로 간주합니다. 사용자가 지정한 파일 확장자를 검증하고 싶다면 extensions 규칙을 사용할 수 있습니다.
WARNING
이미지 유효성 검사를 통과했다고 해서, .php 확장자로 저장된 파일이 PHP로 실행되는 것을 막을 수 있는 것은 아닙니다. GIF나 JPEG 매직 바이트로 시작하는 파일은 PHP 페이로드를 포함하고 있어도 mimes:gif 또는 mimes:jpg 검증을 통과할 수 있습니다. 업로드된 파일을 저장할 때는 항상 시스템이 생성한 파일 이름(예: hashName())을 사용하고, 웹 서버가 스토리지 디렉터리 안에서 PHP를 실행하지 못하도록 설정하세요.
min:_value_
검증 대상 필드는 최솟값 value 이상이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 같은 방식으로 평가됩니다.
min_digits:_value_
검증 대상 정수의 최소 길이는 value 자리입니다.
multiple_of:_value_
검증 대상 필드는 value 의 배수여야 합니다.
missing
검증 대상 필드는 입력 데이터에 존재하지 않아야 합니다.
missing_if:_anotherfield_,_value_,...
anotherfield 필드가 어떤 value 와 같으면, 검증 대상 필드는 존재하지 않아야 합니다.
missing_unless:_anotherfield_,_value_
anotherfield 필드가 어떤 value 와 같은 경우를 제외하고, 검증 대상 필드는 존재하지 않아야 합니다.
missing_with:_foo_,_bar_,...
지정한 다른 필드 중 하나라도 존재하는 경우 에만 검증 대상 필드가 존재하지 않아야 합니다.
missing_with_all:_foo_,_bar_,...
지정한 다른 필드가 모두 존재하는 경우 에만 검증 대상 필드가 존재하지 않아야 합니다.
not_in:_foo_,_bar_,...
검증 대상 필드는 주어진 값 목록에 포함되어서는 안 됩니다. Rule::notIn 메서드로 규칙을 플루언트하게 구성할 수 있습니다.
use Illuminate\Validation\Rule;
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);not_regex:_pattern_
검증 대상 필드는 주어진 정규 표현식과 일치해서는 안 됩니다.
내부적으로 이 규칙은 PHP preg_match 함수를 사용합니다. 지정하는 패턴은 preg_match가 요구하는 형식을 따라야 하므로 유효한 구분자(delimiter)도 포함해야 합니다. 예: 'email' => ['not_regex:/^.+$/i']
nullable
검증 대상 필드는 null일 수 있습니다.
numeric
검증 대상 필드는 숫자여야 합니다.
strict 파라미터를 사용하면 값이 정수 또는 실수(float) 타입일 때만 유효한 것으로 간주합니다. 숫자 문자열은 유효하지 않은 것으로 처리됩니다.
'amount' => ['numeric:strict']present
검증 대상 필드는 입력 데이터에 존재해야 합니다.
present_if:_anotherfield_,_value_,...
anotherfield 필드가 어떤 value 와 같으면, 검증 대상 필드는 존재해야 합니다.
present_unless:_anotherfield_,_value_
anotherfield 필드가 어떤 value 와 같은 경우를 제외하고, 검증 대상 필드는 존재해야 합니다.
present_with:_foo_,_bar_,...
지정한 다른 필드 중 하나라도 존재하는 경우 에만 검증 대상 필드가 존재해야 합니다.
present_with_all:_foo_,_bar_,...
지정한 다른 필드가 모두 존재하는 경우 에만 검증 대상 필드가 존재해야 합니다.
prohibited
검증 대상 필드는 없거나 비어 있어야 합니다. 다음 조건 중 하나를 만족하면 필드가 "비어 있다"고 봅니다.
- 값이
null입니다. - 값이 빈 문자열입니다.
- 값이 빈 배열 또는 빈
Countable객체입니다. - 값이 경로가 비어 있는 업로드 파일입니다.
prohibited_if:_anotherfield_,_value_,...
anotherfield 필드가 어떤 value 와 같으면, 검증 대상 필드는 없거나 비어 있어야 합니다. 다음 조건 중 하나를 만족하면 필드가 "비어 있다"고 봅니다.
- 값이
null입니다. - 값이 빈 문자열입니다.
- 값이 빈 배열 또는 빈
Countable객체입니다. - 값이 경로가 비어 있는 업로드 파일입니다.
복잡한 조건부 금지 로직이 필요하다면 Rule::prohibitedIf 메서드를 사용할 수 있습니다. 이 메서드는 불리언 값 또는 클로저를 받습니다. 클로저를 전달하면 검증 대상 필드를 금지해야 하는지 여부를 true 또는 false로 반환해야 합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => [Rule::prohibitedIf($request->user()->is_admin)],
]);
Validator::make($request->all(), [
'role_id' => [Rule::prohibitedIf(fn () => $request->user()->is_admin)],
]);prohibited_if_accepted:_anotherfield_,...
anotherfield 필드가 "yes", "on", 1, "1", true, "true" 중 하나이면, 검증 대상 필드는 없거나 비어 있어야 합니다.
prohibited_if_declined:_anotherfield_,...
anotherfield 필드가 "no", "off", 0, "0", false, "false" 중 하나이면, 검증 대상 필드는 없거나 비어 있어야 합니다.
prohibited_unless:_anotherfield_,_value_,...
anotherfield 필드가 어떤 value 와 같은 경우를 제외하고, 검증 대상 필드는 없거나 비어 있어야 합니다. 다음 조건 중 하나를 만족하면 필드가 "비어 있다"고 봅니다.
- 값이
null입니다. - 값이 빈 문자열입니다.
- 값이 빈 배열 또는 빈
Countable객체입니다. - 값이 경로가 비어 있는 업로드 파일입니다.
복잡한 조건부 금지 로직이 필요하다면 Rule::prohibitedUnless 메서드를 사용할 수 있습니다. 이 메서드는 불리언 값 또는 클로저를 받습니다. 클로저를 전달하면 검증 대상 필드를 금지하지 않아야 하는지 여부를 true 또는 false로 반환해야 합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => [Rule::prohibitedUnless($request->user()->is_admin)],
]);
Validator::make($request->all(), [
'role_id' => [Rule::prohibitedUnless(fn () => $request->user()->is_admin)],
]);prohibits:_anotherfield_,...
검증 대상 필드가 없거나 비어 있지 않다면, anotherfield 의 모든 필드는 없거나 비어 있어야 합니다. 다음 조건 중 하나를 만족하면 필드가 "비어 있다"고 봅니다.
- 값이
null입니다. - 값이 빈 문자열입니다.
- 값이 빈 배열 또는 빈
Countable객체입니다. - 값이 경로가 비어 있는 업로드 파일입니다.
regex:_pattern_
검증 대상 필드는 주어진 정규 표현식과 일치해야 합니다.
내부적으로 이 규칙은 PHP preg_match 함수를 사용합니다. 지정하는 패턴은 preg_match가 요구하는 형식을 따라야 하므로 유효한 구분자(delimiter)도 포함해야 합니다. 예: 'email' => ['regex:/^.+@.+$/i']
required
검증 대상 필드는 입력 데이터에 존재해야 하며 비어 있지 않아야 합니다. 다음 조건 중 하나를 만족하면 필드가 "비어 있다"고 봅니다.
- 값이
null입니다. - 값이 빈 문자열입니다.
- 값이 빈 배열 또는 빈
Countable객체입니다. - 값이 경로가 없는 업로드 파일입니다.
required_if:_anotherfield_,_value_,...
anotherfield 필드가 어떤 value 와 같으면, 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_if 규칙에 더 복잡한 조건을 만들고 싶다면 Rule::requiredIf 메서드를 사용할 수 있습니다. 이 메서드는 불리언 값 또는 클로저를 받습니다. 클로저를 전달하면 검증 대상 필드가 필수인지 여부를 true 또는 false로 반환해야 합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => [Rule::requiredIf($request->user()->is_admin)],
]);
Validator::make($request->all(), [
'role_id' => [Rule::requiredIf(fn () => $request->user()->is_admin)],
]);required_if_accepted:_anotherfield_,...
anotherfield 필드가 "yes", "on", 1, "1", true, "true" 중 하나이면, 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_if_declined:_anotherfield_,...
anotherfield 필드가 "no", "off", 0, "0", false, "false" 중 하나이면, 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_unless:_anotherfield_,_value_,...
anotherfield 필드가 어떤 value 와 같은 경우를 제외하고, 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다. 이는 value 가 null이 아닌 한 anotherfield 도 요청 데이터에 존재해야 한다는 뜻이기도 합니다. value 가 null이면(required_unless:name,null), 비교 필드가 null이거나 요청 데이터에 비교 필드가 없는 경우를 제외하고는 검증 대상 필드가 필수입니다.
required_unless 규칙에 더 복잡한 조건을 만들고 싶다면 Rule::requiredUnless 메서드를 사용할 수 있습니다. 이 메서드는 불리언 값 또는 클로저를 받습니다. 클로저를 전달하면 검증 대상 필드가 필수가 아닌지 여부를 true 또는 false로 반환해야 합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => [Rule::requiredUnless($request->user()->is_admin)],
]);
Validator::make($request->all(), [
'role_id' => [Rule::requiredUnless(fn () => $request->user()->is_admin)],
]);required_with:_foo_,_bar_,...
지정한 다른 필드 중 하나라도 존재하고 비어 있지 않은 경우 에만 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_with_all:_foo_,_bar_,...
지정한 다른 필드가 모두 존재하고 비어 있지 않은 경우 에만 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_without:_foo_,_bar_,...
지정한 다른 필드 중 하나라도 비어 있거나 존재하지 않는 경우 에만 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_without_all:_foo_,_bar_,...
지정한 다른 필드가 모두 비어 있거나 존재하지 않는 경우 에만 검증 대상 필드는 존재해야 하며 비어 있지 않아야 합니다.
required_array_keys:_foo_,_bar_,...
검증 대상 필드는 배열이어야 하며, 최소한 지정한 키들을 포함해야 합니다.
same:_field_
주어진 field 는 검증 대상 필드와 일치해야 합니다.
size:_value_
검증 대상 필드의 크기는 주어진 value 와 일치해야 합니다. 문자열 데이터에서 value 는 문자 수에 해당합니다. 숫자 데이터에서 value 는 지정한 정수 값에 해당합니다(해당 속성에는 numeric 또는 integer 규칙도 함께 지정해야 합니다). 배열에서 size 는 배열의 count에 해당합니다. 파일에서 size 는 킬로바이트 단위의 파일 크기에 해당합니다. 예제를 살펴보겠습니다.
// Validate that a string is exactly 12 characters long...
'title' => ['size:12'];
// Validate that a provided integer equals 10...
'seats' => ['integer', 'size:10'];
// Validate that an array has exactly 5 elements...
'tags' => ['array', 'size:5'];
// Validate that an uploaded file is exactly 512 kilobytes...
'image' => ['file', 'size:512'];starts_with:_foo_,_bar_,...
검증 대상 필드는 주어진 값 중 하나로 시작해야 합니다.
string
검증 대상 필드는 문자열이어야 합니다. 필드에 null도 허용하고 싶다면 nullable 규칙을 함께 지정해야 합니다.
편의를 위해 문자열 유효성 검사 규칙은 플루언트 Rule::string() 규칙 빌더로도 만들 수 있습니다.
use Illuminate\Validation\Rule;
'title' => [
'required',
Rule::string()
->min(3)
->max(255)
->alphaDash(ascii: true),
],문자열 규칙 빌더는 alpha, alphaDash, alphaNumeric, ascii, between, doesntEndWith, doesntStartWith, endsWith, exactly, lowercase, max, min, startsWith, uppercase 등 자주 쓰는 문자열 제약 조건을 위한 메서드를 제공합니다. 이 규칙 빌더는 조건부(conditionable) 기능을 지원하므로, when과 unless 메서드로 제약 조건을 조건부로 적용할 수도 있습니다.
timezone
검증 대상 필드는 DateTimeZone::listIdentifiers 메서드 기준으로 유효한 타임존 식별자여야 합니다.
DateTimeZone::listIdentifiers 메서드가 받는 인자를 이 유효성 검사 규칙에도 전달할 수 있습니다.
'timezone' => ['required', 'timezone:all'];
'timezone' => ['required', 'timezone:Africa'];
'timezone' => ['required', 'timezone:per_country,US'];또는 Rule::timezone 메서드를 사용하고 listIdentifiers 인자를 배열로 전달할 수도 있습니다.
'timezone' => [Rule::timezone(['per_country', 'US'])],unique:_table_,_column_
검증 대상 필드는 주어진 데이터베이스 테이블에 존재하지 않아야 합니다.
커스텀 테이블 / 컬럼 이름 지정하기:
테이블 이름을 직접 지정하는 대신, 테이블 이름을 결정하는 데 사용할 Eloquent 모델을 지정할 수 있습니다.
'email' => ['unique:App\Models\User,email_address']column 옵션으로 필드에 대응하는 데이터베이스 컬럼을 지정할 수 있습니다. column 옵션을 지정하지 않으면 검증 대상 필드의 이름이 사용됩니다.
'email' => ['unique:users,email_address']커스텀 데이터베이스 커넥션 지정하기
경우에 따라 유효성 검사기가 실행하는 데이터베이스 쿼리에 커스텀 커넥션을 설정해야 할 수도 있습니다. 이럴 때는 테이블 이름 앞에 커넥션 이름을 붙이면 됩니다.
'email' => ['unique:connection.users,email_address']특정 ID를 무시하도록 Unique 규칙 설정하기:
unique 검사에서 특정 ID를 무시하고 싶을 때가 있습니다. 예를 들어 사용자의 이름, 이메일 주소, 위치를 포함하는 "프로필 수정" 화면을 생각해 보겠습니다. 이때 이메일 주소가 유일한지 검증하고 싶을 것입니다. 하지만 사용자가 이름 필드만 바꾸고 이메일 필드는 바꾸지 않았다면, 해당 이메일 주소의 소유자가 이미 그 사용자이므로 유효성 검사 오류가 발생하지 않아야 합니다.
유효성 검사기가 사용자의 ID를 무시하도록 하려면 Rule 클래스로 규칙을 플루언트하게 정의합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);WARNING
사용자가 제어하는 요청 입력값을 ignore 메서드에 절대 전달해서는 안 됩니다. 대신 Eloquent 모델 인스턴스의 자동 증가 ID나 UUID처럼 시스템이 생성한 고유 ID만 전달해야 합니다. 그렇지 않으면 애플리케이션이 SQL 인젝션 공격에 취약해집니다.
모델 키 값을 ignore 메서드에 전달하는 대신 모델 인스턴스 전체를 전달할 수도 있습니다. Laravel이 모델에서 키를 자동으로 추출합니다.
Rule::unique('users')->ignore($user);테이블의 기본 키 컬럼 이름이 id가 아니라면 ignore 메서드를 호출할 때 컬럼 이름을 지정할 수 있습니다.
Rule::unique('users')->ignore($user->id, 'user_id');기본적으로 unique 규칙은 검증 중인 속성의 이름과 일치하는 컬럼의 고유성을 검사합니다. 하지만 unique 메서드의 두 번째 인자로 다른 컬럼 이름을 전달할 수 있습니다.
Rule::unique('users', 'email_address')->ignore($user->id);추가 Where 절 지정하기:
where 메서드로 쿼리를 커스터마이징하여 추가 쿼리 조건을 지정할 수 있습니다. 예를 들어 account_id 컬럼 값이 1인 레코드만 검색하도록 쿼리 범위를 제한하는 조건을 추가해 보겠습니다.
'email' => Rule::unique('users')->where(fn (Builder $query) => $query->where('account_id', 1))Unique 검사에서 소프트 삭제된 레코드 무시하기:
기본적으로 unique 규칙은 고유성을 판단할 때 소프트 삭제된 레코드도 포함합니다. 소프트 삭제된 레코드를 고유성 검사에서 제외하려면 withoutTrashed 메서드를 호출합니다.
Rule::unique('users')->withoutTrashed();모델이 소프트 삭제 레코드에 deleted_at이 아닌 다른 컬럼 이름을 사용한다면, withoutTrashed 메서드를 호출할 때 해당 컬럼 이름을 전달할 수 있습니다.
Rule::unique('users')->withoutTrashed('was_deleted_at');uppercase
검증 대상 필드는 대문자여야 합니다.
url
검증 대상 필드는 유효한 URL이어야 합니다.
유효한 것으로 간주할 URL 프로토콜을 지정하고 싶다면 프로토콜을 유효성 검사 규칙 파라미터로 전달할 수 있습니다.
'url' => ['url:http,https'],
'game' => ['url:minecraft,steam'],또는 Rule::url 메서드를 사용하고 protocols 메서드로 허용할 프로토콜을 지정할 수도 있습니다.
'url' => [Rule::url()->protocols(['http', 'https'])],ulid
검증 대상 필드는 유효한 ULID(Universally Unique Lexicographically Sortable Identifier)여야 합니다.
uuid
검증 대상 필드는 유효한 RFC 9562(버전 1, 3, 4, 5, 6, 7, 8) 범용 고유 식별자(UUID)여야 합니다.
주어진 UUID가 특정 버전의 UUID 명세와 일치하는지 검증할 수도 있습니다.
'uuid' => ['uuid:4']또는 Rule::uuid 메서드를 사용하고 version 메서드로 UUID 버전을 지정할 수도 있습니다.
'uuid' => [Rule::uuid()->version(4)],조건부로 규칙 추가하기
특정 값일 때 유효성 검사 건너뛰기
다른 필드가 특정 값을 가질 때는 주어진 필드를 검증하지 않고 싶을 때가 있습니다. 이럴 때는 exclude_if 유효성 검사 규칙을 사용합니다. 다음 예제에서는 has_appointment 필드의 값이 false이면 appointment_date와 doctor_name 필드를 검증하지 않습니다.
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($data, [
'has_appointment' => ['required', 'boolean'],
'appointment_date' => ['exclude_if:has_appointment,false', 'required', 'date'],
'doctor_name' => ['exclude_if:has_appointment,false', 'required', 'string'],
]);또는 exclude_unless 규칙을 사용하면, 다른 필드가 특정 값을 가지는 경우를 제외하고 주어진 필드를 검증하지 않습니다.
$validator = Validator::make($data, [
'has_appointment' => ['required', 'boolean'],
'appointment_date' => ['exclude_unless:has_appointment,true', 'required', 'date'],
'doctor_name' => ['exclude_unless:has_appointment,true', 'required', 'string'],
]);존재할 때만 유효성 검사하기
필드가 검증 대상 데이터에 존재할 때만 해당 필드를 검사하고 싶은 상황이 있습니다. 이를 빠르게 구현하려면 규칙 목록에 sometimes 규칙을 추가하세요.
$validator = Validator::make($data, [
'email' => ['sometimes', 'required', 'email'],
]);위 예제에서 email 필드는 $data 배열에 존재할 때만 검증됩니다.
NOTE
항상 존재해야 하지만 비어 있을 수 있는 필드를 검증하려는 경우에는 선택 입력 필드에 대한 참고 사항을 확인하세요.
복잡한 조건부 유효성 검사
더 복잡한 조건 로직에 따라 유효성 검사 규칙을 추가하고 싶을 때가 있습니다. 예를 들어 다른 필드의 값이 100보다 클 때만 특정 필드를 필수로 지정하거나, 다른 필드가 존재할 때만 두 필드가 특정 값을 가지도록 해야 할 수 있습니다. 이런 규칙을 추가하는 일이 어렵지는 않습니다. 먼저 절대 바뀌지 않는 고정 규칙 으로 Validator 인스턴스를 생성합니다.
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'email' => ['required', 'email'],
'games' => ['required', 'integer', 'min:0'],
]);우리 웹 애플리케이션이 게임 수집가를 위한 서비스라고 가정해 보겠습니다. 게임 수집가가 가입할 때 보유한 게임이 100개를 넘는다면, 왜 그렇게 많은 게임을 가지고 있는지 설명하도록 하고 싶습니다. 예를 들어 게임 중고 판매점을 운영하거나, 단순히 게임 수집이 취미일 수 있습니다. 이 요구 사항을 조건부로 추가하려면 Validator 인스턴스의 sometimes 메서드를 사용하면 됩니다.
use Illuminate\Support\Fluent;
$validator->sometimes('reason', ['required', 'max:500'], function (Fluent $input) {
return $input->games >= 100;
});sometimes 메서드의 첫 번째 인자는 조건부로 검증할 필드 이름이고, 두 번째 인자는 추가하려는 규칙 목록입니다. 세 번째 인자로 전달한 클로저가 true를 반환하면 규칙이 추가됩니다. 이 메서드를 사용하면 복잡한 조건부 유효성 검사를 손쉽게 만들 수 있습니다. 여러 필드에 대한 조건부 검증을 한 번에 추가할 수도 있습니다.
$validator->sometimes(['reason', 'cost'], 'required', function (Fluent $input) {
return $input->games >= 100;
});NOTE
클로저에 전달되는 $input 매개변수는 Illuminate\Support\Fluent의 인스턴스이며, 검증 중인 입력값과 파일에 접근하는 데 사용할 수 있습니다.
복잡한 조건부 배열 유효성 검사
인덱스를 알 수 없는 동일한 중첩 배열 안의 다른 필드를 기준으로 필드를 검증하고 싶을 때가 있습니다. 이런 경우 클로저가 두 번째 인자를 받도록 하면, 그 인자로 현재 검증 중인 배열의 개별 항목이 전달됩니다.
$input = [
'channels' => [
[
'type' => 'email',
'address' => 'abigail@example.com',
],
[
'type' => 'url',
'address' => 'https://example.com',
],
],
];
$validator->sometimes('channels.*.address', 'email', function (Fluent $input, Fluent $item) {
return $item->type === 'email';
});
$validator->sometimes('channels.*.address', 'url', function (Fluent $input, Fluent $item) {
return $item->type !== 'email';
});클로저에 전달되는 $input 매개변수와 마찬가지로, $item 매개변수는 속성 데이터가 배열일 때 Illuminate\Support\Fluent의 인스턴스이며, 그렇지 않으면 문자열입니다.
배열 유효성 검사
array 유효성 검사 규칙 문서에서 설명했듯이, array 규칙은 허용되는 배열 키의 목록을 받습니다. 배열에 목록에 없는 키가 있으면 유효성 검사에 실패합니다.
use Illuminate\Support\Facades\Validator;
$input = [
'user' => [
'name' => 'Taylor Otwell',
'username' => 'taylorotwell',
'admin' => true,
],
];
Validator::make($input, [
'user' => ['array:name,username'],
]);일반적으로 배열에 포함될 수 있는 키는 항상 명시해야 합니다. 그렇지 않으면 유효성 검사기의 validate 및 validated 메서드가, 다른 중첩 배열 유효성 검사 규칙으로 검증되지 않은 키까지 포함하여 배열과 모든 키를 검증된 데이터로 반환합니다.
중첩 배열 입력 검사하기
중첩된 배열 기반 폼 입력 필드를 검증하는 일은 어렵지 않습니다. "점(dot) 표기법"으로 배열 안의 속성을 검증할 수 있습니다. 예를 들어 들어온 HTTP 요청에 photos[profile] 필드가 있다면 다음과 같이 검증할 수 있습니다.
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'photos.profile' => ['required', 'image'],
]);배열의 각 요소를 검증할 수도 있습니다. 예를 들어 배열 입력 필드의 각 이메일이 유일한지 검증하려면 다음과 같이 합니다.
$validator = Validator::make($request->all(), [
'users.*.email' => ['email', 'unique:users'],
'users.*.first_name' => ['required_with:users.*.last_name'],
]);마찬가지로 언어 파일에서 커스텀 유효성 검사 메시지를 지정할 때도 * 문자를 사용할 수 있어, 배열 기반 필드에 하나의 검증 메시지를 손쉽게 적용할 수 있습니다.
'custom' => [
'users.*.email' => [
'unique' => 'Each user must have a unique email address',
]
],중첩 배열 데이터에 접근하기
속성에 유효성 검사 규칙을 지정할 때 특정 중첩 배열 요소의 값에 접근해야 할 때가 있습니다. 이럴 때는 Rule::forEach 메서드를 사용합니다. forEach 메서드는 검증 중인 배열 속성의 각 반복마다 호출되는 클로저를 받으며, 이 클로저는 속성의 값과 완전히 확장된 명시적 속성 이름을 전달받습니다. 클로저는 배열 요소에 지정할 규칙의 배열을 반환해야 합니다.
use App\Rules\HasPermission;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
$validator = Validator::make($request->all(), [
'companies.*.id' => Rule::forEach(function (string|null $value, string $attribute) {
return [
Rule::exists(Company::class, 'id'),
new HasPermission('manage-company', $value),
];
}),
]);오류 메시지의 인덱스와 위치
배열을 검증할 때, 유효성 검사에 실패한 특정 항목의 인덱스나 위치를 애플리케이션이 표시하는 오류 메시지에서 참조하고 싶을 수 있습니다. 이를 위해 커스텀 유효성 검사 메시지에 :index(0부터 시작), :position(1부터 시작), :ordinal-position(1st부터 시작) 플레이스홀더를 포함할 수 있습니다.
use Illuminate\Support\Facades\Validator;
$input = [
'photos' => [
[
'name' => 'BeachVacation.jpg',
'description' => 'A photo of my beach vacation!',
],
[
'name' => 'GrandCanyon.jpg',
'description' => '',
],
],
];
Validator::validate($input, [
'photos.*.description' => ['required'],
], [
'photos.*.description.required' => 'Please describe photo #:position.',
]);위 예제에서는 유효성 검사에 실패하고, 사용자에게 "Please describe photo #2." 라는 오류가 표시됩니다.
필요하다면 second-index, second-position, third-index, third-position 등으로 더 깊이 중첩된 인덱스와 위치를 참조할 수도 있습니다.
'photos.*.attributes.*.string' => 'Invalid attribute for photo #:second-position.',파일 유효성 검사
Laravel은 업로드된 파일을 검증하는 데 사용할 수 있는 mimes, image, min, max 등 다양한 유효성 검사 규칙을 제공합니다. 파일을 검증할 때 이 규칙들을 개별적으로 지정해도 되지만, Laravel은 편리하게 쓸 수 있는 플루언트 파일 유효성 검사 규칙 빌더도 제공합니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\File;
Validator::validate($input, [
'attachment' => [
'required',
File::types(['mp3', 'wav'])
->min(1024)
->max(12 * 1024),
],
]);파일 타입 검사하기
types 메서드를 호출할 때는 확장자만 지정하면 되지만, 이 메서드는 실제로 파일 내용을 읽고 MIME 타입을 추측하여 파일의 MIME 타입을 검증합니다. MIME 타입과 그에 대응하는 확장자의 전체 목록은 다음 위치에서 확인할 수 있습니다.
https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
파일 크기 검사하기
편의를 위해 최소/최대 파일 크기는 파일 크기 단위를 나타내는 접미사를 붙인 문자열로 지정할 수 있습니다. kb, mb, gb, tb 접미사를 지원합니다.
File::types(['mp3', 'wav'])
->min('1kb')
->max('10mb');이미지 파일 검사하기
애플리케이션이 사용자가 업로드한 이미지를 받는다면, File 규칙의 image 생성자 메서드를 사용해 검증 대상 파일이 이미지(jpg, jpeg, png, bmp, gif, webp, avif, heic, heif)인지 확인할 수 있습니다.
또한 dimensions 규칙으로 이미지의 크기를 제한할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\File;
Validator::validate($input, [
'photo' => [
'required',
File::image()
->min(1024)
->max(12 * 1024)
->dimensions(Rule::dimensions()->maxWidth(1000)->maxHeight(500)),
],
]);NOTE
이미지 크기 검증에 대한 더 자세한 내용은 dimension 규칙 문서에서 확인할 수 있습니다.
WARNING
기본적으로 image 규칙은 XSS 취약점 가능성 때문에 SVG 파일을 허용하지 않습니다. SVG 파일을 허용해야 한다면 image 규칙에 allowSvg: true를 전달하세요: File::image(allowSvg: true)
이미지 크기 검사하기
이미지의 크기(dimensions)도 검증할 수 있습니다. 예를 들어 업로드된 이미지의 너비가 최대 1000픽셀, 높이가 최대 500픽셀인지 검증하려면 dimensions 규칙을 사용합니다.
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\File;
File::image()->dimensions(
Rule::dimensions()
->maxWidth(1000)
->maxHeight(500)
);NOTE
이미지 크기 검증에 대한 더 자세한 내용은 dimension 규칙 문서에서 확인할 수 있습니다.
비밀번호 유효성 검사
비밀번호가 충분한 복잡도를 갖추도록 하려면 Laravel의 Password 규칙 객체를 사용할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;
$validator = Validator::make($request->all(), [
'password' => ['required', 'confirmed', Password::min(8)],
]);Password 규칙 객체를 사용하면 비밀번호에 최소 하나의 문자, 숫자, 기호가 있어야 하거나 대소문자가 섞여 있어야 하는 등 애플리케이션의 비밀번호 복잡도 요구 사항을 손쉽게 커스터마이징할 수 있습니다.
// Require at least 8 characters...
Password::min(8);
// Require at most 256 characters...
Password::min(16)->max(256);
// Require at least one letter...
Password::min(8)->letters();
// Require at least one uppercase and one lowercase letter...
Password::min(8)->mixedCase();
// Require at least one number...
Password::min(8)->numbers();
// Require at least one symbol...
Password::min(8)->symbols();또한 uncompromised 메서드를 사용하면 비밀번호가 공개된 비밀번호 데이터 유출 사고에서 노출된 적이 없는지 확인할 수 있습니다.
Password::min(8)->uncompromised();내부적으로 Password 규칙 객체는 k-익명성(k-Anonymity) 모델을 사용하여, 사용자의 개인정보나 보안을 해치지 않고 haveibeenpwned.com 서비스를 통해 비밀번호가 유출되었는지 판단합니다.
기본적으로 비밀번호가 데이터 유출 사고에서 한 번이라도 나타나면 노출된 것으로 간주합니다. uncompromised 메서드의 첫 번째 인자로 이 임계값을 커스터마이징할 수 있습니다.
// Ensure the password appears no more than 3 times in the same data leak...
Password::min(8)->uncompromised(3);물론 위 예제의 모든 메서드를 체이닝할 수 있습니다.
Password::min(8)
->max(256)
->letters()
->mixedCase()
->numbers()
->symbols()
->uncompromised();toPasswordRulesString 메서드를 사용하면 Password 규칙 객체를 HTML passwordrules 속성에 적합한 문자열로 변환할 수 있습니다.
<input
type="password"
name="password"
autocomplete="new-password"
passwordrules="{{ Password::defaults()->toPasswordRulesString() }}"
/>기본 비밀번호 규칙 정의하기
비밀번호의 기본 유효성 검사 규칙을 애플리케이션의 한 곳에서 지정해 두면 편리합니다. 클로저를 받는 Password::defaults 메서드로 쉽게 구현할 수 있습니다. defaults 메서드에 전달하는 클로저는 Password 규칙의 기본 설정을 반환해야 합니다. 일반적으로 defaults 규칙은 애플리케이션 서비스 프로바이더 중 하나의 boot 메서드 안에서 호출합니다.
use Illuminate\Validation\Rules\Password;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Password::defaults(function () {
$rule = Password::min(8);
return $this->app->isProduction()
? $rule->mixedCase()->uncompromised()
: $rule;
});
}그런 다음 검증 중인 특정 비밀번호에 기본 규칙을 적용하고 싶을 때는 인자 없이 defaults 메서드를 호출하면 됩니다.
'password' => ['required', Password::defaults()],기본 비밀번호 유효성 검사 규칙에 추가 규칙을 덧붙이고 싶을 때도 있습니다. 이럴 때는 rules 메서드를 사용합니다.
use App\Rules\ZxcvbnRule;
Password::defaults(function () {
$rule = Password::min(8)->rules([new ZxcvbnRule]);
// ...
});커스텀 유효성 검사 규칙
Rule 객체 사용하기
Laravel은 유용한 유효성 검사 규칙을 다양하게 제공하지만, 직접 규칙을 만들고 싶을 수도 있습니다. 커스텀 유효성 검사 규칙을 등록하는 방법 중 하나가 Rule 객체를 사용하는 것입니다. 새 Rule 객체를 생성하려면 make:rule Artisan 명령어를 사용합니다. 이 명령어로 문자열이 대문자인지 검증하는 규칙을 만들어 보겠습니다. Laravel은 새 규칙을 app/Rules 디렉터리에 배치하며, 이 디렉터리가 없다면 규칙을 생성하는 Artisan 명령어를 실행할 때 함께 생성합니다.
php artisan make:rule Uppercase규칙이 생성되었다면 이제 동작을 정의할 차례입니다. Rule 객체에는 validate라는 메서드 하나만 있습니다. 이 메서드는 속성 이름, 그 값, 그리고 실패 시 유효성 검사 오류 메시지와 함께 호출해야 하는 콜백을 전달받습니다.
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class Uppercase implements ValidationRule
{
/**
* Run the validation rule.
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (strtoupper($value) !== $value) {
$fail('The :attribute must be uppercase.');
}
}
}규칙을 정의했다면, 다른 유효성 검사 규칙과 함께 Rule 객체의 인스턴스를 전달하여 유효성 검사기에 연결할 수 있습니다.
use App\Rules\Uppercase;
$request->validate([
'name' => ['required', 'string', new Uppercase],
]);유효성 검사 메시지 번역하기
$fail 클로저에 문자열 그대로의 오류 메시지를 전달하는 대신, 번역 문자열 키를 전달하여 Laravel이 오류 메시지를 번역하도록 할 수도 있습니다.
if (strtoupper($value) !== $value) {
$fail('validation.uppercase')->translate();
}필요하다면 translate 메서드의 첫 번째 인자로 플레이스홀더 치환 값을, 두 번째 인자로 사용할 언어를 전달할 수 있습니다.
$fail('validation.location')->translate([
'value' => $this->value,
], 'fr');추가 데이터에 접근하기
커스텀 유효성 검사 규칙 클래스가 검증 중인 다른 모든 데이터에 접근해야 한다면, 규칙 클래스에서 Illuminate\Contracts\Validation\DataAwareRule 인터페이스를 구현하면 됩니다. 이 인터페이스는 클래스에 setData 메서드를 정의하도록 요구합니다. 이 메서드는 유효성 검사가 진행되기 전에 Laravel이 검증 중인 모든 데이터와 함께 자동으로 호출합니다.
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\DataAwareRule;
use Illuminate\Contracts\Validation\ValidationRule;
class Uppercase implements DataAwareRule, ValidationRule
{
/**
* All of the data under validation.
*
* @var array<string, mixed>
*/
protected $data = [];
// ...
/**
* Set the data under validation.
*
* @param array<string, mixed> $data
*/
public function setData(array $data): static
{
$this->data = $data;
return $this;
}
}또는 유효성 검사를 수행하는 유효성 검사기 인스턴스에 접근해야 하는 규칙이라면 ValidatorAwareRule 인터페이스를 구현할 수 있습니다.
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Contracts\Validation\ValidatorAwareRule;
use Illuminate\Validation\Validator;
class Uppercase implements ValidationRule, ValidatorAwareRule
{
/**
* The validator instance.
*
* @var \Illuminate\Validation\Validator
*/
protected $validator;
// ...
/**
* Set the current validator.
*/
public function setValidator(Validator $validator): static
{
$this->validator = $validator;
return $this;
}
}클로저 사용하기
커스텀 규칙의 기능이 애플리케이션 전체에서 한 번만 필요하다면 Rule 객체 대신 클로저를 사용할 수 있습니다. 클로저는 속성 이름, 속성 값, 그리고 유효성 검사에 실패했을 때 호출해야 하는 $fail 콜백을 전달받습니다.
use Illuminate\Support\Facades\Validator;
use Closure;
$validator = Validator::make($request->all(), [
'title' => [
'required',
'max:255',
function (string $attribute, mixed $value, Closure $fail) {
if ($value === 'foo') {
$fail("The {$attribute} is invalid.");
}
},
],
]);암묵적 규칙
기본적으로 검증 대상 속성이 존재하지 않거나 빈 문자열이면, 커스텀 규칙을 포함한 일반 유효성 검사 규칙은 실행되지 않습니다. 예를 들어 unique 규칙은 빈 문자열에 대해서는 실행되지 않습니다.
use Illuminate\Support\Facades\Validator;
$rules = ['name' => ['unique:users,name']];
$input = ['name' => ''];
Validator::make($input, $rules)->passes(); // true속성이 비어 있어도 커스텀 규칙이 실행되게 하려면, 그 규칙이 속성이 필수임을 암시(imply)해야 합니다. 새로운 암묵적(implicit) Rule 객체를 빠르게 생성하려면 make:rule Artisan 명령어에 --implicit 옵션을 사용하면 됩니다.
php artisan make:rule Uppercase --implicitWARNING
"암묵적" 규칙은 속성이 필수임을 암시 할 뿐입니다. 존재하지 않거나 비어 있는 속성을 실제로 유효하지 않게 처리할지는 직접 구현하기에 달려 있습니다.