>  기사  >  백엔드 개발  >  ThinkPHP5 유효성 검사기의 구체적인 사용

ThinkPHP5 유효성 검사기의 구체적인 사용

不言
不言원래의
2018-05-31 15:34:123082검색

이 기사에서는 특정 참조 가치가 있는 ThinkPHP5 유효성 검사기의 구체적인 사용법을 주로 소개합니다. 필요한 친구들이 참고할 수 있습니다.

서문:

API 개발을 할 때, 클라이언트가 전달한 매개변수를 수락합니다. 이 매개변수는 신뢰할 수 없으며 백엔드 개발자는 이 매개변수를 확인해야 합니다. 이전 개발에서는 tp5 검증자에 대해서만 알고 있었을 뿐 그 목적은 몰랐습니다. 이전 개발 검증은 모델 필드를 기반으로 하는 경우가 많았기 때문입니다. 유효성 검사기는 API 개발에 더 적합합니다. 오늘은 유효성 검사기의 사용에 대해 간략하게 이야기하겠습니다.

1. 유효성 검사기 만들기

  1. 먼저 유효성 검사기를 저장할 폴더가 필요합니다. 모듈 아래에 컨트롤러와 동일한 수준에 폴더를 만들고 이름을 validate

  2. 로 지정합니다. 유효성 검사기를 만듭니다. 클래스를 만들고 tp5의 유효성 검사 클래스를 상속하기만 하면 됩니다.

  3. 하지만 객체지향적 사고에 익숙한 친구들은 모든 검증인이 사용해야 하는 메서드가 필요할 때 tp5의 소스 코드를 수정하지 않는다는 것을 알아야 합니다. 기본 클래스로 클래스를 하나 더 작성하겠습니다. 모든 유효성 검사기는 이 기본 클래스를 상속하고, 이 기본 클래스는 tp5의 유효성 검사 클래스를 상속합니다.
  4. 여기서 이름을 baseValidate

이제 본격적인 유효성 검사기를 만들어 보겠습니다. 예:

namespace app\index\validate;

use think\Validate;

class User extends Validate
{
  protected $rule = [
    'name' => 'require|max:25',
    'email' => 'email',
  ];

}

그런 다음 컨트롤러나 모델에서 인스턴스화한 다음

//虚拟一组数据,实际开发中是接受用户传递的数据
$data = [
  'name'=>'thinkphp',
  'email'=>'thinkphp@qq.com'
];

$validate = Loader::validate('User');

if(!$validate->check($data)){
  dump($validate->getError());
}

을 호출하면 이러한 유효성 검사기 응용 프로그램이 작성됩니다. 단순화할 수 있는 것이 있는지 살펴보겠습니다.

먼저 검증해야 할 데이터는 클라이언트로부터 받은 것입니다. 그런 다음 첫 번째 단계는 데이터를 수락하는 것입니다.

그런 다음 검증에 실패하면 데이터를 검증해야 합니다. 오류 메시지 반환

이 두 단계는 인터페이스가 요청될 때마다 수행됩니다. 그런 다음 이것을 BaseValidate

namespace app\home\validate;
use think\Exception;
use think\Request;
use think\Validate;
class BaseValidate extends Validate
{
  public function goCheck($data='')
  {
    //实例化请求对象
    $requestObj=Request::instance();
    //如果传入为空则获取请求里的参数
    empty($data)&&$data=$requestObj->param();
    if ($this->check($data)) {
      //如果验证通过了
      return true;
    }else{
      //如果验证没通过
      $error=$this->getError();
      //抛出异常
      throw new Exception($error);
    }
  }
}

에 캡슐화하려고 합니다. goCheck 메소드가 캡슐화된 후 누군가가 묻습니다. 확인 규칙은 어디에 있습니까?

  1. 2. 별도의 Validator 작성

  2. 앞서 BaseValidate를 상속받는다고 해서 아직 실제 Validator 작성을 시작하지 않았습니다. 규칙은 이 유효성 검사기로 공식화됩니다. 더 깊은 이해를 위해 다음은 사용자 정의 유효성 검사 규칙을 사용하는 예입니다. 사실, tp가 작성한 검증 규칙은 매우 유용할 것입니다

  3. 가장 일반적으로 사용되는 데이터인 id를 예로 들어보겠습니다. 일반적으로 이 ID는 데이터베이스에 있는 특정 데이터의 ID를 나타냅니다. id 서명되지 않은 자동 증가 기본 키로 설계되었으며 인간 언어로 번역되면 양의 정수입니다. 그러면 고객이 전달한 매개변수가 음수 또는 소수인 경우 검증을 통과할 수 없습니다.


위의 요구 사항을 바탕으로 검증기를 만들어 보겠습니다. IdMustBePositiveInt.php라는 이름의 IdMustBePositiveInt.php라는 검증 폴더의 위치는 이전과 동일합니다

(이름이 좀 길지만 다행히 명확합니다)

우선 기본 검증기를 상속해야 합니다

class IdMustBePositiveInt extends BaseValidate

그런 다음 규칙을 공식화하고 고정 멤버 변수에 값을 할당합니다


  protected $rule = [
  //require是内置规则,而tp5并没有正整数的规则,所以下面这个positiveInt使用自定义的规则
    'id' => 'require|positiveInt'
  ];

그럼 사용자 정의 규칙을 수행하는 방법은 실제로 간단합니다. 보호된 메서드를 정의하세요

//系统会自动传入几个参数 第一个是 要验证的值,第二个是规则,自己可以规定规则内容或者不写,第三个是最初传入的data。其实不只这三个参数,想了解详细的可以看看文档
 protected function positiveInt($value, $rule='', $data)
  {
    if (is_int(($value+0))&&($value+0)>0) {
      return true;
    }else{
      return 'id必须为正整数';
    }
  }


! ! 참고: 여기에서 판단이 실패하면 반환은 거짓이 아니라 오류 메시지입니다.

3. 호출 확인

이전 캡슐화에 따르면 우리가 달성해야 하는 효과는 매개변수를 수락하고 매개변수를 확인하는 것입니다. 이제 인증을 호출하는 방법

여기서 멋진 점은 ID를 예로 들어보겠습니다


 public function test($id)
  {
    //在控制器中直接调用写上这行代码就搞定验证了
    (new IdMustBePositiveInt)->goCheck();
  }


단 한 줄의 코드만으로 인증을 직접 수행할 수 있습니다. ID 유효성 검사기를 인스턴스화할 때 상위 클래스의 goCheck 메서드를 호출합니다.

goCheck 메소드는 매개변수를 허용하고 매개변수를 유효성 검사 객체

의 check 메소드에 전달하면 ID 유효성 검사기의 $rule 및 사용자 정의 규칙에 지정된 필수 규칙과 일치합니다.


모두 통과하면 true를 반환합니다.

둘 중 하나라도 일치하지 않으면 예외가 발생합니다

    这次只举了id为例子,虽然看上去比直接写独立验证麻烦很多,但是大家仔细想想,这个验证规则其实在很多地方都是一样的,比如密码验证规则,用户名验证规则等,当这个项目写完了。你已经完成了很多验证器。其实在下个项目中还可以继续套用的哦

    TP5验证规则使用

    ①静态调用(使用内置的规则验证单个数据,返回值为布尔值)

    // 日期格式验证
    Validate::dateFormat('2016-03-09','Y-m-d'); // true
    // 验证是否有效的日期
    Validate::is('2016-06-03','date'); // true
    // 验证是否有效邮箱地址
    Validate::is('thinkphp@qq.com','email'); // true
    // 验证是否在某个范围
    Validate::in('a',['a','b','c']); // true
    // 验证是否大于某个值
    Validate::gt(10,8); // true
    // 正则验证
    Validate::regex(100,'\d+'); // true

    ②模型验证(在模型中的验证方式)

    $User = new User;
    $result = $User->validate(
      [
        'name' => 'require|max:25',
        'email'  => 'email',
      ],
      [
        'name.require' => '名称必须',
        'name.max'   => '名称最多不能超过25个字符',
        'email'    => '邮箱格式错误',
      ]
    )->save($data);
    if(false === $result){
      // 验证失败 输出错误信息
      dump($User->getError());
    }

    ③控制器验证(控制器中进行验证)

    如果你需要在控制器中进行验证,并且继承了\think\Controller的话,可以调用控制器类提供的validate方法进行验证,如下:

    $result = $this->validate(
      [
        'name' => 'thinkphp',
        'email' => 'thinkphp@qq.com',
      ],
      [
        'name' => 'require|max:25',
        'email'  => 'email',
      ]);
    if(true !== $result){
      // 验证失败 输出错误信息
      dump($result);
    }

    控制器中的验证代码可以简化为:

    $result = $this->validate($data,'User');
    if(true !== $result){
      // 验证失败 输出错误信息
      dump($result);
    }

    如果要使用场景,可以使用:

    $result = $this->validate($data,'User.edit');
    if(true !== $result){
      // 验证失败 输出错误信息
      dump($result);
    }

    在validate方法中还支持做一些前置的操作回调,使用方式如下:

    $result = $this->validate($data,'User.edit',[],[$this,'some']);
    if(true !== $result){
      // 验证失败 输出错误信息
      dump($result);
    }

    好了,本次tp5验证器的介绍了就写到这里了,希望对大家的学习有所帮助。

    相关推荐:

    ThinkPHP5.0框架控制器继承基与自定义类案例详解

    Thinkphp5 前置操作详解

    위 내용은 ThinkPHP5 유효성 검사기의 구체적인 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.