유효성 검사
업데이트됨번역일: 2026년 8월 2일
이 페이지는 원문이 업데이트되어 번역이 갱신되었습니다.
- 원문 수정
- 2026년 8월 2일
- 번역 갱신
- 2026년 8월 2일
유효성 검사
- 소개
- 유효성 검사 빠른 시작
- 폼 요청 유효성 검사
- 수동으로 Validator 생성하기
- 유효성 검사된 입력 다루기
- 오류 메시지 다루기
- 사용 가능한 유효성 검사 규칙
- 조건부 규칙 추가하기
- 배열 유효성 검사하기
- 파일 유효성 검사하기
- 패스워드 유효성 검사하기
- 커스텀 유효성 검사 규칙
유효성 검사
소개
Laravel은 애플리케이션으로 들어오는 데이터를 검증하는 여러 가지 방법을 제공합니다. 가장 일반적인 방법은 모든 HTTP 요청 객체에서 사용할 수 있는 validate 메서드를 이용하는 것입니다. 그 외에도 다양한 유효성 검사 방식을 함께 살펴볼 예정입니다.
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
{
/**
* 게시글 작성 폼을 표시합니다.
*/
public function create(): View
{
return view('post.create');
}
/**
* 새 게시글을 저장합니다.
*/
public function store(Request $request): RedirectResponse
{
// 유효성 검사 후 게시글 저장...
$post = /** ... */
return to_route('post.show', ['post' => $post->id]);
}
}유효성 검사 로직 작성
이제 store 메서드에 유효성 검사 로직을 추가합니다. Illuminate\Http\Request 객체의 validate 메서드를 사용하면 됩니다.
- 검사 통과 시: 코드가 정상적으로 계속 실행됩니다.
- 검사 실패 시:
Illuminate\Validation\ValidationException이 자동으로 던져지고, 적절한 오류 응답이 사용자에게 반환됩니다.
NOTE
일반 HTTP 요청에서 검사가 실패하면 이전 URL로 리다이렉트됩니다. XHR(비동기) 요청에서 실패하면 유효성 검사 오류 JSON 응답이 422 상태 코드와 함께 반환됩니다.
/**
* 새 게시글을 저장합니다.
*/
public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
// 유효성 검사 통과 — 게시글 저장 처리...
return redirect('/posts');
}validate 메서드에 규칙 배열을 전달하기만 하면 됩니다. 사용 가능한 모든 규칙은 이 문서 하단에서 확인할 수 있습니다.
오류 메시지를 이름 있는 오류 백(named error bag)에 저장하고 싶다면 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은 자동으로 사용자를 이전 페이지로 리다이렉트하고, 모든 오류 메시지와 이전 입력값을 세션에 플래시합니다.
web 미들웨어 그룹에 포함된 Illuminate\View\Middleware\ShareErrorsFromSession 미들웨어가 $errors 변수를 모든 뷰에 자동으로 공유합니다. 덕분에 뷰에서는 $errors 변수가 항상 정의되어 있다고 안전하게 가정할 수 있습니다. $errors는 Illuminate\Support\MessageBag 인스턴스입니다. 자세한 사용법은 오류 메시지 다루기를 참고하세요.
예제에서 검사가 실패하면 사용자는 create 뷰로 리다이렉트되며, 아래와 같이 오류 메시지를 표시할 수 있습니다.
<!-- /resources/views/post/create.blade.php -->
<h1>게시글 작성</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- 게시글 작성 폼 -->오류 메시지 커스터마이징
각 유효성 검사 규칙의 기본 오류 메시지는 lang/en/validation.php 파일에 정의되어 있습니다. 애플리케이션에 lang 디렉터리가 없다면 아래 Artisan 명령으로 생성할 수 있습니다.
php artisan lang:publishlang/en/validation.php 파일에서 각 규칙의 메시지를 자유롭게 수정할 수 있습니다. 한국어 메시지를 제공하려면 lang/ko/validation.php 파일을 만들어 번역하면 됩니다. Laravel 다국어 지원에 대한 자세한 내용은 현지화 문서를 참고하세요.
WARNING
기본 Laravel 애플리케이션 골격에는 lang 디렉터리가 포함되어 있지 않습니다. 언어 파일을 커스터마이징하려면 lang:publish Artisan 명령으로 먼저 파일을 생성하세요.
XHR 요청과 유효성 검사
JavaScript 프런트엔드(예: Vue, React, Axios 등)에서 XHR로 요청을 보내는 경우, 검사 실패 시 리다이렉트 대신 유효성 검사 오류가 담긴 JSON 응답이 422 HTTP 상태 코드와 함께 반환됩니다.
`@error` 디렉티브
Blade의 @error 디렉티브를 사용하면 특정 필드에 유효성 검사 오류가 있는지 간단하게 확인하고, $message 변수로 오류 메시지를 출력할 수 있습니다.
<!-- /resources/views/post/create.blade.php -->
<label for="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은 요청의 모든 입력값을 세션에 자동으로 플래시합니다. 덕분에 다음 요청에서 이전 입력값을 꺼내 폼을 다시 채울 수 있습니다.
Request 객체의 old 메서드로 이전에 플래시된 입력값을 가져올 수 있습니다.
$title = $request->old('title');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이 유효하지 않은 날짜로 간주됩니다.
유효성 검사 오류 응답 형식
XHR 요청에서 Illuminate\Validation\ValidationException이 발생하면 Laravel은 오류 메시지를 자동으로 JSON 형식으로 변환하여 422 Unprocessable Entity 응답으로 반환합니다.
중첩된 필드의 오류 키는 점 표기법으로 평탄화(flatten)됩니다. 응답 형식의 예시는 다음과 같습니다.
{
"message": "The team name must be a string. (and 4 more errors)",
"errors": {
"team_name": [
"The team name must be a string.",
"The team name 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 must be a valid email address."
]
}
}Form Request 유효성 검사
Form Request 클래스 생성
유효성 검사 로직이 복잡해지면 컨트롤러가 지저분해질 수 있습니다. 이런 경우 "Form Request"를 사용하면 유효성 검사와 인가(authorization) 로직을 별도의 클래스로 깔끔하게 분리할 수 있습니다. Artisan 명령어로 Form Request 클래스를 생성합니다:
php artisan make:request StorePostRequest생성된 클래스는 app/Http/Requests 디렉터리에 위치하며, 해당 디렉터리가 없으면 자동으로 생성됩니다. Laravel이 생성하는 Form Request 클래스에는 기본적으로 authorize와 rules 두 가지 메서드가 포함되어 있습니다.
authorize: 현재 인증된 사용자가 해당 요청을 수행할 권한이 있는지 판단합니다.rules: 요청 데이터에 적용할 유효성 검사 규칙을 배열로 반환합니다.
/**
* 요청에 적용할 유효성 검사 규칙을 반환합니다.
*
* @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 서비스 컨테이너가 자동으로 주입해 줍니다.
이 유효성 검사가 실제로 실행되는 시점은 언제일까요? 컨트롤러 메서드의 파라미터에 Form Request 클래스를 타입힌트로 선언하기만 하면 됩니다. 컨트롤러 메서드가 호출되기 전에 유효성 검사가 자동으로 실행되므로, 컨트롤러 내부에 검사 코드를 따로 작성할 필요가 없습니다:
/**
* 새 블로그 게시글을 저장합니다.
*/
public function store(StorePostRequest $request): RedirectResponse
{
// 이 시점에서 요청은 이미 유효성 검사를 통과한 상태입니다.
// 검증된 입력 데이터 전체를 가져옵니다.
$validated = $request->validated();
// 검증된 데이터 중 일부만 가져옵니다.
$validated = $request->safe()->only(['name', 'email']);
$validated = $request->safe()->except(['name', 'email']);
// 블로그 게시글 저장 처리...
return redirect('/posts');
}유효성 검사에 실패하면 사용자를 이전 페이지로 리다이렉트하고, 오류 메시지는 세션에 플래시됩니다. XHR(비동기) 요청인 경우에는 리다이렉트 대신 유효성 검사 오류를 JSON 형식으로 담은 HTTP 422 응답이 반환됩니다.
NOTE
Inertia 기반 Laravel 프론트엔드에서 실시간 Form Request 유효성 검사가 필요하다면 Laravel Precognition을 확인해 보세요.
추가 유효성 검사 수행
기본 유효성 검사가 통과된 후 추가적인 검사가 필요한 경우 after 메서드를 사용할 수 있습니다. 이 메서드는 유효성 검사 완료 후 호출될 콜러블(callable) 또는 클로저의 배열을 반환하며, 각 콜러블은 Illuminate\Validation\Validator 인스턴스를 전달받아 추가 오류를 등록할 수 있습니다:
use Illuminate\Validation\Validator;
/**
* 유효성 검사 완료 후 실행할 콜러블 목록을 반환합니다.
*/
public function after(): array
{
return [
function (Validator $validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add(
'field',
'이 필드에 문제가 있습니다!'
);
}
}
];
}after 메서드가 반환하는 배열에는 클로저 외에도 인보커블(invokable) 클래스를 포함할 수 있습니다. 해당 클래스의 __invoke 메서드가 Illuminate\Validation\Validator 인스턴스를 전달받습니다:
use App\Validation\ValidateShippingTime;
use App\Validation\ValidateUserStatus;
use Illuminate\Validation\Validator;
/**
* 유효성 검사 완료 후 실행할 콜러블 목록을 반환합니다.
*/
public function after(): array
{
return [
new ValidateUserStatus,
new ValidateShippingTime,
function (Validator $validator) {
//
}
];
}첫 번째 실패 시 검사 중단
Form Request 클래스에 StopOnFirstFailure 어트리뷰트를 추가하면, 어떤 필드든 유효성 검사에 실패하는 순간 나머지 모든 필드의 검사를 즉시 중단합니다:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\StopOnFirstFailure;
use Illuminate\Foundation\Http\FormRequest;
#[StopOnFirstFailure]
class StorePostRequest extends FormRequest
{
// ...
}알 수 없는 필드 거부
FailOnUnknownFields 어트리뷰트를 추가하면, rules 메서드에 정의되지 않은 필드가 요청에 포함될 경우 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'],
];
}
}모든 Form Request에 이 동작을 전역으로 적용하려면 AppServiceProvider에서 설정할 수 있습니다:
use Illuminate\Foundation\Http\FormRequest;
/**
* 애플리케이션 서비스를 부트스트랩합니다.
*/
public function boot(): void
{
FormRequest::failOnUnknownFields();
}전역 설정을 사용하더라도, 특정 요청 클래스에서만 이 동작을 비활성화하려면 어트리뷰트에 false를 전달하면 됩니다:
#[FailOnUnknownFields(false)]
class PublicWebhookRequest extends FormRequest
{
// ...
}알 수 없는 필드를 거부하면 예상치 못한 입력 키가 애플리케이션 내부로 흘러들어가는 것을 방지하여 일괄 할당(mass-assignment) 유형의 보안 문제에 대한 추가적인 보호 수단이 됩니다. 다만 이 기능을 사용하더라도 모델의 $fillable / $guarded 속성은 반드시 올바르게 설정하고, 검증된 신뢰할 수 있는 입력만 저장해야 합니다.
리다이렉트 경로 커스터마이징
Form Request 유효성 검사에 실패하면 기본적으로 이전 페이지로 리다이렉트됩니다. 이 동작을 변경하려면 Form Request 클래스에 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
{
// ...
}에러 백 커스터마이징
Form Request 유효성 검사에 실패하면 오류는 기본적으로 default 에러 백에 저장됩니다. 특정 이름의 에러 백에 오류를 저장해야 한다면 ErrorBag 어트리뷰트를 사용하세요:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\ErrorBag;
use Illuminate\Foundation\Http\FormRequest;
#[ErrorBag('login')]
class LoginRequest extends FormRequest
{
// ...
}Form Request 인가(Authorization)
Form Request 클래스의 authorize 메서드에서는 현재 인증된 사용자가 해당 리소스에 대한 작업을 수행할 권한이 있는지 판단합니다. 예를 들어, 사용자가 자신이 작성한 댓글만 수정할 수 있도록 제한할 수 있습니다. 보통 이 메서드 내부에서 인가 게이트와 정책을 활용합니다:
use App\Models\Comment;
/**
* 사용자가 이 요청을 수행할 권한이 있는지 판단합니다.
*/
public function authorize(): bool
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}Form Request는 Laravel의 기본 Request 클래스를 상속하므로, user() 메서드로 현재 인증된 사용자에 접근할 수 있습니다. 위 예시의 route() 메서드는 호출된 라우트에 정의된 URI 파라미터에 접근하는 데 사용됩니다. 예를 들어 아래와 같이 라우트가 정의된 경우 {comment} 파라미터를 가져올 수 있습니다:
Route::post('/comment/{comment}');라우트 모델 바인딩을 활용하면 요청의 프로퍼티로 바인딩된 모델에 바로 접근할 수 있어 코드가 더 간결해집니다:
return $this->user()->can('update', $this->comment);authorize 메서드가 false를 반환하면 HTTP 403 응답이 자동으로 반환되고, 컨트롤러 메서드는 실행되지 않습니다.
인가 처리를 애플리케이션의 다른 곳에서 별도로 수행한다면, authorize 메서드를 아예 제거하거나 단순히 true를 반환해도 됩니다:
/**
* 사용자가 이 요청을 수행할 권한이 있는지 판단합니다.
*/
public function authorize(): bool
{
return true;
}NOTE
authorize 메서드의 파라미터에도 의존성을 타입힌트로 선언할 수 있으며, Laravel 서비스 컨테이너가 자동으로 주입합니다.
오류 메시지 커스터마이징
messages 메서드를 오버라이드하면 Form Request에서 사용하는 오류 메시지를 직접 지정할 수 있습니다. 이 메서드는 필드명.규칙 형태의 키와 메시지 문자열로 이루어진 배열을 반환해야 합니다:
/**
* 유효성 검사 규칙에 대한 오류 메시지를 반환합니다.
*
* @return array<string, string>
*/
public function messages(): array
{
return [
'title.required' => '제목을 입력해 주세요.',
'body.required' => '본문을 입력해 주세요.',
];
}유효성 검사 속성명 커스터마이징
Laravel의 기본 오류 메시지에는 :attribute 플레이스홀더가 포함된 경우가 많습니다. 이 플레이스홀더를 사람이 읽기 좋은 한국어 이름으로 바꾸려면 attributes 메서드를 오버라이드하세요. 이 메서드는 속성명과 표시 이름의 쌍으로 이루어진 배열을 반환합니다:
/**
* 유효성 검사 오류에 사용할 커스텀 속성명을 반환합니다.
*
* @return array<string, string>
*/
public function attributes(): array
{
return [
'email' => '이메일 주소',
];
}유효성 검사 전 입력 데이터 전처리
유효성 검사 규칙을 적용하기 전에 요청 데이터를 정제하거나 변환해야 한다면 prepareForValidation 메서드를 사용하세요:
use Illuminate\Support\Str;
/**
* 유효성 검사 전에 데이터를 준비합니다.
*/
protected function prepareForValidation(): void
{
$this->merge([
'slug' => Str::slug($this->slug),
]);
}반대로, 유효성 검사가 성공적으로 완료된 후에 데이터를 정규화해야 한다면 passedValidation 메서드를 활용하세요:
/**
* 유효성 검사 통과 후 처리합니다.
*/
protected function passedValidation(): void
{
$this->replace(['name' => '홍길동']);
}유효성 검사기 직접 생성하기
요청 객체의 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
{
/**
* 새 블로그 게시글을 저장합니다.
*/
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();
}
// 유효성 검사를 통과한 입력값 전체를 가져옵니다...
$validated = $validator->validated();
// 유효성 검사를 통과한 입력값 중 일부만 가져옵니다...
$validated = $validator->safe()->only(['name', 'email']);
$validated = $validator->safe()->except(['name', 'email']);
// 블로그 게시글을 저장합니다...
return redirect('/posts');
}
}make 메서드의 첫 번째 인자는 검사할 데이터, 두 번째 인자는 적용할 유효성 검사 규칙 배열입니다.
유효성 검사가 실패했을 때는 withErrors 메서드로 오류 메시지를 세션에 플래시할 수 있습니다. 이 방법을 사용하면 리디렉션 후 뷰에서 $errors 변수가 자동으로 공유되므로, 사용자에게 오류를 쉽게 표시할 수 있습니다. withErrors 메서드는 검사기 인스턴스, MessageBag, 또는 PHP 배열을 인자로 받습니다.
첫 번째 실패 시 즉시 중단하기
stopOnFirstFailure 메서드를 사용하면 하나의 규칙이라도 실패하는 순간 나머지 항목의 검사를 중단합니다.
if ($validator->stopOnFirstFailure()->fails()) {
// ...
}자동 리디렉션
검사기를 직접 생성하면서도 요청 객체의 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');명명된 오류 백(Named Error Bags)
한 페이지에 여러 개의 폼이 있는 경우, 각 폼의 오류 메시지를 구분하기 위해 MessageBag에 이름을 붙일 수 있습니다. withErrors의 두 번째 인자로 이름을 전달하면 됩니다.
return redirect('/register')->withErrors($validator, 'login');이후 뷰에서는 $errors 변수를 통해 해당 이름의 MessageBag에 접근할 수 있습니다.
{{ $errors->login->first('email') }}오류 메시지 커스터마이징
Laravel이 기본으로 제공하는 오류 메시지 대신 직접 작성한 메시지를 사용하고 싶다면, Validator::make의 세 번째 인자로 커스텀 메시지 배열을 전달하면 됩니다.
$validator = Validator::make($input, $rules, $messages = [
'required' => ':attribute 필드는 필수입니다.',
]);:attribute 플레이스홀더는 실제 필드명으로 자동 치환됩니다. 그 외에도 다양한 플레이스홀더를 활용할 수 있습니다.
$messages = [
'same' => ':attribute 와 :other 는 일치해야 합니다.',
'size' => ':attribute 는 정확히 :size 이어야 합니다.',
'between' => ':attribute 의 값 :input 은 :min - :max 범위를 벗어났습니다.',
'in' => ':attribute 는 다음 중 하나이어야 합니다: :values',
];특정 필드에만 커스텀 메시지 지정하기
특정 필드의 특정 규칙에만 커스텀 메시지를 적용하려면 "점(dot) 표기법"을 사용하세요. 필드명.규칙명 형태로 키를 지정합니다.
$messages = [
'email.required' => '이메일 주소를 입력해 주세요!',
];필드명 표시 방식 커스터마이징
Laravel의 기본 오류 메시지는 :attribute 자리에 필드명을 그대로 사용합니다. 사용자에게 보여지는 필드 표시명을 변경하고 싶다면, Validator::make의 네 번째 인자로 커스텀 속성명 배열을 전달하세요.
$validator = Validator::make($input, $rules, $messages, [
'email' => '이메일 주소',
]);이렇게 하면 오류 메시지에서 email 대신 이메일 주소로 표시됩니다.
추가 유효성 검사 수행하기
기본 유효성 검사가 완료된 후 추가적인 검사 로직이 필요한 경우, 검사기의 after 메서드를 활용하세요. after 메서드는 클로저 또는 호출 가능한 객체(callable)의 배열을 받아, 유효성 검사가 끝난 뒤 실행합니다. 이때 Illuminate\Validation\Validator 인스턴스가 전달되므로, 필요하다면 추가 오류 메시지를 등록할 수 있습니다.
use Illuminate\Support\Facades\Validator;
$validator = Validator::make(/* ... */);
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add(
'field', '이 필드에 문제가 있습니다!'
);
}
});
if ($validator->fails()) {
// ...
}여러 개의 추가 검사 로직을 분리하여 관리하고 싶다면, 호출 가능한 클래스(invokable class)를 배열로 전달할 수도 있습니다. 각 클래스의 __invoke 메서드가 Illuminate\Validation\Validator 인스턴스를 인자로 받습니다.
use App\Validation\ValidateShippingTime;
use App\Validation\ValidateUserStatus;
$validator->after([
new ValidateUserStatus,
new ValidateShippingTime,
function ($validator) {
// 추가 검사 로직...
},
]);유효성 검사된 입력값 다루기
폼 리퀘스트나 수동으로 생성한 Validator 인스턴스로 유효성 검사를 마친 뒤에는, 실제로 검사를 통과한 입력값만 따로 꺼내 쓸 수 있습니다.
가장 간단한 방법은 validated 메서드를 호출하는 것입니다. 폼 리퀘스트와 Validator 인스턴스 모두에서 사용할 수 있으며, 검사를 통과한 데이터를 배열로 반환합니다:
$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();ValidatedInput 인스턴스는 일반 배열처럼 반복(iterate)하거나 인덱스로 접근할 수도 있습니다:
// 반복문으로 순회
foreach ($request->safe() as $key => $value) {
// ...
}
// 배열처럼 접근
$validated = $request->safe();
$email = $validated['email'];검사된 데이터에 추가 필드를 덧붙이고 싶다면 merge 메서드를 사용합니다:
$validated = $request->safe()->merge(['name' => '홍길동']);검사된 데이터를 컬렉션으로 변환하려면 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 명령어로 생성할 수 있습니다.
lang/en/validation.php 파일 안에는 각 유효성 검사 규칙에 대응하는 번역 항목이 있습니다. 애플리케이션의 요구에 맞게 자유롭게 수정하거나 변경할 수 있습니다.
또한 이 파일을 다른 언어 디렉터리로 복사해 원하는 언어로 메시지를 번역할 수 있습니다. 한국어 메시지를 제공하고 싶다면 lang/ko/validation.php 파일을 생성하면 됩니다. Laravel 로컬라이제이션에 대한 자세한 내용은 로컬라이제이션 문서를 참고하세요.
WARNING
기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. 언어 파일을 커스터마이즈하려면 lang:publish Artisan 명령어로 먼저 파일을 게시해야 합니다.
특정 속성에 대한 커스텀 메시지
특정 속성과 규칙 조합에 대해 오류 메시지를 직접 지정하고 싶다면, 언어 파일(lang/xx/validation.php)의 custom 배열에 항목을 추가합니다.
'custom' => [
'email' => [
'required' => '이메일 주소를 입력해 주세요!',
'max' => '이메일 주소가 너무 깁니다!'
],
],언어 파일에서 속성명 지정하기
Laravel의 기본 오류 메시지 대부분에는 :attribute 플레이스홀더가 포함되어 있으며, 이 자리에 검사 중인 필드명이 자동으로 삽입됩니다. 이 필드명을 사람이 읽기 좋은 이름으로 바꾸고 싶다면, 언어 파일(lang/xx/validation.php)의 attributes 배열에 원하는 이름을 지정하면 됩니다.
'attributes' => [
'email' => '이메일 주소',
],WARNING
기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. 언어 파일을 커스터마이즈하려면 lang:publish Artisan 명령어로 먼저 파일을 게시해야 합니다.
언어 파일에서 값 표현 지정하기
일부 Laravel 기본 유효성 검사 규칙의 오류 메시지에는 :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 디렉터리가 포함되어 있지 않습니다. 언어 파일을 커스터마이즈하려면 lang:publish Artisan 명령어로 먼저 파일을 게시해야 합니다.
이 값을 정의하고 나면, 유효성 검사 규칙이 실패했을 때 다음과 같이 더 이해하기 쉬운 메시지가 출력됩니다.
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
Database
Utilities
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
accepted
유효성 검사 대상 필드는 "yes", "on", 1, "1", true, 또는 "true"여야 합니다. 이는 "이용약관" 동의 또는 유사한 필드의 유효성 검사에 유용합니다.
accepted_if:anotherfield,value,...
다른 유효성 검사 대상 필드가 지정된 값과 같을 경우, 유효성 검사 대상 필드는 "yes", "on", 1, "1", true, 또는 "true"여야 합니다. 이는 "이용약관" 동의 또는 유사한 필드의 유효성 검사에 유용합니다.
active_url
유효성 검사 대상 필드는 dns_get_record PHP 함수에 따라 유효한 A 또는 AAAA 레코드를 가져야 합니다. 제공된 URL의 호스트명은 dns_get_record에 전달되기 전에 parse_url PHP 함수를 사용하여 추출됩니다.
active_url 및 email:dns와 같이 DNS 조회를 수행하는 유효성 검사 규칙을 테스트할 때, Validator::fakeDnsLookups 메서드를 사용할 수 있습니다. 이 메서드는 규칙의 다른 유효성 검사 동작은 유지하면서 DNS 조회를 가짜로 처리합니다:
use Illuminate\Support\Facades\Validator;
Validator::fakeDnsLookups();after:_date_
검사 중인 필드는 주어진 날짜 이후의 값이어야 합니다. 날짜는 유효한 `DateTime` 인스턴스로 변환되기 위해 PHP의 `strtotime` 함수에 전달됩니다:'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_
유효성 검사 대상 필드는 주어진 날짜보다 앞선 값이어야 합니다. 날짜는 유효한 DateTime 인스턴스로 변환하기 위해 PHP strtotime 함수에 전달됩니다. 또한, 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_
유효성 검사 중인 필드는 주어진 날짜보다 이전이거나 같은 값이어야 합니다. 날짜는 유효한 DateTime 인스턴스로 변환하기 위해 PHP의 strtotime 함수에 전달됩니다. 또한 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']confirmed
유효성 검사 중인 필드는 {field}_confirmation 형식의 일치하는 필드를 가져야 합니다. 예를 들어, 유효성 검사 중인 필드가 password라면, 입력값에 일치하는 password_confirmation 필드가 존재해야 합니다.
사용자 정의 확인 필드 이름을 전달할 수도 있습니다. 예를 들어, confirmed:repeat_username은 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, [
php
'roles' => [
'required',
'array',
Rule::doesntContain(['admin', 'editor']),
],
]);current_password
유효성 검사 중인 필드는 인증된 사용자의 비밀번호와 일치해야 합니다. 규칙의 첫 번째 매개변수를 사용하여 인증 가드를 지정할 수 있습니다:
'password' => ['current_password:api']date
유효성 검사 중인 필드는 PHP strtotime 함수에 따라 유효하고 상대적이지 않은 날짜여야 합니다.
date_equals:_date_
유효성 검사 중인 필드는 주어진 날짜와 동일해야 합니다. 날짜는 유효한 DateTime 인스턴스로 변환하기 위해 PHP strtotime 함수로 전달됩니다.
date_format:_format_,...
유효성 검사 중인 필드는 주어진 formats 중 하나와 일치해야 합니다. 필드를 유효성 검사할 때 date와 date_format 중 하나만 사용해야 하며, 둘 다 사용해서는 안 됩니다. 이 유효성 검사 규칙은 PHP의 DateTime 클래스에서 지원하는 모든 형식을 지원합니다.
편의를 위해 날짜 기반 규칙은 플루언트 date 규칙 빌더를 사용하여 구성할 수 있습니다:
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->format('Y-m-d'),
],decimal:_min_,_max_
유효성 검사 중인 필드는 숫자여야 하며 지정된 소수 자릿수를 포함해야 합니다: php // 소수점 이하 두 자리여야 합니다 (9.99)... 'price' => ['decimal:2']
// 소수점 이하 2자리에서 4자리 사이여야 합니다... 'price' => ['decimal:2,4']
<h4 id="rule-different">declined</h4>
유효성 검사 중인 필드는 `"no"`, `"off"`, `0`, `"0"`, `false`, 또는 `"false"`여야 합니다.
<h4 id="rule-digits">declined_if:anotherfield,value,...</h4>
유효성 검사 중인 다른 필드가 지정된 값과 같을 경우, 유효성 검사 중인 필드는 `"no"`, `"off"`, `0`, `"0"`, `false`, 또는 `"false"`여야 합니다.
<h4 id="rule-digits-between">different:_field_</h4>
유효성 검사 중인 필드는 _field_와 다른 값을 가져야 합니다.
<h4 id="rule-dimensions">digits:_value_</h4>
유효성 검사 중인 정수는 정확히 _value_ 길이여야 합니다.
<h4 id="rule-distinct">digits_between:_min_,_max_</h4>
유효성 검사 중인 정수는 주어진 _min_과 _max_ 사이의 길이여야 합니다.
<h4 id="rule-doesnt-start-with">dimensions</h4>
유효성 검사 중인 파일은 규칙의 매개변수로 지정된 크기 제약 조건을 충족하는 이미지여야 합니다:
```php
'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_ 제약 조건을 사용하여 허용 가능한 종횡비 범위를 정의할 수 있습니다:
```php
'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는 기본적으로 느슨한 변수 비교를 사용합니다. 엄격한 비교를 사용하려면, 유효성 검사 규칙 정의에 strict 매개변수를 추가하면 됩니다:
'foo.*.id' => ['distinct:strict']규칙이 대소문자 차이를 무시하도록 하려면 유효성 검사 규칙의 인수에 ignore_case를 추가하면 됩니다:
'foo.*.id' => ['distinct:ignore_case']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()
],
]);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의 이름만 허용합니다. 원시 값을 검사할 때는 backed Enum을 `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 메서드를 활용할 수 있습니다. 이 메서드는 boolean 또는 클로저를 인수로 받습니다. 클로저가 주어진 경우, 클로저는 유효성 검사 중인 필드를 제외해야 하는지 여부를 나타내기 위해 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 메서드를 활용할 수 있습니다. 이 메서드는 boolean 또는 클로저를 인수로 받습니다. 클로저가 주어진 경우, 클로저는 유효성 검사 중인 필드를 제외하지 않아야 하는지 여부를 나타내기 위해 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)], ]);
<h4 id="rule-exists">exclude_with:_anotherfield_</h4>
유효성 검사 중인 필드는 _anotherfield_ 필드가 존재할 경우 `validate` 및 `validated` 메서드가 반환하는 요청 데이터에서 제외됩니다.
<h4 id="basic-usage-of-exists-rule">exclude_without:_anotherfield_</h4>
유효성 검사 중인 필드는 _anotherfield_ 필드가 존재하지 않을 경우 `validate` 및 `validated` 메서드가 반환하는 요청 데이터에서 제외됩니다.
<h4 id="specifying-a-custom-column-name">exists:_table_,_column_</h4>
유효성 검사 중인 필드는 지정된 데이터베이스 테이블에 존재해야 합니다.
<h4 id="rule-extensions">exists 규칙의 기본 사용법</h4>
```php
'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'],WARNING
사용자가 지정한 확장자만으로 파일의 유효성을 검사하는 것에 의존해서는 안 됩니다. 이 규칙은 일반적으로 항상 mimes 또는 mimetypes 규칙과 함께 사용해야 합니다.
file
유효성 검사 중인 필드는 성공적으로 업로드된 파일이어야 합니다.
filled
유효성 검사 중인 필드는 존재할 때 비어 있지 않아야 합니다.
gt:_field_
유효성 검사 중인 필드는 주어진 field 또는 _value_보다 커야 합니다. 두 필드는 동일한 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 동일한 방식으로 평가됩니다.
gte:_field_
유효성 검사 중인 필드는 주어진 field 또는 _value_보다 크거나 같아야 합니다. 두 필드는 동일한 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 동일한 방식으로 평가됩니다.
hex_color
유효성 검사 대상 필드는 [16진수](https://developer.mozilla.org/en-US/docs/Web/CSS/hex-color) 형식의 유효한 색상 값을 포함해야 합니다.image
유효성 검사 대상 파일은 이미지(jpg, jpeg, png, bmp, gif, 또는 webp)여야 합니다.
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',
],
php
'airports.*' => Rule::in(['NYC', 'LIT']),
]);in_array:_anotherfield_.*
유효성 검사 중인 필드는 _anotherfield_의 값 안에 존재해야 합니다.
in_array_keys:_value_.*
유효성 검사 중인 필드는 배열이어야 하며, 주어진 values 중 하나 이상을 배열의 키로 가지고 있어야 합니다:
'config' => ['array', 'in_array_keys:timezone']integer
유효성 검사 중인 필드는 정수여야 합니다.
strict 파라미터를 사용하면 해당 필드의 타입이 integer인 경우에만 유효한 것으로 간주합니다. 정수 값을 가진 문자열은 유효하지 않은 것으로 간주됩니다:
'age' => ['integer:strict']WARNING
이 유효성 검사 규칙은 입력값이 "integer" 변수 타입인지를 검증하는 것이 아니라, PHP의 FILTER_VALIDATE_INT 규칙이 허용하는 타입인지만 검증합니다. 입력값을 숫자로 유효성 검사해야 한다면 이 규칙을 the numeric validation rule과 함께 사용하십시오.
ip
유효성 검사 중인 필드는 IP 주소여야 합니다.
ipv4
유효성 검사 중인 필드는 IPv4 주소여야 합니다.
ipv6
유효성 검사 중인 필드는 IPv6 주소여야 합니다.
json
유효성 검사 중인 필드는 유효한 JSON 문자열이어야 합니다.
lt:_field_
유효성 검사 대상 필드는 주어진 _field_보다 작아야 합니다. 두 필드는 동일한 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 [size](#rule-size) 규칙과 동일한 방식으로 평가됩니다.lte:_field_
유효성 검사 대상 필드는 주어진 _field_보다 작거나 같아야 합니다. 두 필드는 동일한 타입이어야 합니다. 문자열, 숫자, 배열, 파일은 size 규칙과 동일한 방식으로 평가됩니다.
lowercase
유효성 검사 대상 필드는 소문자여야 합니다.
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 콘텐츠를 포함하는 파일을 유효한 PNG 이미지로 간주하며, 파일 이름이 photo.txt인 경우에도 마찬가지입니다. 사용자가 지정한 파일의 확장자를 유효성 검사하려면 extensions 규칙을 사용할 수 있습니다.
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에서 요구하는 동일한 형식을 따라야 하므로 유효한 구분자도 포함해야 합니다. 예: 'email' => ['not_regex:/^.+$/i'].
nullable
유효성 검사 대상 필드는 null일 수 있습니다.
numeric
유효성 검사 대상 필드는 숫자여야 합니다.
strict 파라미터를 사용하면 필드의 값이 정수 또는 부동소수점 타입인 경우에만 유효한 것으로 간주합니다. 숫자 문자열은 유효하지 않은 것으로 처리됩니다:
'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_,...
'role_id' => [Rule::prohibitedIf(fn () => $request->user()->is_admin)], ]); ```prohibited_unless:_anotherfield_,_value_,...
유효성 검사 중인 필드는 anotherfield 필드가 어떤 _value_와도 같지 않을 경우 누락되거나 비어 있어야 합니다. 필드가 다음 기준 중 하나를 충족하면 "비어 있음"으로 간주됩니다:
- 값이
null입니다. - 값이 빈 문자열입니다.
- 값이 빈 배열이거나 빈
Countable객체입니다. - 값이 빈 경로를 가진 업로드된 파일입니다.
prohibits:_anotherfield_,...
유효성 검사 중인 필드가 존재하고 비어 있지 않은 경우, _anotherfield_의 모든 필드는 누락되거나 비어 있어야 합니다. 필드가 다음 기준 중 하나를 충족하면 "비어 있음"으로 간주됩니다:
유효성 검사 중인 필드는 다른 모든 지정된 필드가 존재하는 경우에_만_ 존재해야 합니다.
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)],
]);php 'role_id' => [Rule::prohibitedIf(fn () => $request->user()->is_admin)], ]);
<h4 id="rule-regex">prohibited_if_accepted:_anotherfield_,...</h4>
유효성 검사 중인 필드는 _anotherfield_ 필드가 `"yes"`, `"on"`, `1`, `"1"`, `true`, 또는 `"true"`와 같을 경우 존재하지 않거나 비어 있어야 합니다.
<h4 id="rule-required">prohibited_if_declined:_anotherfield_,...</h4>
유효성 검사 중인 필드는 _anotherfield_ 필드가 `"no"`, `"off"`, `0`, `"0"`, `false`, 또는 `"false"`와 같을 경우 존재하지 않거나 비어 있어야 합니다.
<h4 id="rule-required-if">prohibited_unless:_anotherfield_,_value_,...</h4>
유효성 검사 중인 필드는 _anotherfield_ 필드가 어떤 _value_와도 같지 않은 경우 존재하지 않거나 비어 있어야 합니다. 필드가 다음 기준 중 하나를 충족하면 "비어 있음"으로 간주합니다:
- 값이 `null`인 경우.
- 값이 빈 문자열인 경우.
- 값이 빈 배열이거나 빈 `Countable` 객체인 경우.
- 값이 빈 경로를 가진 업로드된 파일인 경우.
복잡한 조건부 금지 로직이 필요한 경우 `Rule::prohibitedUnless` 메서드를 활용할 수 있습니다. 이 메서드는 불리언 또는 클로저를 인수로 받습니다. 클로저가 주어진 경우, 클로저는 유효성 검사 중인 필드가 금지되어야 하는지 여부를 나타내기 위해 `true` 또는 `false`를 반환해야 합니다:
```php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
php
'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에서 요구하는 동일한 형식을 따라야 하며, 따라서 유효한 구분자도 포함해야 합니다. 예를 들어: '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 등 일반적인 문자열 제약 조건에 대한 메서드를 제공합니다. 규칙 빌더는 조건부 적용이 가능하므로, when 및 unless 메서드를 사용하여 제약 조건을 조건부로 적용할 수도 있습니다.
timezone
유효성 검사 중인 필드는 DateTimeZone::listIdentifiers 메서드에 따른 유효한 타임존 식별자여야 합니다.
DateTimeZone::listIdentifiers 메서드가 허용하는 인수도 이 유효성 검사 규칙에 제공할 수 있습니다:
'timezone' => ['required', 'timezone:all'];
'timezone' => ['required', 'timezone:Africa'];
'timezone' => ['required', 'timezone:per_country,US'];unique:_table_,_column_
유효성 검사를 받는 필드는 주어진 데이터베이스 테이블 내에 존재하지 않아야 합니다.
커스텀 테이블 / 컬럼명 지정:
테이블명을 직접 지정하는 대신, 테이블명을 결정하는 데 사용할 Eloquent 모델을 지정할 수 있습니다:
'email' => ['unique:App\Models\User,email_address']column 옵션은 필드에 해당하는 데이터베이스 컬럼을 지정하는 데 사용할 수 있습니다. column 옵션이 지정되지 않으면, 유효성 검사를 받는 필드의 이름이 사용됩니다.
'email' => ['unique:users,email_address']커스텀 데이터베이스 연결 지정
경우에 따라, Validator가 수행하는 데이터베이스 쿼리에 커스텀 연결을 설정해야 할 수도 있습니다. 이를 위해 테이블명 앞에 연결명을 붙일 수 있습니다:
'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 규칙은 고유성을 판단할 때 소프트 삭제된 레코드를 포함합니다. 고유성 검사에서 소프트 삭제된 레코드를 제외하려면 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'],ulid
유효성 검사 중인 필드는 유효한 Universally Unique Lexicographically Sortable Identifier (ULID)여야 합니다.
uuid
유효성 검사 중인 필드는 유효한 RFC 9562 (버전 1, 3, 4, 5, 6, 7, 또는 8) 범용 고유 식별자 (UUID)여야 합니다.
버전별로 주어진 UUID가 UUID 사양과 일치하는지 유효성 검사를 할 수도 있습니다:
'uuid' => ['uuid: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'],
]);NOTE
exclude_if와 exclude_unless는 서로 정반대 조건입니다. exclude_if:A,B는 "A가 B이면 이 필드를 검사하지 않음"이고, exclude_unless:A,B는 "A가 B가 아니면 이 필드를 검사하지 않음"입니다.
필드가 존재할 때만 검사하기
입력 데이터에 특정 필드가 포함된 경우에만 유효성 검사를 실행하고 싶다면, 규칙 목록에 sometimes를 추가합니다.
$validator = Validator::make($data, [
'email' => ['sometimes', 'required', 'email'],
]);위 예시에서 email 필드는 $data 배열에 실제로 존재할 때만 검사됩니다. 필드가 없으면 검사 자체를 건너뜁니다.
NOTE
항상 존재해야 하지만 빈 값을 허용해야 하는 필드라면, sometimes가 아니라 선택적 필드 처리 방법을 참고하세요.
복잡한 조건부 유효성 검사
더 복잡한 조건 로직이 필요할 때도 있습니다. 예를 들어, 다른 필드의 값이 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';
});위 예시에서 channels 배열의 각 항목을 순회하면서, type이 'email'이면 address에 이메일 규칙을, 그렇지 않으면 URL 규칙을 적용합니다.
클로저의 $item 파라미터는 속성 데이터가 배열일 경우 Illuminate\Support\Fluent 인스턴스가 되고, 그렇지 않으면 문자열이 됩니다.
배열 유효성 검사
array 유효성 검사 규칙 문서에서 설명한 것처럼, array 규칙에는 허용할 배열 키 목록을 지정할 수 있습니다. 목록에 없는 키가 배열 안에 포함되어 있으면 유효성 검사가 실패합니다.
use Illuminate\Support\Facades\Validator;
$input = [
'user' => [
'name' => '홍길동',
'username' => 'gildong',
'admin' => true,
],
];
Validator::make($input, [
'user' => ['array:name,username'],
]);일반적으로 배열 안에서 허용할 키를 항상 명시적으로 지정하는 것이 좋습니다. 그렇지 않으면 validate와 validated 메서드가 배열과 그 모든 키를 포함한 전체 데이터를 반환합니다. 중첩 배열 검사 규칙으로 검증되지 않은 키까지 포함되므로 주의해야 합니다.
중첩 배열 입력 유효성 검사
중첩 배열 형태의 폼 입력을 검증할 때는 점 표기법(dot notation) 을 사용하면 편리합니다. 예를 들어 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' => '각 사용자는 고유한 이메일 주소를 사용해야 합니다.',
]
],중첩 배열 데이터 접근
유효성 검사 규칙을 할당할 때 특정 중첩 배열 요소의 실제 값에 접근해야 할 때가 있습니다. 이런 경우 Rule::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 | 0, 1, 2, … |
:position | 1 | 1, 2, 3, … |
:ordinal-position | 1st | 1st, 2nd, 3rd, … |
use Illuminate\Support\Facades\Validator;
$input = [
'photos' => [
[
'name' => 'summer_trip.jpg',
'description' => '여름 여행 사진입니다.',
],
[
'name' => 'jeju_island.jpg',
'description' => '',
],
],
];
Validator::validate($input, [
'photos.*.description' => ['required'],
], [
'photos.*.description.required' => ':position번째 사진의 설명을 입력해 주세요.',
]);위 예시에서 유효성 검사가 실패하면 사용자에게 "2번째 사진의 설명을 입력해 주세요." 라는 오류 메시지가 표시됩니다.
더 깊이 중첩된 배열의 인덱스나 위치를 참조해야 한다면 second-index, second-position, third-index, third-position 등을 사용할 수 있습니다.
'photos.*.attributes.*.string' => ':second-position번째 속성이 올바르지 않습니다.',파일 유효성 검사
Laravel은 업로드된 파일을 검사할 때 사용할 수 있는 다양한 유효성 검사 규칙을 제공합니다. mimes, image, min, max 등의 규칙을 개별적으로 지정할 수도 있지만, 보다 편리하게 사용할 수 있는 파일 유효성 검사 빌더도 제공합니다:
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 타입과 확장자의 전체 목록은 아래 링크에서 확인할 수 있습니다:
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) 확인할 수 있습니다.
이미지 크기(픽셀 단위)를 제한하고 싶다면 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
이미지 크기 검사에 대한 자세한 내용은 dimensions 규칙 문서를 참고하세요.
WARNING
기본적으로 image 규칙은 XSS 취약점 가능성 때문에 SVG 파일을 허용하지 않습니다. SVG 파일을 허용해야 한다면 allowSvg: true를 전달하세요: File::image(allowSvg: true)
이미지 크기(픽셀) 검사
이미지의 픽셀 크기를 별도로 검사할 수도 있습니다. 예를 들어 업로드된 이미지의 가로가 최대 1000픽셀, 세로가 최대 500픽셀이어야 한다면 다음과 같이 작성합니다:
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\File;
File::image()->dimensions(
Rule::dimensions()
->maxWidth(1000)
->maxHeight(500)
)NOTE
이미지 크기 검사에 대한 자세한 내용은 dimensions 규칙 문서를 참고하세요.
비밀번호 유효성 검사
비밀번호의 복잡도를 적절하게 강제하려면 Laravel의 Password 규칙 객체를 사용하세요:
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;
$validator = Validator::make($request->all(), [
'password' => ['required', 'confirmed', Password::min(8)],
]);Password 규칙 객체를 사용하면 비밀번호 복잡도 요건을 유연하게 설정할 수 있습니다. 예를 들어 영문자, 숫자, 기호, 대소문자 혼용 등의 조건을 조합하여 지정할 수 있습니다:
// 최소 8자 이상
Password::min(8)
// 영문자 포함 필수
Password::min(8)->letters()
// 대문자·소문자 혼용 필수
Password::min(8)->mixedCase()
// 숫자 포함 필수
Password::min(8)->numbers()
// 기호 포함 필수
Password::min(8)->symbols()또한 uncompromised 메서드를 사용하면 해당 비밀번호가 공개적으로 유출된 데이터에 포함되어 있는지 확인할 수 있습니다:
Password::min(8)->uncompromised()내부적으로 Password 규칙 객체는 k-익명성(k-Anonymity) 모델을 활용하여 haveibeenpwned.com 서비스를 통해 비밀번호 유출 여부를 확인합니다. 이 과정에서 사용자의 실제 비밀번호가 외부로 전송되지 않으므로 개인정보 보호에 안전합니다.
기본적으로 비밀번호가 유출 데이터에 한 번이라도 등장하면 유출된 것으로 간주합니다. uncompromised 메서드의 첫 번째 인수로 이 기준값을 조정할 수 있습니다:
// 동일한 유출 데이터에 3회 미만으로 등장하는 경우에는 허용
Password::min(8)->uncompromised(3);물론 위의 모든 메서드를 체이닝하여 한꺼번에 적용할 수 있습니다:
Password::min(8)
->letters()
->mixedCase()
->numbers()
->symbols()
->uncompromised()toPasswordRulesString 메서드를 사용하면 Password 규칙 객체를 HTML passwordrules 속성에 사용할 수 있는 문자열로 변환할 수 있습니다:
<input
type="password"
name="password"
autocomplete="new-password"
passwordrules="{{ Password::defaults()->toPasswordRulesString() }}"
/>기본 비밀번호 규칙 정의하기
애플리케이션 전체에서 사용할 비밀번호 기본 규칙을 한 곳에서 관리하면 유지보수가 훨씬 편리합니다. Password::defaults 메서드에 클로저를 전달하면 이를 쉽게 구현할 수 있습니다. 클로저는 기본 Password 규칙 구성을 반환해야 하며, 일반적으로 서비스 프로바이더의 boot 메서드 안에서 호출합니다:
use Illuminate\Validation\Rules\Password;
/**
* 애플리케이션 서비스를 부트스트랩합니다.
*/
public function boot(): void
{
Password::defaults(function () {
$rule = Password::min(8);
// 프로덕션 환경에서는 더 엄격한 규칙 적용
return $this->app->isProduction()
? $rule->mixedCase()->uncompromised()
: $rule;
});
}NOTE
위 예시처럼 환경(프로덕션/개발)에 따라 규칙을 다르게 적용하면, 개발 중에는 간단한 비밀번호로 테스트하면서도 실 서비스에서는 보안 요건을 충족할 수 있어 편리합니다.
이후 특정 비밀번호 필드에 기본 규칙을 적용하려면, 인수 없이 defaults 메서드를 호출하면 됩니다:
'password' => ['required', Password::defaults()],기본 규칙에 추가 유효성 검사 규칙을 덧붙이고 싶을 때는 rules 메서드를 사용하세요:
use App\Rules\ZxcvbnRule;
Password::defaults(function () {
$rule = Password::min(8)->rules([new ZxcvbnRule]);
// ...
});유효성 검사
커스텀 유효성 검사 규칙
규칙 객체 사용하기
Laravel은 다양한 내장 유효성 검사 규칙을 제공하지만, 프로젝트에 맞는 커스텀 규칙이 필요할 때도 있습니다. 커스텀 규칙을 만드는 가장 구조적인 방법은 **규칙 객체(Rule Object)**를 사용하는 것입니다. make:rule Artisan 명령어로 새 규칙 클래스를 생성할 수 있습니다. 예를 들어, 문자열이 모두 대문자인지 확인하는 규칙을 만들어 보겠습니다. 생성된 클래스는 app/Rules 디렉터리에 저장됩니다. 해당 디렉터리가 없으면 Artisan이 자동으로 생성합니다.
php artisan make:rule Uppercase규칙 클래스가 생성되면 동작을 정의합니다. 규칙 객체는 validate라는 단일 메서드를 가집니다. 이 메서드는 필드명, 해당 값, 그리고 유효성 검사 실패 시 호출할 $fail 콜백을 인자로 받습니다.
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class Uppercase implements ValidationRule
{
/**
* 유효성 검사 규칙을 실행합니다.
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (strtoupper($value) !== $value) {
$fail(':attribute 필드는 반드시 대문자여야 합니다.');
}
}
}규칙을 정의했다면, 다른 검사 규칙과 함께 규칙 객체의 인스턴스를 배열에 넣어 사용합니다.
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,
], 'ko');다른 입력 데이터에 접근하기
커스텀 규칙 클래스에서 현재 검사 중인 필드 외에 다른 모든 입력 데이터에도 접근해야 한다면, 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
{
/**
* 유효성 검사 중인 모든 데이터.
*
* @var array<string, mixed>
*/
protected $data = [];
// ...
/**
* 유효성 검사 데이터를 설정합니다.
*
* @param array<string, mixed> $data
*/
public function setData(array $data): static
{
$this->data = $data;
return $this;
}
}혹은 유효성 검사를 수행하는 Validator 인스턴스 자체에 접근해야 한다면, ValidatorAwareRule 인터페이스를 구현합니다.
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Contracts\Validation\ValidatorAwareRule;
use Illuminate\Validation\Validator;
class Uppercase implements ValidationRule, ValidatorAwareRule
{
/**
* Validator 인스턴스.
*
* @var \Illuminate\Validation\Validator
*/
protected $validator;
// ...
/**
* 현재 Validator를 설정합니다.
*/
public function setValidator(Validator $validator): static
{
$this->validator = $validator;
return $this;
}
}클로저 사용하기
애플리케이션에서 한 곳에서만 사용하는 간단한 커스텀 규칙이라면, 별도의 클래스를 만들지 않고 클로저로 바로 정의할 수 있습니다. 클로저는 필드명, 값, 그리고 실패 시 호출할 $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("{$attribute} 필드의 값이 유효하지 않습니다.");
}
},
],
]);묵시적(Implicit) 규칙
기본적으로 유효성 검사 대상 필드가 요청에 없거나 빈 문자열인 경우, 커스텀 규칙을 포함한 일반 검사 규칙은 실행되지 않습니다. 예를 들어, unique 규칙은 빈 문자열에 대해서는 실행되지 않습니다.
use Illuminate\Support\Facades\Validator;
$rules = ['name' => ['unique:users,name']];
$input = ['name' => ''];
Validator::make($input, $rules)->passes(); // true필드가 비어 있거나 존재하지 않더라도 커스텀 규칙을 반드시 실행하고 싶다면, 해당 규칙이 필드의 존재를 요구함을 암묵적으로 나타내는 묵시적 규칙으로 만들어야 합니다. make:rule 명령어에 --implicit 옵션을 추가하면 됩니다.
php artisan make:rule Uppercase --implicitWARNING
묵시적 규칙은 해당 필드가 필수임을 암시할 뿐입니다. 실제로 값이 없거나 비어 있을 때 유효성 검사를 통과시킬지 여부는 규칙 내부 로직에서 직접 결정해야 합니다.