【PHP】Yii2 使用validate规则验证

发布时间:2023年12月22日

目录

提交验证

声明规则

?特殊验证

?一个特殊验证的示例

内联验证器

一个完整示例

参考文档


提交验证


根据经验,您永远不应该相信从最终用户那里收到的数据,并且应该在很好地使用这些数据之前对其进行验证。

给定一个model模型,用户输入填充后,您可以通过调用yii\base\Model::validate()方法。该方法将返回一个布尔值,指示验证是否成功。否则,您可能会从?yii\base\Model::$errors?获取错误信息。举个例子,

$model = new \app\models\ContactForm();

// 接收到的参数
$model->load(\Yii::$app->request->post());
// 其等效于以下内容
// $model->attributes = \Yii::$app->request->post('ContactForm');

if ($model->validate()) {
    // 所有验证通过
} else {
    // 验证失败:$errors是一个包含错误消息的数组
    $errors = $model->errors;
}

声明规则


public function rules()
{
    return [
        // the name, email, subject and body attributes are required
        [['name', 'email', 'subject', 'body'], 'required'],

        // the email attribute should be a valid email address
        ['email', 'email'],
    ];
}

?特殊验证


?有时候你需要做特殊验证对于未绑定到任何模型的值。

如果您只需要执行一种类型的验证(例如验证电子邮件地址),您可以调用验证()方法,如下所示:

$email = 'test@example.com';
$validator = new yii\validators\EmailValidator();

if ($validator->validate($email, $error)) {
    echo 'Email is valid.';
} else {
    echo $error;
}

?一个特殊验证的示例


<?php
/**
 * @author zhao
 * @copyright Copyright (c) 2018 HNBY Network Technology Co., Ltd.
 * @wx zzoood
 */
namespace api\modules\models;

use Yii;
use yii\base\Exception;
use yii\base\Model;
use yii\base\UserException;

class WeLoginForm extends Model
{
    public $mobile;
    //手机区号
    public $uid;
    public $sms_code;
    public $invite_code;

    public function rules() {
        return [
            [['mobile', 'sms_code', 'invite_code'], 'trim'],
            [['mobile', 'code', 'invite_code'], 'string'],
            ['mobile', 'validateMobile'],
            ['invite_code', 'validateInviteCode', 'skipOnEmpty' => false],
            ['sms_code', 'validateSmsCode'],
        ];
    }

    public function attributeLabels() {
        return [
            'mobile' => '手机号',
            'sms_code' => '短信验证码',
            'invite_code' => '推荐码',
        ];
    }

    public function validateMobile($attribute) {
        if (!$this->hasErrors()) {
            if (!Utils::isMobile($this->mobile, $this->countryCode)) {
                $this->addError($attribute, '手机号格式不对');
            }
        }
    }

    public function validateSmsCode($attribute) {
        if (!$this->hasErrors()) {
            try {
                SmsVerifycode::check($this->biz_id, 'bind', $this->mobile, $this->sms_code);
            } catch (Exception $e) {
                $this->addError($attribute, $e->getMessage());
            }
        }
    }

    public function validateInviteCode($attribute)
    {
        if (!$this->hasErrors()) {
            if ($this->getMobileUser()) {
                // 登录时和绑定已存在的手机号时不验证
                return;
            }
            //锁粉记录存在时不验证
            if (!empty($this->uid)) {
                $user = User::findOne($this->uid);
                if (!empty($user) && !empty($user->wechat_unionid)) {
                    $wxlock = Wxlock::find()->where(['biz_id' => $this->biz_id, 'wechat_unionid' => $user->wechat_unionid])->one();
                    if (!empty($wxlock)) {
                        return;
                    }
                }
            }
            $mustInviteCode = DistributionConfig::get($this->biz_id, 'user-config', 'INVITE_IS_OPEN', 0);
            if ($mustInviteCode) {
                if (!$this->invite_code) {
                    $this->addError($attribute, '请填写邀请码');
                }
            }
        }
    }

}

内联验证器


?内联验证器是根据模型方法或匿名函数定义的。方法/函数的签名是:

use yii\base\Model;

class MyForm extends Model
{
    public $country;
    public $token;

    public function rules()
    {
        return [
            // an inline validator defined as the model method validateCountry()
            ['country', 'validateCountry'],

            // an inline validator defined as an anonymous function
            ['token', function ($attribute, $params, $validator) {
                if (!ctype_alnum($this->$attribute)) {
                    $this->addError($attribute, 'The token must contain letters or digits.');
                }
            }],
        ];
    }

    public function validateCountry($attribute, $params, $validator)
    {
        if (!in_array($this->$attribute, ['USA', 'Indonesia'])) {
            $this->addError($attribute, 'The country must be either "USA" or "Indonesia".');
        }
    }
}

一个完整示例


  • controller
    /**
     * 商品检索
     */
    public function actionProductSearch(){
        $request = Yii::$app->request;
        
        try {
            $model = new DouForm();
            $model->load($request->post(),'');
            if (!$model->validate()) {
                throw new Exception($this->errors($model->errors));
            }

        } catch (Exception $e) {
            return $this->responseJson(1, '', $e->getMessage());
        }
    }
  • Form模型
<?php
/**
 * @author zhao
 * @copyright Copyright (c) 2018 HNBY Network Technology Co., Ltd.
 * @wx zzoood
 */
namespace api\modules\models;
use yii\base\Model;

class DouForm extends Model
{
    public $title;
    public $num;

    public function rules() {
        return [
            ['title', 'required'],
            ['num', 'integer', 'min' => 0, 'max' => 1],
        ];
    }
    public function attributeLabels() {
        return [
            'title' => '标题',
            'num' => '数量',
        ];
    }
}
  • error处理
    // 因errors是一个数组,不能有效的返回给前端错误信息,进行改造
    /**
     * 验证类错误处理
     */
    public function errors($errors){
        foreach ($errors as $error) {
            return $error[0];
        }
        exit();
    }

参考文档


文章来源:https://blog.csdn.net/q8688/article/details/135146551
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。