최신판 |
당신의 편집 |
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번째 줄: |
|
| |
|
| ===언어 파일에서 값 지정=== | | ===언어 파일에서 값 지정=== |
|
| |
| ==사용가능한 유효성 검증 규칙== | | ==사용가능한 유효성 검증 규칙== |
| ==조건부 규칙 추가== | | ==조건부 규칙 추가== |