Laravel 유효성 검증 편집하기

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
444번째 줄: 444번째 줄:


{{NOTE}}
{{NOTE}}
<code>authorize</code> 메소드의 시그니처 내에서 필요한 의존성을 타입 힌트로 지정할 수 있습니다. 이 의존성들은 [[Laravel 서비스 컨테이너]]를 통해 자동으로 해결됩니다.
<code>authorize</code> 메서드의 시그니처 내에서 필요한 의존성을 타입 힌트로 지정할 수 있습니다. 이 의존성들은 Laravel 서비스 컨테이너를 통해 자동으로 해결됩니다.
{{/NOTE}}
{{/NOTE}}


===오류 메시지 커스터마이징===
===오류 메시지 커스터마이징===
폼 요청에 사용되는 오류 메시지를 커스터마이징하려면 <code>messages</code> 메소드를 오버라이드하면 됩니다. 이 메소드는 속성 / 규칙 쌍과 해당하는 오류 메시지를 반환하는 배열을 리턴해야 합니다:
<syntaxhighlight lang='php'>
/**
* 정의된 유효성 검증 규칙에 대한 오류 메시지를 가져옵니다.
*
* @return array<string, string>
*/
public function messages(): array
{
    return [
        'title.required' => 'A title is required',
        'body.required' => 'A message is required',
    ];
}
</syntaxhighlight>
;유효성 검증 속성 커스터마이징
Laravel의 많은 기본 유효성 검증 규칙 오류 메시지에는 <code>:attribute</code> 플레이스홀더가 포함되어 있습니다. 유효성 검사 메시지의 <code>:attribute</code> 플레이스홀더를 커스텀 속성 이름으로 교체하려면 <code>attributes</code> 메소드를 오버라이드하여 커스텀 이름을 지정할 수 있습니다. 이 메소드는 속성 / 이름 쌍의 배열을 반환해야 합니다:
<syntaxhighlight lang='php'>
/**
* 유효성 검증 오류에 대한 커스텀 속성을 가져옵니다.
*
* @return array<string, string>
*/
public function attributes(): array
{
    return [
        'email' => 'email address',
    ];
}
</syntaxhighlight>
===유효성 검증 입력 준비===
===유효성 검증 입력 준비===
검증 규칙을 적용하기 전에 요청에서 데이터를 준비하거나 위생처리해야 하는 경우, <code>prepareForValidation</code> 메소드를 사용할 수 있습니다:
<syntaxhighlight lang='php'>
use Illuminate\Support\Str;
/**
* 유효성 검증을 위한 데이터를 준비합니다.
*/
protected function prepareForValidation(): void
{
    $this->merge([
        'slug' => Str::slug($this->slug),
    ]);
}
</syntaxhighlight>
마찬가지로, 검증이 완료된 후 요청 데이터를 정규화해야 하는 경우, <code>passedValidation</code> 메소드를 사용할 수 있습니다:
<syntaxhighlight lang='php'>
/**
* 유효성 검증 시도가 통과된 후 처리를 합니다.
*/
protected function passedValidation(): void
{
    $this->replace(['name' => 'Taylor']);
}
</syntaxhighlight>


==수동 유효성 검증기 생성==
==수동 유효성 검증기 생성==
요청에서 <code>validate</code> 메소드를 사용하지 않으려면, <code>Validator</code> 파사드를 사용하여 수동으로 Validator 인스턴스를 생성할 수 있습니다. 파사드의 <code>make</code> 메소드는 새로운 Validator 인스턴스를 생성합니다:
<syntaxhighlight lang='php'>
<?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');
    }
}
</syntaxhighlight>
<code>make</code> 메소드에 전달되는 첫 번째 인수는 유효성 검증를 할 데이터입니다. 두 번째 인수는 데이터에 적용할 유효성 검증 규칙의 배열입니다.
요청의 유효성 검증 실패 여부를 확인한 후, <code>withErrors</code> 메소드를 사용하여 오류 메시지를 세션에 플래시할 수 있습니다. 이 메소드를 사용할 때, <code>$errors</code> 변수는 리디렉션 후 자동으로 뷰와 공유되어 사용자에게 쉽게 오류 메시지를 표시할 수 있습니다. <code>withErrors</code> 메소드는 validator, <code>MessageBag</code> 또는 PHP <code>array</code>를 인수로 받을 수 있습니다.
;첫 번째 유효성 검증 실패 시 중지하기
<code>stopOnFirstFailure</code> 메소드는 단일 유효성 검증 실패가 발생하면 모든 속성의 유효성 검증을 중지하도록 Validator에 알립니다:
<syntaxhighlight lang='php'>
if ($validator->stopOnFirstFailure()->fails()) {
    // ...
}
</syntaxhighlight>
===자동 리디렉션===
===자동 리디렉션===
HTTP 요청의 <code>validate</code> 메소드가 제공하는 자동 리디렉션 기능을 활용하면서도 수동으로 유효성 검증 인스턴스를 생성하려면, 기존 유효성 검증 인스턴스에서 <code>validate</code> 메소드를 호출할 수 있습니다. 유효성 검증이 실패하면 사용자는 자동으로 리디렉션되거나, XHR 요청의 경우 [[#유효성 검증 오류 응답 형식|JSON 응답이 반환]]됩니다:
<syntaxhighlight lang='php'>
Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
])->validate();
</syntaxhighlight>
유효성 검증이 실패했을 때 에러 메시지를 [[#명명된 오류 백|명명된 오류 백]]에 저장하려면 <code>validateWithBag</code> 메소드를 사용할 수 있습니다:
<syntaxhighlight lang='php'>
Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
])->validateWithBag('post');
</syntaxhighlight>
===명명된 오류 백===
===명명된 오류 백===
한 페이지에 여러 개의 폼이 있는 경우, 유효성 검증 오류를 포함하는 <code>MessageBag</code>의 이름을 지정하여 특정 폼에 대한 오류 메시지를 조회할 수 있습니다. 이를 위해 <code>withErrors</code>에 두 번째 인수로 이름을 전달합니다:
<syntaxhighlight lang='php'>
return redirect('register')->withErrors($validator, 'login');
</syntaxhighlight>
그런 다음 <code>$errors</code> 변수에서 명명된 <code>MessageBag</code> 인스턴스에 접근할 수 있습니다:
<syntaxhighlight lang='php'>
{{ $errors->login->first('email') }}
</syntaxhighlight>
===오류 메시지 커스터마이징===
===오류 메시지 커스터마이징===
필요에 따라, Laravel에서 제공하는 기본 오류 메시지 대신 커스텀 오류 메시지를 사용하도록 유효성 검증기 인스턴스를 설정할 수 있습니다. 커스텀 메시지를 지정하는 방법에는 여러 가지가 있습니다. 먼저, <code>Validator::make</code> 메소드의 세 번째 인자로 커스텀 메시지를 전달할 수 있습니다:
<syntaxhighlight lang='php'>
$validator = Validator::make($input, $rules, $messages = [
    'required' => 'The :attribute field is required.',
]);
</syntaxhighlight>
이 예제에서 <code>:attribute</code> 플레이스홀더는 실제로 검증되는 필드의 이름으로 대체됩니다. 또한, 검증 메시지에서 다른 플레이스홀더도 사용할 수 있습니다. 예를 들어:
<syntaxhighlight lang='php'>
$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',
];
</syntaxhighlight>
;특정 속성에 대한 커스텀 메시지 지정
때때로 특정 속성에 대해서만 커스텀 오류 메시지를 지정하고 싶을 수 있습니다. 이 경우 "점(dot)" 표기법을 사용하여 지정할 수 있습니다. 속성 이름을 먼저 지정하고, 그 다음에 규칙을 지정합니다:
<syntaxhighlight lang='php'>
$messages = [
    'email.required' => 'We need to know your email address!',
];
</syntaxhighlight>
;커스텀 속성 값 지정
Laravel의 많은 기본 오류 메시지에는 <code>:attribute</code> 플레이스홀더가 포함되어 있으며, 이는 검증 중인 필드나 속성의 이름으로 대체됩니다. 특정 필드에 대해 이 플레이스홀더를 대체하는 값을 커스터마이징하려면, <code>Validator::make</code> 메소드의 네 번째 인자로 커스텀 속성 배열을 전달할 수 있습니다:
<syntaxhighlight lang='php'>
$validator = Validator::make($input, $rules, $messages, [
    'email' => 'email address',
]);
</syntaxhighlight>
===추가 유효성 검증 수행===
===추가 유효성 검증 수행===
초기 검증이 완료된 후 추가 검증이 필요할 때가 있습니다. 이를 위해 validator의 <code>after</code> 메소드를 사용할 수 있습니다. <code>after</code> 메소드는 클로저나 호출가능(callable) 배열을 인자로 받아, 검증이 완료된 후 호출됩니다. 주어진 호출가능 객체들은 <code>Illuminate\Validation\Validator</code> 인스턴스를 전달받아, 필요한 경우 추가적인 오류 메시지를 발생시킬 수 있습니다:
<syntaxhighlight lang='php'>
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()) {
    // ...
}
</syntaxhighlight>
언급했듯이, <code>after</code> 메소드는 호출가능 객체의 배열도 받을 수 있습니다. 이는 "검증 후" 로직이 호출가능 클래스에 캡슐화되어 있을 때 특히 유용합니다. 이 클래스들은 <code>__invoke</code> 메소드를 통해 <code>Illuminate\Validation.Validator</code> 인스턴스를 전달받습니다:
<syntaxhighlight lang='php'>
use App\Validation\ValidateShippingTime;
use App\Validation\ValidateUserStatus;
$validator->after([
    new ValidateUserStatus,
    new ValidateShippingTime,
    function ($validator) {
        // ...
    },
]);
</syntaxhighlight>


==유효성 검증된 입력 다루기==
==유효성 검증된 입력 다루기==
폼 요청이나 수동으로 생성한 유효성 검증기 인스턴스를 사용하여 들어오는 요청 데이터를 유효성 검증한 후, 실제로 유효성 검증을 거친 요청 데이터를 조회하고 싶을 수 있습니다. 이는 여러 가지 방법으로 가능합니다. 먼저, 폼 요청이나 유효성 검증기 인스턴스에서 <code>validated</code> 메소드를 호출할 수 있습니다. 이 메소드는 유효성 검증을 거친 데이터를 배열 형태로 반환합니다:
==오류 메시지 다루기==
 
===언어 파일에서 사용자 정의 메시지 지정===
<syntaxhighlight lang='php'>
$validated = $request->validated();
$validated = $validator->validated();
</syntaxhighlight>
 
또는, 폼 요청이나 유효성 검증기 인스턴스에서 <code>safe</code> 메소드를 호출할 수 있습니다. 이 메소드는 <code>Illuminate\Support\ValidatedInput</code> 인스턴스를 반환합니다. 이 객체는 <code>only</code>, <code>except</code>, <code>all</code> 메소드를 노출하여 유효성 검증을 거친 데이터의 일부 또는 전체 배열을 조회할 수 있습니다:
 
<syntaxhighlight lang='php'>
$validated = $request->safe()->only(['name', 'email']);
$validated = $request->safe()->except(['name', 'email']);
$validated = $request->safe()->all();
</syntaxhighlight>
 
또한, <code>Illuminate\Support\ValidatedInput</code> 인스턴스는 배열처럼 반복할 수 있고 접근할 수 있습니다:
 
<syntaxhighlight lang='php'>
// 유효성 검증된 데이터를 반복할 수 있습니다...
foreach ($request->safe() as $key => $value) {
    // ...
}
// 유효성 검증된 데이터에 배열처럼 접근할 수 있습니다...
$validated = $request->safe();
$email = $validated['email'];
</syntaxhighlight>
 
유효성 검증된 데이터에 추가 필드를 추가하고 싶다면 <code>merge</code> 메소드를 호출할 수 있습니다:
 
<syntaxhighlight lang='php'>
$validated = $request->safe()->merge(['name' => 'Taylor Otwell']);
</syntaxhighlight>
 
유효성 검증된 데이터를 콜렉션 인스턴스로 조회하고 싶다면 <code>collect</code> 메소드를 호출할 수 있습니다:
 
<syntaxhighlight lang='php'>
$collection = $request->safe()->collect();
</syntaxhighlight>
 
==오류 메시지 작업하기==
<code>Validator</code> 인스턴스에서 <code>errors</code> 메소드를 호출한 후에는 다양하고 편리한 메소드가 포함된 <code>Illuminate\Support\MessageBag</code> 인스턴스를 받게 됩니다. 모든 뷰에서 자동으로 제공되는 <code>$errors</code> 변수도 <code>MessageBag</code> 클래스의 인스턴스입니다.
 
;필드의 첫 번째 오류 메시지 가져오기
주어진 필드에 대한 첫 번째 오류 메시지를 가져오려면 <code>first</code> 메소드를 사용합니다:
 
<syntaxhighlight lang='php'>
$errors = $validator->errors();
echo $errors->first('email');
</syntaxhighlight>
 
;필드의 모든 오류 메시지 가져오기
주어진 필드에 대한 모든 메시지의 배열을 가져와야 하는 경우, <code>get</code> 메소드를 사용합니다:
 
<syntaxhighlight lang='php'>
foreach ($errors->get('email') as $message) {
    // ...
}
</syntaxhighlight>
 
배열 형식의 폼 필드를 검증하는 경우, <code>*</code> 문자를 사용하여 각 배열 요소에 대한 모든 메시지를 가져올 수 있습니다:
 
<syntaxhighlight lang='php'>
foreach ($errors->get('attachments.*') as $message) {
    // ...
}
</syntaxhighlight>
 
;모든 필드의 모든 오류 메시지 가져오기
모든 필드의 모든 메시지 배열을 가져오려면 <code>all</code> 메소드를 사용합니다:
 
<syntaxhighlight lang='php'>
foreach ($errors->all() as $message) {
    // ...
}
</syntaxhighlight>
 
;필드에 대한 메시지가 존재하는지 확인하기
<code>has</code> 메소드를 사용하여 주어진 필드에 대한 오류 메시지가 존재하는지 확인할 수 있습니다:
 
<syntaxhighlight lang='php'>
if ($errors->has('email')) {
    // ...
}
</syntaxhighlight>
 
===언어 파일에 커스텀 메시지 지정===
Laravel의 내장된 검증 규칙은 각각 애플리케이션의 <code>lang/en/validation.php</code> 파일에 위치한 오류 메시지를 가지고 있습니다. 애플리케이션에 <code>lang</code> 디렉토리가 없을 경우, <code>lang:publish</code> Artisan 명령어를 사용하여 Laravel이 해당 디렉토리를 생성하도록 지시할 수 있습니다.
 
<code>lang/en/validation.php</code> 파일 내에서 각 검증 규칙에 대한 번역 항목을 찾을 수 있습니다. 애플리케이션의 필요에 따라 이러한 메시지를 자유롭게 변경하거나 수정할 수 있습니다.
 
또한, 이 파일을 다른 언어 디렉터리로 복사하여 애플리케이션의 언어에 맞게 메시지를 번역할 수 있습니다. Laravel 현지화에 대해 더 자세히 알고 싶다면, 전체 [[Laravel 현지화|현지화 문서]]를 참조하십시오.
 
{{WARNING}}
기본적으로 Laravel 애플리케이션 스켈레톤에는 <code>lang</code> 디렉토리가 포함되어 있지 않습니다. Laravel의 언어 파일을 커스터마이즈하려면 <code>lang:publish</code> Artisan 명령어를 통해 이를 게시할 수 있습니다.
{{/WARNING}}
 
;특정 속성에 대한 커스텀 메시지
애플리케이션의 검증 언어 파일에서 특정 속성과 규칙 조합에 사용되는 오류 메시지를 사용자 지정할 수 있습니다. 이를 위해 애플리케이션의 <code>lang/xx/validation.php</code> 언어 파일의 <code>custom</code> 배열에 메시지 커스터마이징을 추가하면 됩니다:
 
<syntaxhighlight lang='php'>
'custom' => [
    'email' => [
        'required' => 'We need to know your email address!',
        'max' => 'Your email address is too long!'
    ],
],
</syntaxhighlight>
 
===언어 파일에서 속성 지정===
===언어 파일에서 속성 지정===
Laravel의 많은 기본 오류 메시지에는 <code>:attribute</code> 자리표시자가 포함되어 있으며, 이는 유효성 검증 중인 필드 또는 속성의 이름으로 대체됩니다. 유효성 검증 메시지에서 <code>:attribute</code> 부분을 커스텀 값으로 대체하려면 <code>lang/xx/validation.php</code> 언어 파일의 <code>attributes</code> 배열에 커스텀 속성 이름을 지정할 수 있습니다:
Laravel의 많은 기본 오류 메시지에는 <code>:attribute</code> 자리표시자가 포함되어 있으며, 이는 유효성 검증 중인 필드 또는 속성의 이름으로 대체됩니다. 유효성 검증 메시지에서 <code>:attribute</code> 부분을 커스텀 값으로 대체하려면 <code>lang/xx/validation.php</code> 언어 파일의 <code>attributes</code> 배열에 커스텀 속성 이름을 지정할 수 있습니다:
803번째 줄: 473번째 줄:


===언어 파일에서 값 지정===
===언어 파일에서 값 지정===
==사용가능한 유효성 검증 규칙==
==사용가능한 유효성 검증 규칙==
==조건부 규칙 추가==
==조건부 규칙 추가==

제타위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 제타위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 편집 도움말 (새 창에서 열림)