首页
技术小册
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框架从入门到精通(中)
### 11.3 模型中的自定义方法作为`rules()`验证器 在Yii2框架中,模型(Model)是MVC(Model-View-Controller)架构中的核心组件之一,它负责数据的表示和业务逻辑的处理。Yii2通过其强大的验证机制,使得数据验证变得既灵活又高效。`rules()`方法是模型类中用于定义验证规则的关键方法,它返回一个包含验证规则的数组。然而,Yii2的验证系统不仅限于预定义的验证器,还允许开发者通过自定义方法来实现更复杂的验证逻辑。 #### 11.3.1 理解`rules()`方法 在Yii2中,每个模型类都可以包含一个`rules()`方法,该方法返回一个数组,数组中的每个元素都是一个规则定义,用于指定模型属性的验证逻辑。规则定义通常包含三个元素:属性名、验证器类名或验证器配置数组、以及验证器参数(可选)。例如: ```php public function rules() { return [ [['username', 'email'], 'required'], ['email', 'email'], // 更多规则... ]; } ``` 上述例子中,`username`和`email`字段被标记为必填项,而`email`字段还使用了内置的`email`验证器来确保其值符合电子邮件的格式。 #### 11.3.2 自定义验证方法的必要性 尽管Yii2提供了丰富的内置验证器,但在实际应用中,我们经常会遇到需要执行复杂验证逻辑的场景,这些场景可能无法通过简单的内置验证器组合来实现。例如,你可能需要验证一个用户名的唯一性,或者检查一个密码是否符合特定的复杂度要求。在这些情况下,自定义验证方法就显得尤为重要。 #### 11.3.3 实现自定义验证方法 要在模型中实现自定义验证方法,你需要遵循以下步骤: 1. **定义自定义验证方法**:在模型类中定义一个或多个以`validate`开头,后跟属性名(可选)和自定义名称的公共方法。例如,`validateUsername`或`validatePasswordComplexity`。 2. **在`rules()`方法中引用自定义验证方法**:通过指定验证器为模型类名(使用`self::class`)和自定义验证方法名的字符串,来在`rules()`方法中引用自定义验证方法。 3. **编写验证逻辑**:在自定义验证方法中,你可以使用Yii2的验证框架提供的工具(如`$this->addError()`方法)来添加错误消息,或者通过返回布尔值来指示验证是否通过。 #### 示例:验证用户名的唯一性 假设我们有一个`User`模型,需要验证用户名的唯一性。我们可以按照以下步骤来实现: **步骤1:定义自定义验证方法** ```php class User extends \yii\db\ActiveRecord { // ... 其他代码 ... public function validateUsernameUnique($attribute, $params) { if (!$this->hasErrors()) { // 如果之前没有其他错误 $user = self::find()->where(['username' => $this->username])->one(); if ($this->isNewRecord && $user !== null) { $this->addError($attribute, '该用户名已被注册。'); } elseif (!$this->isNewRecord && $user !== null && $user->id !== $this->id) { $this->addError($attribute, '该用户名已被其他用户占用。'); } } } // ... 其他代码 ... } ``` **步骤2:在`rules()`方法中引用自定义验证方法** ```php public function rules() { return [ [['username', 'email'], 'required'], ['email', 'email'], ['username', 'validateUsernameUnique'], // 引用自定义验证方法 // ... 其他规则 ... ]; } ``` 在这个例子中,`validateUsernameUnique`方法会检查数据库中是否已存在具有相同`username`的记录。如果是新记录(`$this->isNewRecord`为`true`),则直接检查用户名是否已被注册;如果不是新记录,则还会检查当前记录的用户名是否被其他用户占用(通过比较ID来区分)。 #### 11.3.4 自定义验证方法的优势 使用自定义验证方法作为`rules()`验证器,具有以下优势: - **灵活性**:可以执行任何复杂的验证逻辑,不受内置验证器限制。 - **可重用性**:自定义验证方法可以在多个模型或不同场景下重复使用。 - **易于维护**:将验证逻辑封装在模型中,有助于保持代码的清晰和可维护性。 #### 11.3.5 注意事项 - **性能考虑**:在自定义验证方法中,应尽量避免执行复杂的数据库查询或耗时的操作,以免影响应用性能。 - **错误处理**:使用`$this->addError()`方法添加错误消息时,应确保消息清晰、准确,有助于用户理解问题所在。 - **测试**:对自定义验证方法进行充分的测试,以确保其在各种情况下都能正确工作。 通过本章的学习,你应该已经掌握了如何在Yii2框架的模型中通过自定义方法来实现复杂的验证逻辑。这将使你的应用更加健壮、灵活,并能够更好地满足实际业务需求。
上一篇:
11.2.2 项目实现迭代十四:完成登录页面的客户端验证
下一篇:
11.4 用于验证用户名和密码的身份类UserIdentity
该分类下的相关小册推荐:
PHP高并发秒杀入门与实战
PHP合辑4-字符串函数
PHP安全之道
剑指PHP(从入门到进阶)
Magento零基础到架构师(产品管理)
PHP程序员面试算法宝典
Magento零基础到架构师(库存管理)
PHP8入门与项目实战(4)
PHP合辑3-数组函数
PHP8入门与项目实战(3)
Swoole入门教程
PHP8入门与项目实战(5)