유효성 검사는 모델이 저장되기 전에 유효성 검사 기준을 충족하는지 확인하는 Laravel Eloquent 모델의 특성입니다. 유효한 것으로 간주되지 않으면 모델이 저장되지 않고 유효성 검사 오류가 표시됩니다.
유효성 검사를 통해 여러 규칙 세트를 허용하고 모델 ID를 unique
유효성 검사 규칙에 삽입하고 실패한 유효성 검사에 대한 예외를 발생시킵니다. 작업 흐름에 딱 맞도록 작고 유연하며 유효한 데이터만 저장할 수 있도록 도와줍니다.
Laravel 4.2+에서 유효성 검사를 사용하려고 하시나요? 문서 및 설치 지침은 0.10.x 분기를 살펴보세요.
Laravel 4.2 버전은 양식 유효성 검사에 더 적합합니다. 사용자 정의 유효성 검사 메시지, 확인 규칙 및 여러 규칙 세트를 지원합니다. Laravel 5.0에는 FormRequest
유효성 검사 기능이 있으므로 유효성 검사는 이제 핵심 데이터를 유효하게 유지하고 양식 유효성 검사를 프레임워크에 맡기도록 설계되었습니다.
Laravel 5.0~5.2에서 유효성 검사를 사용하려고 하시나요? 문서 및 설치 지침은 2.x 분기를 살펴보세요.
Laravel 5.0 - 5.2 버전은 Laravel 프레임워크에서 더 이상 사용되지 않는 ValidationException
계약을 사용했습니다. Laravel 5.3에서는 이제 핵심 유효성 검사 ValidationException
확장합니다. 이는 FormRequest
와 마찬가지로 유효성 검사 오류가 발생할 때 프레임워크가 자동으로 오류와 함께 다시 리디렉션된다는 것을 의미합니다.
계속 읽어보세요. 이 지침은 여러분을 위한 것입니다!
composer.json
파일이 있는 프로젝트 디렉터리로 이동하여 다음을 입력하기만 하면 됩니다.
작곡가에게는 Watson/검증이 필요합니다.
Laravel 4.2+ 설치 지침을 확인하세요. Laravel 5.0 - 5.2 설치 지침을 확인하세요.
먼저 모델에 특성을 추가하고 필요에 따라 유효성 검사 규칙과 메시지를 추가합니다.
WatsonValidatingValidatingTrait 사용; 클래스 Post는 Eloquent를 확장합니다. { ValidatingTrait 사용; protected $rules = [ '제목' => '필수', 'slug' => '필수|고유:게시물,슬러그', '콘텐츠' => '필수' ]; }
BaseModel을 사용하는 경우 특성을 BaseModel
에 추가할 수 있으며 이 특성은 이 특성에서 확장되는 모든 모델에서 작동합니다. 그렇지 않으면 Eloquent
대신 WatsonValidatingValidatingModel
확장하면 됩니다.
참고: 해당 특성을 사용하는 BaseModel
에서 확장되는 모든 모델에 $rules
속성을 설정하거나, 그렇지 않으면 BaseModel
에 대한 $rules
로 빈 배열을 설정해야 합니다. 그렇지 않으면 필연적으로 LogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
이 발생하게 됩니다.
이제 몇 가지 즐거운 기능에 액세스할 수 있습니다.
// 모델이 유효한지 확인합니다.$post->isValid(); // true// 또는 유효하지 않은지 확인합니다.$post->isInvalid(); // false// 모델의 유효성을 확인한 후에는 // 오류가 발생할 수 있습니다.$post->getErrors(); // 오류 메시지백
모델 검증도 정말 간단해졌습니다.
if ( ! $post->save()) {// 죄송합니다.return 리디렉션()->route('posts.create') ->withErrors($post->getErrors()) ->입력(); }return 리디렉션()->route('posts.show', $post->id) ->withSuccess("귀하의 게시물이 성공적으로 저장되었습니다.");
그렇지 않고 모델 유효성을 검사할 때 예외를 사용하려는 경우 saveOrFail()
메서드를 사용할 수 있습니다. 이제 유효하지 않은 모델을 저장하려고 하면 예외가 발생합니다.
$post->saveOrFail();
원하지 않는 경우 예외를 잡을 필요가 없습니다 . Laravel은 ValidationException
을 처리하는 방법을 알고 있으며 양식 입력 및 오류를 자동으로 다시 리디렉션합니다. 그래도 스스로 처리하고 싶다면 할 수 있습니다.
{$post->saveOrFail();을 시도해 보세요. } catch (WatsonValidatingValidationException $e) {$errors = $e->getErrors();return 리디렉션()->route('posts.create') ->오류 발생($errors) ->입력(); }
withErrors($e)
와 같은 withErrors()
메소드에 예외를 전달하면 Laravel이 이를 처리하는 방법을 알게 됩니다.
모델을 사용 중이고 유효성 검사를 우회하는 저장을 수행하려는 경우 그렇게 할 수 있습니다. 이는 특성이 없는 모델에서 save()
호출한 것과 동일한 결과를 반환합니다.
$포스트->forceSave();
saveOrFail()
사용하는 대신 save()
메서드를 사용할 때 기본적으로 예외가 발생하도록 하려면 모델이나 BaseModel
에 다음 속성을 설정하면 됩니다.
/** * 모델이 유효성 검사에 실패할 경우 ValidationException을 발생시켜야 하는지 여부입니다. 설정하지 않으면 기본값은 false입니다. * * @var boolean */protected $throwValidationExceptions = true;
예외 또는 반환 값을 사용하여 일회성 저장을 수행하려면 saveOrFail()
및 saveOrReturn
메서드를 사용할 수 있습니다.
사용자 정의 유효성 검사 오류 메시지를 표시하려면 $validationMessages
속성을 모델에 추가하기만 하면 됩니다.
/** * 유효성 검사기에 전달될 유효성 검사 메시지입니다. * * @var array */protected $validationMessages = ['slug.unique' => "다른 게시물에서 이미 해당 슬러그를 사용하고 있습니다."];
지속형 모델을 업데이트하는 경우 작동하지 않는 슬러그에 unique
규칙을 사용하고 있다는 것을 눈치챘을 것입니다. 운 좋게도 유효성 검사가 이를 처리하고 규칙이 예상대로 작동하도록 모델의 기본 키를 규칙에 추가합니다. 현재 모델을 무시합니다.
모델에 $injectUniqueIdentifier
속성을 설정하여 이 기능을 조정할 수 있습니다.
/** * 모델이 유효성 검사를 시도하기 전에 고유한 유효성 검사 규칙에 식별자를 삽입해야 하는지 * 여부입니다. 이 속성 *이 모델에 설정되지 않은 경우 기본값은 true입니다. * * @var boolean */protected $injectUniqueIdentifier = true;
기본적으로 우리는 Laravel에서 제공하는 unique
규칙을 지원합니다. 우리는 또한 널리 사용되는 felixkiss/uniquewith-validator 규칙을 지원하지만 이를 선택해야 합니다. 유효성 검사 특성을 가져온 후 use WatsonValidatingInjectorsUniqueWithInjector
추가하면 됩니다.
원하는 경우 추가 주입 규칙도 쉽게 지원할 수 있습니다. 어떤 이유로든 단순히 모델의 기본 키를 사용하는 unique_ids
라는 추가 규칙을 지원하고 싶다고 가정해 보겠습니다. 기존 매개변수와 필드 이름을 허용하고 대체 규칙을 반환하는 카멜식 규칙을 추가하기만 하면 됩니다.
/** * 필요한 경우 모델 식별자를 추가하여 Unique_ids 규칙을 준비합니다. * * @param 배열 $parameters * @param 문자열 $field * @return 문자열 */protected 함수 prepareUniqueIdsRule($parameters, $field) {// 모델이 지속된 경우에만 교체를 수행합니다. if ($this->exists) {return 'unique_ids:' . $this->getKey(); }'고유 ID'를 반환합니다. }
이 경우 모델이 저장되었고 기본 키가 10
이면 unique_ids
규칙이 unique_ids:10
으로 대체됩니다.
유효성 검사 프로세스에 영향을 주기 위해 연결할 수 있는 유효성 검사 프로세스 중에 특성에 의해 다양한 이벤트가 발생합니다.
연결하려면 먼저 $observeables
속성을 모델(또는 기본 모델)에 추가해야 합니다. 이를 통해 Eloquent는 귀하의 모델이 이러한 이벤트에 응답할 수 있다는 것을 알 수 있습니다.
/** * 사용자 노출 관찰 가능 이벤트 * * @var array */protected $observables = ['validating', 'validated'];
유효성 검사가 발생하려고 하면 eloquent.validating: ModelName
이벤트가 시작되고 $event
매개변수가 saving
또는 restoring
됩니다. 예를 들어 네임스페이스 모델 AppUser
업데이트하는 경우 이벤트는 eloquent.validating: AppUser
입니다. 이러한 이벤트 중 하나를 수신하고 값을 반환하면 유효성 검사가 완전히 발생하는 것을 방지할 수 있습니다.
Event::listen('eloquent.validating:*', function($model, $event) {// 의사 러시안 룰렛 유효성 검사.if (rand(1, 6) === 1) {return false; } });
유효성 검사가 수행된 후에는 passed
이벤트, failed
이벤트, skipped
이벤트에 대해 연결할 수 있는 다양한 validated
이벤트도 있습니다. 위의 검증 실패 사례의 경우 eloquent.validated: AppUser
이벤트가 발생할 수 있습니다.
현재 Laravel에는 테스트 스위트에서 모델 이벤트가 두 번 이상 실행되는 것을 방지하는 버그가 있습니다(문제 #1181 참조). 이는 모델 테스트를 사용하는 첫 번째 테스트는 통과하지만 모든 후속 테스트는 실패함을 의미합니다. 해당 스레드에는 그동안 테스트를 통과하는 데 사용할 수 있는 몇 가지 임시 솔루션이 나열되어 있습니다.
Laravel은 버그 및 풀 요청 추적을 목적으로 Liferaft로 전환했기 때문에 위에서 언급한 문제가 해결되지 않을 수 있습니다. 이 Gist에는 테스트 사이에 모든 모델의 이벤트를 재설정하여 예상대로 작동하는 방법을 보여주는 TestCase.php
예제가 있습니다.
컨트롤러에서 유효성 검사 모델을 사용하는 방법에는 여러 가지가 있습니다. 그러나 여기에는 Laravel 5의 새로운 FormRequest를 사용하는 한 가지 예가 있습니다. (FormRequest가 없는 다른 컨트롤러 예를 보려면 다음을 확인하세요. 이 패키지의 4.2+ 버전.
이 예에서는 FormRequest가 양식 유효성 검사를 처리하고 모델이 자체 유효성 검사를 처리하도록 허용하여 코드를 깔끔하게 유지합니다. 유효성 검사 예외를 활성화하면 반복적인 컨트롤러 코드(try/catch 블록)를 줄이고 모델 유효성 검사 예외를 전역적으로 처리할 수 있습니다(양식 요청은 모델의 유효성을 유지해야 하므로 모델이 유효하지 않게 되면 예외 이벤트가 됩니다).
<?php 네임스페이스 AppHttpControllers;AppHttpRequestsPostFormRequest 사용;IlluminateRoutingController 사용;클래스 PostsController는 컨트롤러를 확장합니다. {보호된 $post;공개 함수 __construct(Post $post) {$this->포스트 = $post; }// ...공용 함수 저장소(PostFormRequest $request) {// 게시물이 유효하지 않으면 예외가 발생합니다.$post = $this->post->create($request->input());// 게시물이 성공적으로 저장되었습니다.return direct()->route( 'posts.show', $post); } }
그런 다음 app/Exceptions/Handler.php
에서 모델 유효성 검사 예외를 포착하고 필요에 따라 처리할 수 있습니다.
공용 함수 render($request, 예외 $e) {if ($e 인스턴스of WatsonValidatingValidationException) {return back()->withErrors($e)->withInput(); }parent::render($request, $e); }