Laravel 매개 변수 검증 에 대한 의심 과 의혹
Laravel 문서 에서 검증 기 를 호출 하 는 것 은 컨트롤 러 를 통과 하 는 것 외 에 Facades 방식 으로 검증 기 대상 을 만 드 는 것 이다.Validator::make($data,$rule,$message)。
config/app.php 에'Validator'=>Illuminate\Support\Facades\\Validator::class 가 등록 되 어 있 습 니 다.
<?php
namespace Illuminate\Support\Facades;
/**
* @see \Illuminate\Validation\Factory
*/
class Validator extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'validator';
}
}
위 에서 알 수 있 듯 이 Validator 의 실제 실현 류 는 용기 중의 vaidator 대상 입 니 다.이 vaidator 대상 은 무엇 입 니까?
namespace Illuminate\Foundation;
...
class Application extends Container implements ApplicationContract, HttpKernelInterface
{
...
public function registerCoreContainerAliases()
{
foreach ([
...
'validator'=> [
\Illuminate\Validation\Factory::class,
\Illuminate\Contracts\Validation\Factory::class
],
])
...
}
...
}
이 를 통 해 알 수 있 듯 이 최종 검증 기 는\Illuminate\\Contracts\Validation\Factory 인 터 페 이 스 를 실현 하 는\Illuminate\Validation\Factory 류 를 통 해 만 들 어 졌 다.이 공장 류 가 어떻게 실제 검증 기 를 만 들 었 는 지 다시 한 번 보 자.
//\Illuminate\Contracts\Validation\Factory
protected function resolve(array $data, array $rules, array $messages, array $customAttributes)
{
if (is_null($this->resolver)) {
return new Validator(
$this->translator,
$data,
$rules,
$messages,
$customAttributes
);
}
return call_user_func(
$this->resolver,
$this->translator,
$data,
$rules,
$messages,
$customAttributes
);
}
여기 서 알 수 있 듯 이 Laravel 의 검증 기 는 모두 특정한 공장 류 를 통 해 만들어 진 것 이다.사용자 정의 검증 기 류(예 를 들 어 5.8 의 새로운 기능 을 5.5 버 전 으로 옮 겨 야 합 니 다)가 필요 하 다 면 두 가지 방식 이 있 습 니 다.
하나,사용자 정의 공장 클래스 를 만 듭 니 다.그리고 AppServiceProvider 에서 새로운 검증 기 공장 창설 클래스 를 다시 연결 합 니 다.
둘째,AppServiceProvider 에서 resolver 방법 을 통 해 공장 류 의 resolver 속성 을 설정 하고 검증 기의 실례 화 를 관리한다.예 를 들 어:
Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes){
return new ExtendValidator($translator, $data, $rules, $messages, $customAttributes);
});
인증 규칙 을 사용자 정의 하 는 방법Laravel 자체 가 통용 되 는 매개 변수 검증 규칙 을 많이 제 공 했 지만 특정한 장면 에 대해 서 는 검증 규칙 의 확장 을 제공 해 야 합 니 다.
Laravel 인증 규칙 의 확장 은 두 가지 방식 이 있 습 니 다.
1 extend 방법 으로 확장
// ,Laravel5.8 ,Laravel5.5
// : 'max_num'=>'gte:min',
Validator::extend('gte',function($attribute, $value, $parameters, $validator){
if($value>=data_get($validator->getData(),$parameters[0]))
{
return true;
}
return false;
});
//\Illuminate\Contracts\Validation\Factory
public function extend($rule, $extension, $message = null)
{
$this->extensions[$rule] = $extension;
if ($message) {
$this->fallbackMessages[Str::snake($rule)] = $message;
}
}
//\Illuminate\Validation\Validator
protected function callExtension($rule, $parameters)
{
$callback = $this->extensions[$rule];
if (is_callable($callback)) {
return call_user_func_array($callback, $parameters);
} elseif (is_string($callback)) {
return $this->callClassBasedExtension($callback, $parameters);
}
}
protected function validateAttribute($attribute, $rule)
{
...
$method = "validate{$rule}";
if ($validatable && ! $this->$method($attribute, $value, $parameters, $this)) {
$this->addFailure($attribute, $rule, $parameters);
}
}
public function __call($method, $parameters)
{
$rule = Str::snake(substr($method, 8));
if (isset($this->extensions[$rule])) {
return $this->callExtension($rule, $parameters);
}
throw new BadMethodCallException(sprintf(
'Method %s::%s does not exist.', static::class, $method
));
}
Factory 는 확장 규칙 검증 방법 에 extend 방법 을 제공 합 니 다.모든 확장 규칙 은 최종 적 으로 검증 기 에 전 달 될 것 이다.검증 기 는 파 라 메 터 를 검증 하 는 과정 에서 일치 하 는 검증 규칙 을 찾 으 면 직접 검증 합 니 다.그렇지 않 으 면 마술 방법call 확장 인증 함 수 를 찾 습 니 다.확장 함 수 는 불 값 을 되 돌려 주 고 트 루 로 돌아 가면 검증 이 통과 되 었 음 을 나타 내 며 false 로 돌아 가면 검증 이 실 패 했 음 을 나타 낸다.2 사용자 정의 규칙 클래스 확장
Laravel 에 서 는 Illuminate\Contracts\Validation\Rule 인 터 페 이 스 를 제공 합 니 다.이 인 터 페 이 스 를 실현 한 클래스 만 사용자 정의 인증 규칙 류 라 고 생각 합 니 다.
<?php
namespace Illuminate\Contracts\Validation;
interface Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value);
/**
* Get the validation error message.
*
* @return string
*/
public function message();
}
사용자 정의 규칙 류 가 실현 해 야 할 방법 은 passes 방법 이 있 습 니 다.매개 변수 가 합 법 적 인지 검증 하 는 데 사 용 됩 니 다.message 방법 은 검증 에 실패 한 오류 알림 정 보 를 제공 하 는 데 사 용 됩 니 다.사용자 정의 인증 클래스 를 사용 합 니 다.extend 방법 에 비해 큰 bug 는 사용자 정의 클래스 에서 당기 검증 기 대상 을 가 져 올 수 없습니다.따라서 현재 확 장 된 검증 규칙 에 서 는 검증 이 필요 한 데 이 터 를 가 져 올 수 있 을 뿐 다른 필드 데 이 터 를 가 져 오지 못 해 연합 필드 의 검증 을 할 수 없습니다.위 와 같이 두 필드 의 크기 를 비교 하 는 검증 규칙 은 실 현 될 수 없다.
사용자 정의 검증 규칙 류 를 통 해 위의 두 필드 크기 를 비교 하 는 검증 규칙 을 실현 하려 면 사용자 정의 검증 류 가 필요 합 니 다.vaidate UsingCustomRule 방법 을 수정 하여 당기 검증 기 를 사용자 정의 검증 규칙 인 스 턴 스 대상 에 전송 해 야 합 니 다.
protected function validateUsingCustomRule($attribute, $value, $rule)
{
if(method_exists($rule, 'setValidator'))
{
$rule->setValidator($this);
}
return parent::validateUsingCustomRule($attribute,$value,$rule);
}
어떻게 당기 클래스 방법 을 검증 규칙 검증 함수 로 실현 합 니까?Yii 2 와 같이 기본적으로 모든 대상 이 검증 방법 이 있 기 때문에 당기 류 방법 을 검증 규칙 검증 함수 로 사용 하기 쉽다.
예 를 들 어 하나의 검증 규칙 은 다음 과 같 습 니 다.당기 류 의 vaidate MinNum 으로 매개 변 수 를 검증 하 는 것 을 의미 합 니 다.그러면 이러한 기능 은 어떻게 Laravel 에서 이 루어 집 니까?
['min_num'=>'validateMinNum']
방법 1 사용자 정의 클래스 를 통 해 Laravel 은 ClosureValidationRule 사용자 정의 검증 클래스 를 제공 하여 리 셋 함수 의 검증 을 추가 합 니 다.예컨대
$rule = [
'min'=>new ClosureValidationRule([$this,'checkv'])
];
$data = ['min'=>10];
$v = Validator::make($data,$rule);
방법 2 extend 방식 으로 실현
$rule = [
'min'=>'checkv'
];
Validator::extend('checkv',[$this,'checkv']);
그러나 이런 방식 이 검증 기 에 미 치 는 영향 은 전역 적 이다.사용 을 권장 하지 않 습 니 다.총결산
상기 소스 코드 학습 을 통 해 알 수 있 듯 이 Laravel 검증 기의 설립 은 모두 검증 기 공장 류 로 만 든 것 이다.사용자 정의 검증 기 가 필요 하 다 면 검증 기 공장 류 를 수정 하거나 검증 기 공장 류 의 resolver 속성 인수 검증 기의 실례 화 를 설정 할 수 있다.
검증 규칙 의 확장 은 두 가지 방식 이 있 는데 하 나 는 extend 방식 을 통 해 이 루어 진다.extend 방식 이 검증 기 에 미 친 영향 은 전역 적 이 고 전체 운행 프로 세 스 가 유효 합 니 다.검증 기 자 체 를 얻 을 수 있 기 때문에 여러 필드 관계 에 대한 검증 을 할 수 있 습 니 다.다른 하 나 는 사용자 정의 규칙 류 를 통 해 이 루어 진다.사용자 정의 규칙 은 사용자 정의 규칙 류 만 사용 하 는 인증 에 유효 합 니 다.그러나 사용자 정의 규칙 류 자 체 는 검증 기 자 체 를 직접 가 져 올 수 없고 여러 필드 관계 에 대한 검증 을 할 수 없습니다.실현 이 필요 하 다 면 사용자 정의 검증 기 를 사용 하여 검증 규칙 에 검증 기 를 전송 해 야 한다.
Laravel 자체 가 ClosureValidationRule 의 검증 규칙 을 제공 하여 리 셋 함수 검증 규칙 을 처리 합 니 다.또한 extend 방식 으로 리 셋 함 수 를 검증 할 수 있다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.