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 방식 으로 리 셋 함 수 를 검증 할 수 있다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기