Yii - 特殊验证

  • 简述

    有时您需要验证未绑定到任何模型的值。您可以使用yii\base\DynamicModel类,它支持动态定义属性和规则。
    第 1 步- 将actionAdHocValidation方法添加到SiteController
    
    public function actionAdHocValidation() {
       $model = DynamicModel::validateData([
          'username' => 'John',
          'email' => 'john@gmail.com'
       ], [
          [['username', 'email'], 'string', 'max' => 12],
          ['email', 'email'],
       ]);
        
       if ($model->hasErrors()) {
          var_dump($model->errors);
       } else {
          echo "success";
       }
    }
    
    在上面的代码中,我们定义了一个带有用户名和电子邮件属性的“动态”模型并对其进行验证。
    第 2 步- 在 Web 浏览器的地址栏中键入http://localhost:8080/index.php?r=site/ad-hoc-validation,您将看到一条错误消息,因为我们的电子邮件长度为 14 个字符。
    十四字长
  • 自定义验证器

    有两种类型的自定义验证器 -
    • 内联验证器
    • 独立验证器
    内联验证器由模型方法或匿名函数定义。如果一个属性验证失败,你应该调用yii\base\Model::addError()方法来保存错误信息。
    下面的RegistrationForm示例验证了 city 属性,因此它只能接受两个值——London 和 Paris。
    
    <?php
       namespace app\models;
       use Yii;
       use yii\base\Model;
       class RegistrationForm extends Model {
          public $username;
          public $password;
          public $email;
          public $country;
          public $city;
          public $phone;
          public function rules() {
             return [
                ['city', 'validateCity']
             ];
          }
          public function validateCity($attribute, $params) {
             if (!in_array($this->$attribute, ['Paris', 'London'])) {
                $this->addError($attribute, 'The city must be either "London" or "Paris".');
             }
          }
       }
    ?>
    
    一个独立的验证器扩展了yii\validators\Validator类。要实现验证逻辑,你应该重写yii\validators\Validator::validateAttribute()方法。
    第 1 步- 要使用独立验证器实现前面的示例,请将CityValidator.php文件添加到组件文件夹。
    
    <?php
       namespace app\components;
       use yii\validators\Validator;
       class CityValidator extends Validator {
          public function validateAttribute($model, $attribute) {
             if (!in_array($model->$attribute, ['Paris', 'London'])) {
                $this->addError($model, $attribute, 'The city must be either "Paris"
                   or "London".');
             }
          }
       }
    ?>
    
    第 2 步 - 然后,以这种方式修改RegistrationForm模型。
    
    <?php
       namespace app\models;
       use app\components\CityValidator;
       use Yii;
       use yii\base\Model;
       class RegistrationForm extends Model {
          public $username;
          public $password;
          public $email;
          public $country;
          public $city;
          public $phone;
          public function rules() {
             return [
                ['city', CityValidator::className()]
             ];
          }
       }
    ?>