유효성 검증 (Validation)
- 소개
- 검증 빠른 시작
- 양식 요청 확인
- 수동으로 유효성 검사기 생성
- 검증된 입력 작업
- 오류 메시지 작업
- 사용 가능한 유효성 검증 규칙
- 조건부 규칙 추가
- 배열 유효성 검증
- 파일 유효성 검증
- 비밀번호 유효성 검증
- 사용자 지정 검증 규칙
소개 (Introduction)
Laravel는 애플리케이션의 수신 데이터를 검증하기 위한 다양한 접근 방식을 제공합니다. 들어오는 모든 HTTP 요청에 사용할 수 있는 validate 메서드를 사용하는 것이 가장 일반적입니다. 그러나 검증에 대한 다른 접근 방식도 논의할 것입니다.
Laravel에는 데이터에 적용할 수 있는 다양하고 편리한 유효성 검사 규칙이 포함되어 있으며, 특정 데이터베이스 테이블에서 값이 고유한지 유효성을 검사하는 기능도 제공합니다. Laravel의 모든 유효성 검사 기능에 익숙해질 수 있도록 이러한 각 유효성 검사 규칙을 자세히 다룰 것입니다.
검증 빠른 시작 (Validation Quickstart)
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 메서드로 전달됩니다. 걱정하지 마세요. 사용 가능한 모든 유효성 검사 규칙은 문서화되어 있습니다. 다시 말하지만 유효성 검사가 실패하면 적절한 응답이 자동으로 생성됩니다. 유효성 검사가 통과되면 컨트롤러가 정상적으로 계속 실행됩니다.
또는 유효성 검사 규칙을 단일 | 구분 문자열 대신 규칙 배열로 지정할 수도 있습니다.
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
또한 validateWithBag 메소드를 사용하여 요청을 검증하고 이름이 지정된 오류 백 내에 오류 메시지를 저장할 수 있습니다.
$validatedData = $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 요청에 "중첩" 필드 데이터가 포함되어 있는 경우 "점" 구문을 사용하여 유효성 검사 규칙에 다음 필드를 지정할 수 있습니다.
$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 변수가 항상 정의되어 안전하게 사용할 수 있다고 편리하게 가정할 수 있습니다. $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:publishArtisan 명령을 통해 게시할 수 있습니다.
XHR 요청 및 검증
이 예에서는 전통적인 양식을 사용하여 애플리케이션에 데이터를 보냈습니다. 그러나 많은 애플리케이션은 JavaScript 기반 프론트엔드에서 XHR 요청을 받습니다. XHR 요청 중에 validate 메서드를 사용하면 Laravel는 리디렉션 응답을 생성하지 않습니다. 대신, Laravel는 모든 유효성 검사 오류를 포함하는 JSON 응답을 생성합니다. 이 JSON 응답은 422 HTTP 상태 코드와 함께 전송됩니다.
@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 응답 형식의 예를 검토할 수 있습니다. 중첩된 오류 키는 "점" 표기법 형식으로 평면화됩니다.
{
"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 Validation)
양식 요청 생성
보다 복잡한 유효성 검사 시나리오의 경우 "양식 요청"을 생성할 수 있습니다. 양식 요청은 자체 유효성 검사 및 인증 논리를 캡슐화하는 사용자 지정 요청 클래스입니다. 양식 요청 클래스를 생성하려면 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 요청인 경우 422 상태 코드가 포함된 HTTP 응답이 JSON 유효성 검사 오류 표현을 포함하여 사용자에게 반환됩니다.
[!NOTE] Inertia 기반 Laravel 프론트엔드에 실시간 양식 요청 확인을 추가해야 합니까? Laravel 예지를 확인해보세요.
추가 검증 수행
초기 검증이 완료된 후 추가 검증을 수행해야 하는 경우가 있습니다. 양식 요청의 after 메소드를 사용하여 이를 수행할 수 있습니다.
after 메소드는 검증이 완료된 후 호출될 콜러블 또는 클로저의 배열을 반환해야 합니다. 지정된 콜러블은 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 메서드에서 반환된 배열에는 호출 가능한 클래스가 포함될 수도 있습니다. 이러한 클래스의 __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 속성을 추가하면 단 하나의 유효성 검사가 실패한 뒤 모든 속성의 유효성 검사를 중지하도록 validator에 알릴 수 있습니다.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\Attributes\StopOnFirstFailure;
use Illuminate\Foundation\Http\FormRequest;
#[StopOnFirstFailure]
class StorePostRequest extends FormRequest
{
// ...
}
리디렉션 위치 사용자 지정
양식 요청 유효성 검사가 실패하면 사용자를 이전 위치로 다시 보내기 위한 리디렉션 응답이 생성됩니다. 그러나 이 동작을 자유롭게 사용자 지정할 수 있습니다. 이를 위해 양식 요청에 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',
];
}
검증을 위한 입력 준비
유효성 검사 규칙을 적용하기 전에 요청의 데이터를 준비하거나 삭제해야 하는 경우 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']);
}
수동으로 유효성 검사기 생성 (Manually Creating Validators)
요청에 validate 메서드를 사용하지 않으려면 Validator facade를 사용하여 수동으로 유효성 검사기 인스턴스를 생성할 수 있습니다. 파사드의 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',
];
주어진 속성에 대한 사용자 지정 메시지 지정
때로는 특정 속성에 대해서만 사용자 지정 오류 메시지를 지정하고 싶을 수도 있습니다. "점" 표기법을 사용하여 그렇게 할 수 있습니다. 먼저 속성 이름을 지정한 다음 규칙을 지정합니다.
$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 메소드는 검증이 완료된 후 호출될 콜러블 배열이나 클로저를 허용합니다. 지정된 콜러블은 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 메소드는 콜러블 배열도 허용합니다. 이는 "검증 후" 로직이 __invoke 메소드를 통해 Illuminate\Validation\Validator 인스턴스를 수신하는 호출 가능 클래스에 캡슐화되어 있는 경우 특히 편리합니다.
use App\Validation\ValidateShippingTime;
use App\Validation\ValidateUserStatus;
$validator->after([
new ValidateUserStatus,
new ValidateShippingTime,
function ($validator) {
// ...
},
]);
검증된 입력 작업 (Working With Validated Input)
양식 요청 또는 수동으로 생성된 유효성 검사기 인스턴스를 사용하여 들어오는 요청 데이터의 유효성을 검사한 후 실제로 유효성 검사를 거친 들어오는 요청 데이터를 검색할 수 있습니다. 이는 여러 가지 방법으로 수행할 수 있습니다. 먼저, 양식 요청이나 유효성 검사기 인스턴스에서 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 인스턴스는 배열처럼 반복되고 액세스될 수 있습니다.
// 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();
오류 메시지 작업 (Working With Error Messages)
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:publishArtisan 명령을 통해 게시할 수 있습니다.
특정 속성에 대한 사용자 지정 메시지
애플리케이션의 유효성 검사 언어 파일 내에서 지정된 속성 및 규칙 조합에 사용되는 오류 메시지를 사용자 지정할 수 있습니다. 이렇게 하려면 애플리케이션 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:publishArtisan 명령을 통해 게시할 수 있습니다.
언어 파일에 값 지정
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를 결제 유형 값으로 표시하는 대신 values 배열을 정의하여 lang/xx/validation.php 언어 파일에 보다 사용자 친화적인 값 표현을 지정할 수 있습니다.
'values' => [
'payment_type' => [
'cc' => 'credit card'
],
],
[!WARNING] 기본적으로 Laravel 애플리케이션 스켈레톤에는
lang디렉터리가 포함되지 않습니다. Laravel의 언어 파일을 사용자 지정하려면lang:publishArtisan 명령을 통해 게시할 수 있습니다.
이 값을 정의한 후 유효성 검사 규칙은 다음과 같은 오류 메시지를 생성합니다.
The credit card number field is required when payment type is credit card.
사용 가능한 검증 규칙 (Available Validation Rules)
다음은 사용 가능한 모든 유효성 검사 규칙과 해당 기능의 목록입니다.
부울
문자열
활성 URL 알파 알파 대시 영숫자 아스키 확인됨 현재 비밀번호 다른 다음으로 시작하지 않음 다음으로 끝나지 않음 이메일 다음으로 끝남 열거형 헥스 컬러 인 IP 주소 JSON 소문자 MAC 주소 최대 최소 포함되지 않음 정규식 정규식이 아님 동일 사이즈 다음으로 시작 문자열 대문자 URL ULID UUID
숫자
배열
날짜
파일
데이터 베이스
유용
다음 중 하나 보석 제외 다음 경우 제외 제외 제외 다음으로 제외 없이 제외 채워짐 누락 누락된 경우 누락되지 않은 경우 누락됨 모두 누락됨 널 입력 가능 현재 현재의 경우 현재가 아니면 다음과 함께 제공 모두와 함께 선물 금지 금지되는 경우 동의 시 금지 거부시 금지 금지 금지 필수 필수인 경우 수락하는 경우 필수 거부시 필수 필수 사항 필수 모두 필수 없이 필수 모두 제외 필수 필수 배열 키 가끔
수락됨
검증 중인 필드는 "yes", "on", 1, "1", true 또는 "true"여야 합니다. 이는 "서비스 약관" 동의 또는 유사한 필드를 확인하는 데 유용합니다.
allowed_if:anotherfield,값,...
유효성 검사 중인 다른 필드가 지정된 값과 같은 경우 유효성 검사 중인 필드는 "yes", "on", 1, "1", true 또는 "true"여야 합니다. 이는 "서비스 약관" 동의 또는 유사한 필드를 확인하는 데 유용합니다.
활성_URL
유효성 검사 중인 필드에는 dns_get_record PHP 함수에 따라 유효한 A 또는 AAAA 레코드가 있어야 합니다. 제공된 URL의 호스트 이름은 dns_get_record에 전달되기 전에 parse_url PHP 함수를 사용하여 추출됩니다.
이후:date
유효성 검사 중인 필드는 지정된 날짜 이후의 값이어야 합니다. 날짜는 유효한 DateTime 인스턴스로 변환하기 위해 strtotime PHP 함수로 전달됩니다.
'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(),
],
이후_또는_equal:date
유효성 검사 중인 필드는 지정된 날짜 이후의 값이어야 합니다. 자세한 내용은 이후 규칙을 참조하세요.
편의를 위해 date 규칙 빌더를 사용하여 날짜 기반 규칙을 구성할 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->afterOrEqual(today()->addDays(7)),
],
아무거나
Rule::anyOf 유효성 검사 규칙을 사용하면 유효성 검사 중인 필드가 지정된 유효성 검사 규칙 세트 중 하나를 충족해야 함을 지정할 수 있습니다. 예를 들어, 다음 규칙은 username 필드가 이메일 주소이거나 길이가 6자 이상인 영숫자 문자열(대시 포함)인지 확인합니다.
use Illuminate\Validation\Rule;
'username' => [
'required',
Rule::anyOf([
['string', 'email'],
['string', 'alpha_dash', 'min:6'],
]),
],
알파
유효성 검사 대상 필드는 \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',
정렬
검증 중인 필드는 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',
]);
일반적으로 배열 내에 존재할 수 있는 배열 키를 항상 지정해야 합니다.
아스키
유효성 검사 대상 필드는 전체가 7비트 ASCII 문자여야 합니다.
보석
첫 번째 유효성 검사가 실패한 후 해당 필드에 대한 유효성 검사 규칙 실행을 중지합니다.
bail 규칙은 유효성 검사에 실패할 경우에만 특정 필드의 유효성 검사를 중지하지만, stopOnFirstFailure 메서드는 단일 유효성 검사가 실패하면 모든 속성의 유효성 검사를 중지해야 한다고 유효성 검사기에 알립니다.
if ($validator->stopOnFirstFailure()->fails()) {
// ...
}
이전: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(),
],
이전_또는_equal:date
유효성 검사 중인 필드는 지정된 날짜보다 이전이거나 같은 값이어야 합니다. 날짜는 유효한 DateTime 인스턴스로 변환하기 위해 PHP strtotime 함수로 전달됩니다. 또한 after 규칙과 마찬가지로 유효성 검사 중인 다른 필드의 이름이 date 값으로 제공될 수 있습니다.
편의를 위해 date 규칙 빌더를 사용하여 날짜 기반 규칙을 구성할 수도 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->beforeOrEqual(today()->subDays(7)),
],
:min,max 사이
유효성 검사 중인 필드의 크기는 지정된 _min_과 max(포함) 사이여야 합니다. 문자열, 숫자, 배열 및 파일은 size 규칙과 동일한 방식으로 평가됩니다.
부울
유효성 검사 중인 필드는 부울로 캐스팅될 수 있어야 합니다. 허용되는 입력은 true, false, 1, 0, "1" 및 "0"입니다.
strict 매개변수를 사용하면 해당 값이 true 또는 false인 경우에만 필드가 유효한 것으로 간주할 수 있습니다.
'foo' => 'boolean:strict'
확인됨
유효성 검사 중인 필드에는 {field}_confirmation와 일치하는 필드가 있어야 합니다. 예를 들어 유효성 검사 중인 필드가 password인 경우 일치하는 password_confirmation 필드가 입력에 있어야 합니다.
사용자 지정 확인 필드 이름을 전달할 수도 있습니다. 예를 들어, confirmed:repeat_username는 repeat_username 필드가 유효성 검사 중인 필드와 일치할 것으로 예상합니다.
포함:foo,bar,...
유효성 검사 대상 필드는 지정된 매개변수 값을 모두 포함하는 배열이어야 합니다. 이 규칙에서는 배열을 implode해야 하는 경우가 많기 때문에 Rule::contains 메서드를 사용하여 규칙을 원활하게 구성할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'roles' => [
'required',
'array',
Rule::contains(['admin', 'editor']),
],
]);
dont_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']),
],
]);
현재_비밀번호
검증 중인 필드는 인증된 사용자의 비밀번호와 일치해야 합니다. 규칙의 첫 번째 매개변수를 사용하여 인증 가드를 지정할 수 있습니다.
'password' => 'current_password:api'
날짜
유효성 검사 중인 필드는 strtotime PHP 함수에 따라 유효한 비상대 날짜여야 합니다.
date_equals:date
유효성 검사 중인 필드는 지정된 날짜와 동일해야 합니다. 날짜는 유효한 DateTime 인스턴스로 변환되기 위해 PHP strtotime 함수로 전달됩니다.
날짜_형식:format,...
유효성 검사 중인 필드는 지정된 formats 중 하나와 일치해야 합니다. 필드 유효성을 검사할 때 date 또는 date_format 중 하나만 사용해야 하며 둘 다 사용할 수는 없습니다. 이 유효성 검사 규칙은 PHP의 DateTime 클래스에서 지원하는 모든 형식을 지원합니다.
편의를 위해 date 규칙 빌더를 사용하여 날짜 기반 규칙을 구성할 수 있습니다.
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->format('Y-m-d'),
],
십진수: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'
거절하다
검증 중인 필드는 "no", "off", 0, "0", false 또는 "false"여야 합니다.
거부됨_if:anotherfield,값,...
유효성 검사 중인 다른 필드가 지정된 값과 같은 경우 유효성 검사 중인 필드는 "no", "off", 0, "0", false 또는 "false"여야 합니다.
다른:field
유효성 검사 중인 필드는 _field_와 다른 값을 가져야 합니다.
숫자:value
검증 중인 정수의 정확한 길이는 _value_여야 합니다.
digits_between:min,max
검증 중인 정수는 지정된 _min_과 max 사이의 길이를 가져야 합니다.
치수
검증 중인 파일은 규칙 매개변수에 지정된 치수 제약 조건을 충족하는 이미지여야 합니다.
'avatar' => 'dimensions:min_width=100,min_height=200'
사용 가능한 제약 조건은 min_width, max_width, min_height, max_height, width, height, _ratio_입니다.
ratio 제약 조건은 너비를 높이로 나눈 값으로 표현되어야 합니다. 이는 3/2와 같은 분수 또는 1.5와 같은 부동소수점으로 지정할 수 있습니다.
'avatar' => 'dimensions: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),
],
]);
별개의
배열의 유효성을 검사할 때 유효성 검사 중인 필드에 중복된 값이 있어서는 안 됩니다.
'foo.*.id' => 'distinct'
Distinct는 기본적으로 느슨한 변수 비교를 사용합니다. 엄격한 비교를 사용하려면 유효성 검사 규칙 정의에 strict 매개변수를 추가할 수 있습니다.
'foo.*.id' => 'distinct:strict'
규칙이 대문자 사용 차이를 무시하도록 확인 규칙의 인수에 ignore_case를 추가할 수 있습니다.
'foo.*.id' => 'distinct:ignore_case'
:foo,bar,...로 시작_하지 않음
유효성 검사 중인 필드는 지정된 값 중 하나로 시작하면 안 됩니다.
dont_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- 이메일 주소에 동형이의어 또는 사기성 유니코드 문자가 포함되어 있지 않은지 확인하세요.filter:FilterEmailValidation- PHP의filter_var기능에 따라 이메일 주소가 유효한지 확인하세요.filter_unicode:FilterEmailValidation::unicode()- PHP의filter_var기능에 따라 이메일 주소가 유효한지 확인하고 일부 유니코드 문자를 허용합니다.
편의를 위해 Fluent Rule Builder를 사용하여 이메일 유효성 검사 규칙을 구축할 수 있습니다.
use Illuminate\Validation\Rule;
$request->validate([
'email' => [
'required',
Rule::email()
->rfcCompliant(strict: false)
->validateMxRecord()
->preventSpoofing()
],
]);
[!WARNING]
dns및spoof검사기에는 PHPintl확장이 필요합니다.
인코딩:encoding_type
유효성 검사 중인 필드는 지정된 문자 인코딩과 일치해야 합니다. 이 규칙은 PHP의 mb_check_encoding 함수를 사용하여 지정된 파일 또는 문자열 값의 인코딩을 확인합니다. 편의를 위해 Laravel의 흐름 파일 규칙 빌더를 사용하여 encoding 규칙을 구성할 수 있습니다.
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\File;
Validator::validate($input, [
'attachment' => [
'required',
File::types(['csv'])
->encoding('utf-8'),
],
]);
끝_with:foo,bar,...
유효성 검사 중인 필드는 지정된 값 중 하나로 끝나야 합니다.
열거형
Enum 규칙은 유효성 검사 중인 필드에 유효한 열거형 값이 포함되어 있는지 여부를 확인하는 클래스 기반 규칙입니다. Enum 규칙은 열거형의 이름을 유일한 생성자 인수로 허용합니다. 기본 값의 유효성을 검사할 때 지원되는 Enum이 Enum 규칙에 제공되어야 합니다.
use App\Enums\ServerStatus;
use Illuminate\Validation\Rule;
$request->validate([
'status' => [Rule::enum(ServerStatus::class)],
]);
Enum 규칙의 only 및 except 메서드는 유효한 것으로 간주되어야 하는 열거형 사례를 제한하는 데 사용될 수 있습니다.
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(...),
);
들어오지 못하게 하다
유효성 검사 중인 필드는 validate 및 validated 메서드에서 반환된 요청 데이터에서 제외됩니다.
제외_if:anotherfield,값
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),
]);
제외_unless:anotherfield,값
유효성 검사 중인 필드는 _anotherfield_의 필드가 _value_와 같지 않으면 validate 및 validated 메서드에서 반환된 요청 데이터에서 제외됩니다. _value_가 null(exclude_unless:name,null)인 경우 비교 필드가 null이거나 비교 필드가 요청 데이터에서 누락되지 않는 한 유효성 검사 중인 필드가 제외됩니다.
제외_with:anotherfield
유효성 검사 중인 필드는 anotherfield 필드가 있는 경우 validate 및 validated 메서드에서 반환된 요청 데이터에서 제외됩니다.
제외_without:anotherfield
유효성 검사 중인 필드는 anotherfield 필드가 없는 경우 validate 및 validated 메서드에서 반환된 요청 데이터에서 제외됩니다.
존재:table,column
검증 중인 필드는 지정된 데이터베이스 테이블에 존재해야 합니다.
존재 규칙의 기본 사용법
'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);
}),
],
]);
열 이름을 exists 메서드의 두 번째 인수로 제공하여 Rule::exists 메서드에서 생성된 exists 규칙에서 사용해야 하는 데이터베이스 열 이름을 명시적으로 지정할 수 있습니다.
'state' => Rule::exists('states', 'abbreviation'),
때로는 데이터베이스에 값 배열이 존재하는지 확인하고 싶을 수도 있습니다. 유효성을 검사하는 필드에 exists 및 array 규칙을 모두 추가하면 됩니다.
'states' => ['array', Rule::exists('states', 'abbreviation')],
이 두 규칙이 모두 필드에 할당되면 Laravel는 자동으로 단일 쿼리를 작성하여 지정된 모든 값이 지정된 테이블에 존재하는지 확인합니다.
확장자:foo,bar,...
유효성 검사 중인 파일에는 나열된 확장자 중 하나에 해당하는 사용자 할당 확장자가 있어야 합니다.
'photo' => ['required', 'extensions:jpg,png'],
[!WARNING] 사용자가 할당한 확장자만으로 파일 유효성을 검사하는 데 의존해서는 안 됩니다. 이 규칙은 일반적으로 항상 mimes 또는 mimetypes 규칙과 함께 사용해야 합니다.
파일
검증 중인 필드는 성공적으로 업로드된 파일이어야 합니다.
채우는
유효성 검사 중인 필드는 비어 있으면 안 됩니다.
gt:field
유효성 검사 중인 필드는 지정된 field 또는 _value_보다 커야 합니다. 두 필드는 동일한 유형이어야 합니다. 문자열, 숫자, 배열 및 파일은 size 규칙과 동일한 규칙을 사용하여 평가됩니다.
gte:field
유효성 검사 중인 필드는 지정된 field 또는 _value_보다 크거나 같아야 합니다. 두 필드는 동일한 유형이어야 합니다. 문자열, 숫자, 배열 및 파일은 size 규칙과 동일한 규칙을 사용하여 평가됩니다.
hex_color
유효성 검사 중인 필드에는 16진수 형식의 유효한 색상 값이 포함되어야 합니다.
영상
유효성 검사 대상 파일은 이미지(jpg, jpeg, png, bmp, gif 또는 webp)여야 합니다.
[!WARNING] 기본적으로 이미지 규칙은 XSS 취약점 가능성으로 인해 SVG 파일을 허용하지 않습니다. SVG 파일을 허용해야 하는 경우
allow_svg지시문을image규칙(image:allow_svg)에 제공할 수 있습니다.
: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.*
유효성 검사 대상 필드는 주어진 values 중 하나 이상을 배열 내의 키로 갖는 배열이어야 합니다.
'config' => 'array|in_array_keys:timezone'
정수
검증 중인 필드는 정수여야 합니다.
strict 매개변수를 사용하면 해당 유형이 integer인 경우에만 필드가 유효한 것으로 간주할 수 있습니다. 정수 값이 있는 문자열은 유효하지 않은 것으로 간주됩니다.
'age' => 'integer:strict'
[!WARNING] 이 유효성 검사 규칙은 입력이 "정수" 변수 유형인지 확인하지 않고 입력이 PHP의
FILTER_VALIDATE_INT규칙에서 허용하는 유형인지만 확인합니다. 입력이 숫자인지 확인해야 하는 경우 이 규칙을numeric확인 규칙과 함께 사용하세요.
아이피
검증 중인 필드는 IP 주소여야 합니다.
IPv4
검증 중인 필드는 IPv4 주소여야 합니다.
IPv6
검증 중인 필드는 IPv6 주소여야 합니다.
JSON
검증 중인 필드는 유효한 JSON 문자열이어야 합니다.
lt:field
유효성 검사 중인 필드는 지정된 _field_보다 작아야 합니다. 두 필드는 동일한 유형이어야 합니다. 문자열, 숫자, 배열 및 파일은 size 규칙과 동일한 규칙을 사용하여 평가됩니다.
lte:field
유효성 검사 중인 필드는 지정된 _field_보다 작거나 같아야 합니다. 두 필드는 동일한 유형이어야 합니다. 문자열, 숫자, 배열 및 파일은 size 규칙과 동일한 규칙을 사용하여 평가됩니다.
소문자
유효성 검사 중인 필드는 소문자여야 합니다.
목록
유효성 검사 대상 필드는 목록인 배열이어야 합니다. 키가 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 유효성 검사 규칙은 파일 이름이 photo.txt인 경우에도 유효한 PNG 콘텐츠가 포함된 파일을 유효한 PNG 이미지로 간주합니다. 사용자가 할당한 파일 확장자를 확인하려면 확장자 규칙을 사용할 수 있습니다.
최소:value
검증 중인 필드에는 최소 _value_가 있어야 합니다. 문자열, 숫자, 배열 및 파일은 size 규칙과 동일한 방식으로 평가됩니다.
min_digits:value
검증 중인 정수의 최소 길이는 _value_여야 합니다.
multiple_of:value
검증 중인 필드는 _value_의 배수여야 합니다.
없어진
유효성 검사 중인 필드는 입력 데이터에 없어야 합니다.
누락_if:anotherfield,값,...
anotherfield 필드가 임의의 _value_와 같은 경우 유효성 검사 중인 필드가 없어야 합니다.
누락된_unless:anotherfield,값
anotherfield 필드가 임의의 _value_와 동일하지 않으면 유효성 검사 중인 필드가 존재해서는 안 됩니다.
누락_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'.
[!WARNING]
regex/not_regex패턴을 사용할 때 특히 정규식에|문자가 포함된 경우|구분 기호를 사용하는 대신 배열을 사용하여 유효성 검사 규칙을 지정해야 할 수도 있습니다.
널 입력 가능
검증 중인 필드는 null일 수 있습니다.
숫자
검증 중인 필드는 숫자여야 합니다.
strict 매개변수를 사용하면 해당 값이 정수 또는 부동 소수점 유형인 경우에만 필드가 유효한 것으로 간주할 수 있습니다. 숫자 문자열은 유효하지 않은 것으로 간주됩니다.
'amount' => 'numeric:strict'
현재의
유효성 검증 중인 필드가 입력 데이터에 존재해야 합니다.
현재_if:anotherfield,값,...
anotherfield 필드가 임의의 _value_와 같은 경우 유효성 검사 중인 필드가 있어야 합니다.
현재_unless:anotherfield,value
anotherfield 필드가 _value_와 동일하지 않은 경우 유효성 검사 중인 필드가 있어야 합니다.
현재_with:foo,bar,...
유효성 검사 중인 필드는 지정된 다른 필드가 있는 경우에만_ 존재해야 합니다.
현재_with_all:foo,bar,...
유효성 검사 중인 필드는 지정된 다른 필드가 모두 존재하는 경우에만_ 존재해야 합니다.
금지된
유효성 검사 중인 필드가 누락되었거나 비어 있어야 합니다. 다음 기준 중 하나를 충족하는 경우 필드는 "비어 있습니다".
- 값은
null입니다. - 값은 빈 문자열입니다.
- 값은 빈 배열 또는 빈
Countable객체입니다. - 값은 경로가 비어 있는 업로드된 파일입니다.
금지_if:anotherfield,값,...
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),
]);
allowed_if_accepted:anotherfield,...
anotherfield 필드가 "yes", "on", 1, "1", true 또는 "true"와 같은 경우 유효성 검사 중인 필드가 누락되었거나 비어 있어야 합니다.
allowed_if_declined:anotherfield,...
anotherfield 필드가 "no", "off", 0, "0", false 또는 "false"와 같은 경우 유효성 검사 중인 필드가 누락되었거나 비어 있어야 합니다.
allowed_unless:anotherfield,value,...
anotherfield 필드가 _value_와 동일하지 않은 경우 유효성 검사 중인 필드는 누락되거나 비어 있어야 합니다. 다음 기준 중 하나를 충족하는 경우 필드는 "비어 있습니다".
- 값은
null입니다. - 값은 빈 문자열입니다.
- 값은 빈 배열 또는 빈
Countable객체입니다. - 값은 경로가 비어 있는 업로드된 파일입니다.
:_anotherfield_를 금지합니다...
유효성 검사 중인 필드가 누락되거나 비어 있지 않은 경우 _anotherfield_의 모든 필드가 누락되거나 비어 있어야 합니다. 다음 기준 중 하나를 충족하는 경우 필드는 "비어 있습니다".
- 값은
null입니다. - 값은 빈 문자열입니다.
- 값은 빈 배열 또는 빈
Countable객체입니다. - 값은 경로가 비어 있는 업로드된 파일입니다.
정규식:pattern
유효성 검사 중인 필드는 지정된 정규식과 일치해야 합니다.
내부적으로 이 규칙은 PHP preg_match 함수를 사용합니다. 지정된 패턴은 preg_match에서 요구하는 것과 동일한 형식을 준수해야 하므로 유효한 구분 기호도 포함해야 합니다. 예: 'email' => 'regex:/^.+@.+$/i'.
[!WARNING]
regex/not_regex패턴을 사용할 때 특히 정규식에|문자가 포함된 경우|구분 기호를 사용하는 대신 배열에 규칙을 지정해야 할 수도 있습니다.
필수의
유효성 검사 중인 필드는 입력 데이터에 있어야 하며 비어 있으면 안 됩니다. 다음 기준 중 하나를 충족하는 경우 필드는 "비어 있습니다".
- 값은
null입니다. - 값은 빈 문자열입니다.
- 값은 빈 배열 또는 빈
Countable객체입니다. - 값은 경로가 없는 업로드된 파일입니다.
필수_if:anotherfield,값,...
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),
]);
필수_if_accepted:anotherfield,...
anotherfield 필드가 "yes", "on", 1, "1", true 또는 "true"와 같은 경우 유효성 검사 중인 필드가 있어야 하며 비어 있지 않아야 합니다.
필수_if_거절:anotherfield,...
anotherfield 필드가 "no", "off", 0, "0", false 또는 "false"와 같은 경우 유효성 검사 중인 필드가 있어야 하며 비어 있지 않아야 합니다.
필수_unless:anotherfield,값,...
유효성 검사 중인 필드는 존재해야 하며 anotherfield 필드가 _value_와 동일하지 않는 한 비어 있어서는 안 됩니다. 이는 또한 _value_가 null가 아닌 한 요청 데이터에 _anotherfield_가 있어야 함을 의미합니다. _value_가 null(required_unless:name,null)인 경우 비교 필드가 null이거나 요청 데이터에서 비교 필드가 누락되지 않는 한 유효성 검사 중인 필드가 필요합니다.
필수_with:foo,bar,...
유효성 검사 중인 필드는 존재해야 하며 비어 있지 않아야 합니다. 지정된 다른 필드 중 하나라도 존재하고 비어 있지 않은 경우에만_입니다.
필수_with_all:foo,bar,...
유효성 검사 대상 필드는 반드시 존재해야 하며 비어 있지 않아야 합니다. 지정된 다른 모든 필드가 모두 존재하고 비어 있지 않은 경우에만_입니다.
필수_없이:foo,bar,...
유효성 검사 중인 필드는 반드시 존재해야 하며, 지정된 다른 필드가 비어 있거나 존재하지 않는 경우에만 비어 있으면 안 됩니다.
필수_없이_all:foo,bar,...
유효성 검사 중인 필드는 반드시 존재해야 하며, 지정된 다른 모든 필드가 비어 있거나 존재하지 않는 경우에만 비어 있으면 안 됩니다.
필수_배열_키s:foo,bar,...
유효성 검사 대상 필드는 배열이어야 하며 최소한 지정된 키를 포함해야 합니다.
동일:field
주어진 _field_는 검증 중인 필드와 일치해야 합니다.
크기:value
유효성 검사 중인 필드는 지정된 _value_와 일치하는 크기를 가져야 합니다. 문자열 데이터의 경우 _value_는 문자 수에 해당합니다. 숫자 데이터의 경우 _value_는 지정된 정수 값에 해당합니다(특성에는 numeric 또는 integer 규칙도 있어야 함). 배열의 경우 _size_는 배열의 count에 해당합니다. 파일의 경우 _size_는 파일 크기(KB)에 해당합니다. 몇 가지 예를 살펴보겠습니다.
// 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';
시작_with:foo,bar,...
유효성 검사 중인 필드는 지정된 값 중 하나로 시작해야 합니다.
끈
유효성 검사 중인 필드는 문자열이어야 합니다. 필드가 null가 되도록 허용하려면 해당 필드에 nullable 규칙을 할당해야 합니다.
편의를 위해 문자열 유효성 검사 규칙은 fluently 연결 가능한 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 메서드를 사용해 제약 조건을 조건부로 적용할 수도 있습니다.
시간대
유효성 검사 중인 필드는 DateTimeZone::listIdentifiers 방법에 따라 유효한 시간대 식별자여야 합니다.
DateTimeZone::listIdentifiers 메서드에서 허용되는 인수도 이 유효성 검사 규칙에 제공될 수 있습니다.
'timezone' => 'required|timezone:all';
'timezone' => 'required|timezone:Africa';
'timezone' => 'required|timezone:per_country,US';
고유:table,column
유효성 검사 중인 필드는 지정된 데이터베이스 테이블 내에 존재하지 않아야 합니다.
사용자 지정 테이블/열 이름 지정:
테이블 이름을 직접 지정하는 대신 테이블 이름을 결정하는 데 사용해야 하는 Eloquent 모델을 지정할 수 있습니다.
'email' => 'unique:App\Models\User,email_address'
column 옵션은 필드의 해당 데이터베이스 열을 지정하는 데 사용될 수 있습니다. column 옵션을 지정하지 않으면 유효성 검사 중인 필드 이름이 사용됩니다.
'email' => 'unique:users,email_address'
사용자 지정 데이터베이스 연결 지정
경우에 따라 유효성 검사기가 만든 데이터베이스 쿼리에 대한 사용자 지정 연결을 설정해야 할 수도 있습니다. 이를 수행하려면 테이블 이름 앞에 연결 이름을 추가하면 됩니다.
'email' => 'unique:connection.users,email_address'
주어진 ID를 무시하도록 고유 규칙을 강제 적용:
때로는 고유한 유효성 검사 중에 특정 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메서드에 전달하면 안 됩니다. 대신 자동 증가 ID 또는 Eloquent 모델 인스턴스의 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))
고유 검사에서 소프트 삭제된 레코드 무시:
기본적으로 고유 규칙에는 고유성을 결정할 때 일시 삭제된 레코드가 포함됩니다. 고유성 확인에서 일시 삭제된 레코드를 제외하려면 withoutTrashed 메소드를 호출하면 됩니다.
Rule::unique('users')->withoutTrashed();
모델이 일시 삭제된 레코드에 대해 deleted_at 이외의 열 이름을 사용하는 경우 withoutTrashed 메서드를 호출할 때 열 이름을 제공할 수 있습니다.
Rule::unique('users')->withoutTrashed('was_deleted_at');
대문자
유효성 검사 중인 필드는 대문자여야 합니다.
URL
검증 중인 필드는 유효한 URL여야 합니다.
유효한 것으로 간주되어야 하는 URL 프로토콜을 지정하려면 해당 프로토콜을 유효성 검사 규칙 매개변수로 전달할 수 있습니다.
'url' => 'url:http,https',
'game' => 'url:minecraft,steam',
울리드
검증 중인 필드는 유효한 Universally Unique Lexicographically Sortable Identifier(ULID)여야 합니다.
uuid
유효성 검사 중인 필드는 유효한 RFC 9562(버전 1, 3, 4, 5, 6, 7 또는 8) 범용 고유 식별자(UUID)여야 합니다.
또한 지정된 UUID가 버전별로 UUID 사양과 일치하는지 확인할 수도 있습니다.
'uuid' => 'uuid:4'
조건부로 규칙 추가 (Conditionally Adding Rules)
필드에 특정 값이 있을 때 유효성 검사 건너뛰기
다른 필드에 특정 값이 있는 경우 특정 필드의 유효성을 검사하지 않으려는 경우가 종종 있습니다. 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' => '[email protected]',
],
[
'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의 인스턴스입니다. 그렇지 않으면 문자열입니다.
배열 유효성 검증 (Validating Arrays)
배열 유효성 검사 규칙 문서에서 설명한 대로 array 규칙은 허용되는 배열 키 목록을 허용합니다. 배열 내에 추가 키가 있으면 유효성 검사가 실패합니다.
use Illuminate\Support\Facades\Validator;
$input = [
'user' => [
'name' => 'Taylor Otwell',
'username' => 'taylorotwell',
'admin' => true,
],
];
Validator::make($input, [
'user' => 'array:name,username',
]);
일반적으로 배열 내에 존재할 수 있는 배열 키를 항상 지정해야 합니다. 그렇지 않으면 유효성 검사기의 validate 및 validated 메서드는 해당 키가 다른 중첩 배열 유효성 검사 규칙에 의해 유효성이 검사되지 않은 경우에도 배열과 해당 키를 모두 포함하여 유효성이 검사된 모든 데이터를 반환합니다.
중첩 배열 입력 검증
중첩된 배열 기반 양식 입력 필드의 유효성을 검사하는 것이 어려울 필요는 없습니다. 배열 내의 속성을 확인하기 위해 "점 표기법"을 사용할 수 있습니다. 예를 들어 들어오는 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.',
]);
위의 예에서 유효성 검사는 실패하고 사용자에게 _"사진 #2에 대해 설명해주세요."_라는 오류가 표시됩니다.
필요한 경우 second-index, second-position, third-index, third-position 등을 통해 더 깊게 중첩된 인덱스와 위치를 참조할 수 있습니다.
'photos.*.attributes.*.string' => 'Invalid attribute for photo #:second-position.',
파일 유효성 검증 (Validating Files)
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)인지 확인할 수 있습니다.
또한 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] 이미지 크기 검증에 대한 자세한 내용은 차원 규칙 문서에서 확인할 수 있습니다.
[!WARNING] 기본적으로
image규칙은 XSS 취약점 가능성으로 인해 SVG 파일을 허용하지 않습니다. SVG 파일을 허용해야 하는 경우allowSvg: true를image규칙(File::image(allowSvg: true))에 전달할 수 있습니다.
이미지 크기 검증
이미지의 크기를 확인할 수도 있습니다. 예를 들어 업로드된 이미지의 너비가 최소 1000픽셀, 높이가 500픽셀인지 확인하려면 dimensions 규칙을 사용할 수 있습니다.
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\File;
File::image()->dimensions(
Rule::dimensions()
->maxWidth(1000)
->maxHeight(500)
)
[!NOTE] 이미지 크기 검증에 대한 자세한 내용은 차원 규칙 문서에서 확인할 수 있습니다.
비밀번호 유효성 검증 (Validating Passwords)
비밀번호의 복잡성을 적절한 수준으로 유지하려면 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 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-익명성 모델을 사용하여 사용자의 개인 정보 보호나 보안을 희생하지 않고 haveibeenpwned.com 서비스를 통해 비밀번호가 유출되었는지 확인합니다.
기본적으로 데이터 유출 시 비밀번호가 한 번 이상 나타나면 손상된 것으로 간주됩니다. uncompromised 메소드의 첫 번째 인수를 사용하여 이 임계값을 사용자 지정할 수 있습니다.
// Ensure the password appears less than 3 times in the same data leak...
Password::min(8)->uncompromised(3);
물론 위 예제의 모든 메서드를 연결할 수도 있습니다.
Password::min(8)
->letters()
->mixedCase()
->numbers()
->symbols()
->uncompromised()
기본 비밀번호 규칙 정의
애플리케이션의 단일 위치에서 비밀번호에 대한 기본 유효성 검사 규칙을 지정하는 것이 편리할 수 있습니다. 클로저를 허용하는 Password::defaults 메서드를 사용하면 이 작업을 쉽게 수행할 수 있습니다. defaults 메소드에 제공된 클로저는 비밀번호 규칙의 기본 구성을 반환해야 합니다. 일반적으로 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]);
// ...
});
사용자 지정 검증 규칙 (Custom Validation Rules)
규칙 객체 사용
Laravel는 다양하고 유용한 유효성 검사 규칙을 제공합니다. 그러나 사용자가 직접 지정할 수도 있습니다. 사용자 지정 유효성 검사 규칙을 등록하는 한 가지 방법은 규칙 개체를 사용하는 것입니다. 새로운 규칙 객체를 생성하려면 make:rule Artisan 명령을 사용할 수 있습니다. 이 명령을 사용하여 문자열이 대문자인지 확인하는 규칙을 생성해 보겠습니다. Laravel는 app/Rules 디렉터리에 새 규칙을 배치합니다. 이 디렉터리가 없으면 Artisan 명령을 실행하여 규칙을 생성할 때 Laravel가 디렉터리를 생성합니다.
php artisan make:rule Uppercase
규칙이 생성되면 해당 동작을 정의할 준비가 된 것입니다. 규칙 객체에는 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.');
}
}
}
규칙이 정의되면 다른 유효성 검사 규칙과 함께 규칙 개체의 인스턴스를 전달하여 유효성 검사기에 연결할 수 있습니다.
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;
}
}
클로저 사용
애플리케이션 전체에서 사용자 지정 규칙의 기능이 한 번만 필요한 경우 규칙 객체 대신 클로저를 사용할 수 있습니다. 클로저는 속성의 이름, 속성의 값, 유효성 검사가 실패할 경우 호출해야 하는 $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
속성이 비어 있는 경우에도 사용자 지정 규칙을 실행하려면 규칙에서 해당 속성이 필요하다는 것을 암시해야 합니다. 새로운 암시적 규칙 객체를 빠르게 생성하려면 make:rule Artisan 명령을 --implicit 옵션과 함께 사용할 수 있습니다.
php artisan make:rule Uppercase --implicit
[!WARNING] "암시적" 규칙은 해당 속성이 필요하다는 것을 _암시_합니다. 누락되거나 비어 있는 속성을 실제로 무효화할지 여부는 귀하에게 달려 있습니다.