首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
7.1 调用小部件的两种方式
7.1.1 调用widget()方法使用小部件DatePicker
7.1.2 调用begin()和end()方法使用小部件ActiveForm
7.2 项目实现迭代八:使用ActiveForm小部件替换添加文章视图
7.2.1 调用小部件ActiveForm
7.2.2 “文章标题”文本输入框
7.2.3 “文章栏目”下拉列表框
7.2.4 “文章图片”上传文件输入框
7.2.5 “内容”文本输入域
7.3 自定义小部件
7.3.1 继承Widget
7.3.2 自定义小部件的MVC结构
7.4 项目实现迭代九:自定义首页幻灯片小部件
7.5 项目实现迭代十:分页显示列表页
7.5.1 分页组件Pagination
7.5.2 新闻中心列表页实现数据填充
7.5.3 分页的超链接列表小部件LinkPager
8.1 初识资源包类
8.2 Yii2框架资源管理代码分析
8.2.1 视图中注册资源包类
8.2.2 注册资源文件
8.2.3 输出缓冲区的数据
8.3 AssetBundle类的成员属性
8.4 项目实现迭代十一:本书配套项目实现前端资源管理
8.4.1 实现首页前端资源管理
8.4.2 实现新闻中心列表页前端资源管理
9.1 模型中编写验证规则
9.2 控制器中安全赋值
9.3 控制器中触发验证
9.4 视图中提取错误信息
9.5 项目实现迭代十二:完成“添加文章”页面中的模型验证
10.1 AJAX简介
10.2 传统的JavaScript实现AJAX验证
10.2.1 创建AJAX引擎XMLHttpRequest对象
10.2.2 创建HTTP请求
10.2.3 设置响应HTTP请求状态变化的方法
10.2.4 设置获取服务器返回数据的语句
10.2.5 发送HTTP请求
10.3 jQuery实现AJAX验证
10.4 项目实现迭代十三:完成“添加用户”页面的AJAX验证
11.1 用户登录-表单模型
11.2 用户登录-客户端验证
11.2.1 ActiveForm实现客户端验证代码分析
11.2.2 项目实现迭代十四:完成登录页面的客户端验证
11.3 模型中的自定义方法作为rules()验证器
11.4 用于验证用户名和密码的身份类UserIdentity
11.5 项目实现迭代十五:完成用户登录
11.6 保存用户登录状态的yii\web\User类
12.1 访问控制技术综述
12.2 RBAC简介
12.3 RBAC需求分析及功能概述
12.4 项目实现迭代十六:最简方式实现RBAC
12.4.1 数据库设计
12.4.2 用户管理
12.4.3 角色管理
12.4.4 权限管理
12.4.5 用户—角色配置管理
12.4.6 角色—权限配置管理
12.5 项目实现迭代十七:使用yii\rbac\DbManager实现 RBAC
12.5.1 基本概念
12.5.2 用户管理
12.5.3 角色管理
12.5.4 权限管理
12.5.5 权限管理系统验证
12.6 项目实现迭代十八:使用yii2-admin扩展实现RBAC
12.6.1 配置
12.6.2 使用的数据库表
12.6.3 路由列表
12.6.4 角色列表
12.6.5 用户列表
12.6.6 菜单列表
12.6.7 集成AdminLTE后台主题及菜单展示
12.6.8 基于存取控制过滤器(ACF)的用户登录页面
当前位置:
首页>>
技术小册>>
Yii2框架从入门到精通(中)
小册名称:Yii2框架从入门到精通(中)
### 第9章 数据模型与验证 #### 9.1 模型中编写验证规则 在Yii2框架中,模型(Model)不仅仅是数据的容器,它还负责数据的验证与业务逻辑的处理。验证规则是模型层中一个至关重要的部分,它们确保了数据的完整性和正确性,在数据被保存到数据库之前进行了严格的检查。本章节将深入探讨如何在Yii2的模型中编写验证规则,以实现高效且灵活的数据验证机制。 ##### 9.1.1 理解验证规则 在Yii2中,验证规则通过`rules()`方法定义在模型中。这个方法返回一个数组,数组中的每个元素都定义了一个验证规则,用于检查模型的一个或多个属性。验证规则可以基于多种条件,如长度限制、数据类型、正则表达式匹配等,甚至可以通过自定义验证器实现更复杂的验证逻辑。 ##### 9.1.2 基本验证规则 Yii2提供了多种内置的验证器,可以直接在`rules()`方法中使用,以下是一些常用的基本验证规则示例: - **`['attribute', 'required']`**:确保指定属性不为空。 - **`['attribute', 'string', 'max' => 255]`**:验证属性为字符串,且最大长度为255。 - **`['attribute', 'integer']`**:验证属性为整数。 - **`['attribute', 'email']`**:验证属性是否为有效的电子邮件地址。 - **`['attribute', 'url']`**:验证属性是否为有效的URL。 - **`['attribute', 'compare', 'compareAttribute' => 'otherAttribute']`**:比较当前属性与模型中的另一个属性是否相等。 ##### 9.1.3 自定义验证规则 除了内置验证器外,Yii2还允许你通过定义匿名函数或使用独立的验证器类来创建自定义验证规则。 - **匿名函数验证**: 在`rules()`方法中使用匿名函数可以灵活地实现复杂的验证逻辑。例如,验证密码长度并在特定条件下验证密码强度: ```php public function rules() { return [ // ... 其他验证规则 ['password', 'string', 'min' => 6], ['password', function ($attribute, $params) { if (!preg_match('/[a-z].*[A-Z].*[\d].*[\W]/', $this->$attribute)) { $this->addError($attribute, 'Password must contain at least one lowercase letter, one uppercase letter, one digit, and one special character.'); } }], ]; } ``` - **独立验证器类**: 对于复杂的验证逻辑,建议创建独立的验证器类。这不仅可以使你的模型代码更加清晰,还便于重用验证规则。例如,创建一个`PasswordValidator`类来验证密码的复杂性: ```php namespace app\components; use yii\validators\Validator; class PasswordValidator extends Validator { public function validateAttribute($model, $attribute) { $value = $model->$attribute; if (!preg_match('/[a-z].*[A-Z].*[\d].*[\W]/', $value)) { $this->addError($model, $attribute, 'Password must contain at least one lowercase letter, one uppercase letter, one digit, and one special character.'); } } } ``` 然后在模型中引用这个验证器: ```php public function rules() { return [ // ... 其他验证规则 ['password', PasswordValidator::class], ]; } ``` ##### 9.1.4 场景与验证规则 Yii2的模型支持场景(Scenario)的概念,允许你在不同的场景下应用不同的验证规则。例如,在创建用户时可能需要验证用户名和密码,但在更新用户信息时可能不需要再次验证密码(除非密码字段被修改)。 你可以通过重写模型的`scenarios()`方法来定义场景及其对应的验证规则集: ```php public function scenarios() { return [ 'create' => ['username', 'email', 'password', 'status'], 'update' => ['username', 'email', 'status', 'password' => self::SCENARIO_OPTIONAL], 'default' => ['username', 'email'], ]; } public function rules() { return [ [['username', 'email'], 'required'], ['email', 'email'], ['password', 'string', 'min' => 6], // 其他规则... ]; } ``` 在上面的例子中,`'password' => self::SCENARIO_OPTIONAL`表示在`update`场景下,`password`属性是可选的,不会强制要求验证。 ##### 9.1.5 验证数据的流程 在Yii2中,验证数据的典型流程如下: 1. **收集用户输入**:通过表单或其他方式收集用户数据。 2. **加载数据到模型**:使用`load()`方法将用户输入的数据加载到模型的相应属性中。 3. **触发验证**:调用模型的`validate()`方法来触发验证过程。该方法会根据当前场景和`rules()`方法定义的规则进行验证。 4. **处理验证结果**:通过检查模型的`hasErrors()`方法来判断验证是否通过,如果有错误,则可以通过`getErrors()`方法获取错误信息,并反馈给用户。 ##### 9.1.6 实战应用 假设你正在开发一个用户注册系统,用户需要填写用户名、邮箱和密码等信息。以下是一个简单的模型示例,展示了如何结合场景和验证规则来实现用户注册信息的验证: ```php namespace app\models; use Yii; use yii\base\Model; class SignupForm extends Model { public $username; public $email; public $password; public function rules() { return [ [['username', 'email', 'password'], 'required'], ['username', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This username has already been taken.'], ['email', 'email'], ['password', 'string', 'min' => 6], ]; } public function scenarios() { return [ 'default' => ['username', 'email', 'password'], ]; } // 可能还有其他方法,如signup()用于处理注册逻辑 } ``` 在这个例子中,`SignupForm`模型定义了注册所需的基本信息,并在`rules()`方法中指定了相应的验证规则。同时,通过`scenarios()`方法确保了验证规则适用于默认的注册场景。 总结而言,Yii2框架提供了强大而灵活的数据验证机制,通过内置验证器、自定义验证规则以及场景的支持,可以轻松实现复杂的数据验证逻辑,确保数据的准确性和安全性。
上一篇:
8.4.2 实现新闻中心列表页前端资源管理
下一篇:
9.2 控制器中安全赋值
该分类下的相关小册推荐:
剑指PHP(从入门到进阶)
PHP高并发秒杀入门与实战
Workerman高性能Web框架-Webman
Laravel(10.x)从入门到精通(十二)
全栈工程师修炼指南
PHP合辑3-数组函数
Laravel(10.x)从入门到精通(六)
Magento零基础到架构师(系统管理)
Laravel(10.x)从入门到精通(四)
Laravel(10.x)从入门到精通(二)
Laravel(10.x)从入门到精通(九)
经典设计模式PHP版