位置: 编程技术 - 正文

PHP的Yii框架中Model模型的学习教程(php framework框架)

编辑:rootadmin

推荐整理分享PHP的Yii框架中Model模型的学习教程(php framework框架),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php模块化开发框架,php framework框架,php框架yaf,php模板框架,php模板框架,php框架介绍,php框架ci,php yii框架,内容如对您有帮助,希望把文章链接给更多的朋友!

模型是 MVC 模式中的一部分, 是代表业务数据、规则和逻辑的对象。

模型是 CModel 或其子类的实例。模型用于保持数据以及与其相关的业务逻辑。

模型是单独的数据对象。它可以是数据表中的一行,或者一个用户输入的表单。 数据对象的每个字段对应模型中的一个属性。每个属性有一个标签(label), 并且可以通过一系列规则进行验证。

Yii 实现了两种类型的模型:表单模型和 Active Record。二者均继承于相同的基类 CModel。

表单模型是 CFormModel 的实例。表单模型用于保持从用户的输入获取的数据。 这些数据经常被获取,使用,然后丢弃。例如,在一个登录页面中, 我们可以使用表单模型用于表示由最终用户提供的用户名和密码信息。

Active Record (AR) 是一种用于通过面向对象的风格抽象化数据库访问的设计模式。 每个 AR 对象是一个 CActiveRecord 或其子类的实例。代表数据表中的一行。 行中的字段对应 AR 对象中的属性。

可通过继承 yiibaseModel 或它的子类定义模型类,基类yiibaseModel支持许多实用的特性:

属性: 代表可像普通类属性或数组一样被访问的业务数据; 属性标签: 指定属性显示出来的标签; 块赋值: 支持一步给许多属性赋值; 验证规则: 确保输入数据符合所申明的验证规则; 数据导出: 允许模型数据导出为自定义格式的数组。

属性

模型通过 属性 来代表业务数据,每个属性像是模型的公有可访问属性, yiibaseModel::attributes() 指定模型所拥有的属性。

可像访问一个对象属性一样访问模型的属性:

也可像访问数组单元项一样访问属性,这要感谢yiibaseModel支持 ArrayAccess 数组访问 和 ArrayIterator 数组迭代器:

定义属性

默认情况下你的模型类直接从yiibaseModel继承,所有 non-static public非静态公有 成员变量都是属性。 例如,下述ContactForm模型类有四个属性name, email, subject and body, ContactForm 模型用来代表从HTML表单获取的输入数据。

另一种方式是可覆盖 yiibaseModel::attributes() 来定义属性,该方法返回模型的属性名。 例如 yiidbActiveRecord 返回对应数据表列名作为它的属性名, 注意可能需要覆盖魔术方法如__get(), __set()使属性像普通对象属性被访问。

属性标签

当属性显示或获取输入时,经常要显示属性相关标签,例如假定一个属性名为firstName, 在某些地方如表单输入或错误信息处,你可能想显示对终端用户来说更友好的 First Name 标签。

可以调用 yiibaseModel::getAttributeLabel() 获取属性的标签,例如:

默认情况下,属性标签通过yiibaseModel::generateAttributeLabel()方法自动从属性名生成. 它会自动将驼峰式大小写变量名转换为多个首字母大写的单词,例如 username 转换为 Username, firstName 转换为 First Name。

如果你不想用自动生成的标签,可以覆盖 yiibaseModel::attributeLabels() 方法明确指定属性标签,例如:

应用支持多语言的情况下,可翻译属性标签, 可在 yiibaseModel::attributeLabels() 方法中定义,如下所示:

甚至可以根据条件定义标签,例如通过使用模型的 scenario场景, 可对相同的属性返回不同的标签。

补充:属性标签是 视图一部分,但是在模型中申明标签通常非常方便,并可行程非常简洁可重用代码。场景

模型可能在多个 场景 下使用,例如 User 模块可能会在收集用户登录输入,也可能会在用户注册时使用。 在不同的场景下,模型可能会使用不同的业务规则和逻辑,例如 email 属性在注册时强制要求有,但在登陆时不需要。

模型使用 yiibaseModel::scenario 属性保持使用场景的跟踪, 默认情况下,模型支持一个名为 default 的场景,如下展示两种设置场景的方法:

默认情况下,模型支持的场景由模型中申明的 验证规则 来决定, 但你可以通过覆盖yiibaseModel::scenarios()方法来自定义行为,如下所示:

补充:在上述和下述的例子中,模型类都是继承yiidbActiveRecord, 因为多场景的使用通常发生在Active Record 类中.scenarios() 方法返回一个数组,数组的键为场景名,值为对应的 active attributes活动属性。 活动属性可被 块赋值 并遵循验证规则在上述例子中,username 和 password 在login场景中启用,在 register 场景中, 除了 username and password 外 email也被启用。

scenarios() 方法默认实现会返回所有yiibaseModel::rules()方法申明的验证规则中的场景, 当覆盖scenarios()时,如果你想在默认场景外使用新场景,可以编写类似如下代码:

场景特性主要在验证 和 属性块赋值 中使用。 你也可以用于其他目的,例如可基于不同的场景定义不同的 属性标签。

验证规则

PHP的Yii框架中Model模型的学习教程(php framework框架)

当模型接收到终端用户输入的数据,数据应当满足某种规则(称为 验证规则, 也称为 业务规则)。 例如假定ContactForm模型,你可能想确保所有属性不为空且 email 属性包含一个有效的邮箱地址, 如果某个属性的值不满足对应的业务规则,相应的错误信息应显示,以帮助用户修正错误。

可调用 yiibaseModel::validate() 来验证接收到的数据, 该方法使用yiibaseModel::rules()申明的验证规则来验证每个相关属性, 如果没有找到错误,会返回 true,否则它会将错误保存在 yiibaseModel::errors 属性中并返回false,例如:

通过覆盖 yiibaseModel::rules() 方法指定模型属性应该满足的规则来申明模型相关验证规则。 下述例子显示ContactForm模型申明的验证规则:

一条规则可用来验证一个或多个属性,一个属性可对应一条或多条规则。 更多关于如何申明验证规则的详情请参考 验证输入 一节.

有时你想一条规则只在某个 场景 下应用,为此你可以指定规则的 on 属性,如下所示:

如果没有指定 on 属性,规则会在所有场景下应用, 在当前yiibaseModel::scenario 下应用的规则称之为 active rule活动规则。

一个属性只会属于scenarios()中定义的活动属性且在rules()申明对应一条或多条活动规则的情况下被验证。

块赋值

块赋值只用一行代码将用户所有输入填充到一个模型,非常方便, 它直接将输入数据对应填充到 yiibaseModel::attributes 属性。 以下两段代码效果是相同的,都是将终端用户输入的表单数据赋值到 ContactForm 模型的属性, 明显地前一段块赋值的代码比后一段代码简洁且不易出错。

安全属性

块赋值只应用在模型当前yiibaseModel::scenario场景yiibaseModel::scenarios()方法 列出的称之为 安全属性 的属性上,例如,如果User模型申明以下场景, 当当前场景为login时候,只有username and password 可被块赋值,其他属性不会被赋值。

补充: 块赋值只应用在安全属性上,因为你想控制哪些属性会被终端用户输入数据所修改, 例如,如果 User 模型有一个permission属性对应用户的权限, 你可能只想让这个属性在后台界面被管理员修改。由于默认yiibaseModel::scenarios()的实现会返回yiibaseModel::rules()所有属性和数据, 如果不覆盖这个方法,表示所有只要出现在活动验证规则中的属性都是安全的。

为此,提供一个特别的别名为 safe 的验证器来申明哪些属性是安全的不需要被验证, 如下示例的规则申明 title 和 description都为安全属性。

非安全属性

如上所述,yiibaseModel::scenarios() 方法提供两个用处:定义哪些属性应被验证,定义哪些属性安全。 在某些情况下,你可能想验证一个属性但不想让他是安全的,可在scenarios()方法中属性名加一个惊叹号 !。 例如像如下的secret属性。

当模型在 login 场景下,三个属性都会被验证,但只有 username和 password 属性会被块赋值, 要对secret属性赋值,必须像如下例子明确对它赋值。

数据导出

模型通常要导出成不同格式,例如,你可能想将模型的一个集合转成JSON或Excel格式, 导出过程可分解为两个步骤,第一步,模型转换成数组;第二步,数组转换成所需要的格式。 你只需要关注第一步,因为第二步可被通用的数据转换器如yiiwebJsonResponseFormatter来完成。

将模型转换为数组最简单的方式是使用 yiibaseModel::attributes 属性,例如:

yiibaseModel::attributes 属性会返回 所有 yiibaseModel::attributes() 申明的属性的值。

更灵活和强大的将模型转换为数组的方式是使用 yiibaseModel::toArray() 方法, 它的行为默认和 yiibaseModel::attributes 相同, 但是它允许你选择哪些称之为字段的数据项放入到结果数组中并同时被格式化。 实际上,它是导出模型到 RESTful 网页服务开发的默认方法,详情请参阅响应格式.

字段

字段是模型通过调用yiibaseModel::toArray()生成的数组的单元名。

默认情况下,字段名对应属性名,但是你可以通过覆盖 yiibaseModel::fields() 和/或 yiibaseModel::extraFields() 方法来改变这种行为, 两个方法都返回一个字段定义列表,fields() 方法定义的字段是默认字段,表示toArray()方法默认会返回这些字段。extraFields()方法定义额外可用字段,通过toArray()方法指定$expand参数来返回这些额外可用字段。 例如如下代码会返回fields()方法定义的所有字段和extraFields()方法定义的prettyName and fullAddress字段。

$array = $model->toArray([], ['prettyName', 'fullAddress']);可通过覆盖 fields() 来增加、删除、重命名和重定义字段,fields() 方法返回值应为数组, 数组的键为字段名,数组的值为对应的可为属性名或匿名函数返回的字段定义对应的值。 特使情况下,如果字段名和属性定义名相同,可以省略数组键,例如:

警告:由于模型的所有属性会被包含在导出数组,最好检查数据确保没包含敏感数据, 如果有敏感数据,应覆盖 fields() 方法过滤掉,在上述列子中,我们选择过滤掉 auth_key, password_hash and password_reset_token。最佳实践

模型是代表业务数据、规则和逻辑的中心地方,通常在很多地方重用, 在一个设计良好的应用中,模型通常比控制器代码多。

归纳起来,模型:

可包含属性来展示业务数据; 可包含验证规则确保数据有效和完整; 可包含方法实现业务逻辑; 不应直接访问请求,session和其他环境数据,这些数据应该由控制器传入到模型; 应避免嵌入HTML或其他展示代码,这些代码最好在 视图中处理; 单个模型中避免太多的场景.

在开发大型复杂系统时应经常考虑最后一条建议, 在这些系统中,模型会很大并在很多地方使用,因此会包含需要规则集和业务逻辑, 最后维护这些模型代码成为一个噩梦,因为一个简单修改会影响好多地方, 为确保模型好维护,最好使用以下策略:

定义可被多个 应用主体 或 模块 共享的模型基类集合。 这些模型类应包含通用的最小规则集合和逻辑。在每个使用模型的 应用主体 或 模块中, 通过继承对应的模型基类来定义具体的模型类,具体模型类包含应用主体或模块指定的规则和逻辑。例如,在高级应用模板,你可以定义一个模型基类commonmodelsPost, 然后在前台应用中,定义并使用一个继承commonmodelsPost的具体模型类frontendmodelsPost, 在后台应用中可以类似地定义backendmodelsPost。 通过这种策略,你清楚frontendmodelsPost只对应前台应用,如果你修改它,就无需担忧修改会影响后台应用。

PHP的Yii框架中创建视图和渲染视图的方法详解 视图是MVC模式中的一部分。它是展示数据到终端用户的代码,在网页应用中,根据视图模板来创建视图,视图模板为PHP脚本文件,主要包含HTML代码和展

PHP的Yii框架中View视图的使用进阶 视图名渲染视图时,可指定一个视图名或视图文件路径/别名,大多数情况下使用前者因为前者简洁灵活,我们称用名字的视图为视图名.视图名可以依据

PHP实现可自定义样式的分页类 本文实例为大家分享了PHP实现可自定义样式的分页类,供大家参考,具体内容如下php//namespaceComponent;/***-3-*@authorankang*/classPage{private$ShowPage;private$Coun

标签: php framework框架

本文链接地址:https://www.jiuchutong.com/biancheng/293312.html 转载请保留说明!

上一篇:php ajax异步读取rss文档数据(php接收ajax请求)

下一篇:PHP的Yii框架中创建视图和渲染视图的方法详解(php框架选择2021)

  • 增值税纳税申报表模板
  • 油库存油租赁
  • 个人所得税劳务报酬范围
  • 货款不入公司账户属什么行为
  • 应付账款赊销率和周转率的区别
  • 二季度申报时间
  • 居民企业参股外国企业信息报告表怎么删除
  • 残保金属于税种吗
  • 已经勾选确认的发票可以取消认证吗
  • 在本公司交社保辞职了还能交吗
  • 一般纳税人注销库存需要补交税吗
  • 固定资产汽车抵扣新政策
  • 发票抵税是指哪些内容
  • 小规模企业的企业所得税怎么交
  • 低值易耗品进项税额转出账务处理
  • 不征税发票能报销吗
  • 公司的电话费计入什么科目
  • 银行的贷款损失准备会计分录
  • 安装费如何做账
  • php oci8
  • 兼职劳务费税率是多少
  • 销售人员领用材料
  • mac屏幕横过来了
  • 水利工程水费怎样计算
  • 增值税专用发票上注明的价款含税吗
  • 企业公益性捐赠扣除比例
  • Calanques de Piana岩层上的一个心形洞,法国科西嘉岛 (© joningall/Getty Images)
  • 境外汇款预处理是什么意思
  • 出租包装物和出售包装物有什么区别
  • php date()
  • php如何入门
  • 交易性金融资产的入账价值
  • 原材料月底结转到制造费用吗
  • 工会组织机构需要备案吗
  • 什么发票可以抵扣增值税吗
  • 承兑汇票贴现的利率
  • sqlserver2008触发器语法
  • 购买材料增值税税率
  • 残保金提取是什么意思
  • 公司开业装修费会计分录
  • 企业净利润怎么查询数据
  • 已提足折旧固定资产
  • 职工教育经费能开专票吗
  • 购入固定资产预计净残值
  • 纳税人延期缴纳税款
  • 固定资产转为投资的条件
  • 公司暂估成本分录
  • 主营业务收入和库存商品怎么区分
  • Windows Server 2003关闭启动后的Ctrl+Alt+Del选项和关机时的时间跟踪程序方法
  • bios 设置
  • ubuntu获取当前路径
  • linux常见压缩工具
  • linux中的挂载命令
  • 快捷图标小箭头怎么恢复
  • centos删除vg
  • win7 64位系统提示"Windows7不能识别网络打印机"的故障原因及解决方法
  • centos wget
  • 你需要windows7sp1才能安装ie11
  • ubuntu 2021
  • opengl编程实例
  • c# 抽象类的作用
  • linux shell脚本实例
  • unity引擎叫什么
  • Python实现以时间换空间的缓存替换算法
  • linux python gui
  • 删除的照片怎么还原
  • Android调用系统摄像头
  • excel执行python脚本
  • javascript编程技术
  • python async
  • 北京 国税局
  • 中国农村信用社手机银行下载app
  • 纳税申报的期限是多久
  • 贵州铜仁苗族自治区
  • 金米财税口碑如何?
  • 2.4车船使用税
  • 行政单位,比如什么单位
  • 广东地方税务局领导班子名单
  • 关于切实加强建筑施工领域安全防范工作
  • 接受虚开增值税普票如何补救
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设