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 示例验证了城市属性,因此它只能接受两个值 - 伦敦和巴黎。
<?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 文件添加到 components 文件夹。
<?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()] ]; } } ?>