位置: 编程技术 - 正文

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)

  • 建筑业小规模纳税人 扣除分包款 开票
  • 企业当年发放以往年度工资
  • 退税会计科目怎么做账
  • 13%税开成了3%怎么报税
  • 个人独资企业没有申报税的后果
  • 哪些会计科目需要结转
  • 工程管理费如何使用
  • 广告公司好进吗
  • 定额发票用来干嘛
  • 一般纳税人销售二手车增值税税率
  • 简易征收的增值税可以在税前列支吗
  • 营改增后建筑业税率变化情况
  • 税收分类编码选错了有事吗
  • 生产成本和主营业务成本哪个大
  • 外贸企业零退税怎么算
  • 个体工商户是否属于法人
  • 出口已使用过的设备退税吗
  • 工资非自然月怎么计算
  • 付款后多久开发发票
  • 使用ps能完成的操作有哪些
  • 手机中的流量统计在哪里寻找
  • 把桌面文件放到虚拟机
  • win11键盘全部没反应
  • 企业长期借款的利息,有可能计入的科目有( )
  • 交易性金融资产是什么意思
  • 苹果手机铃声删除在哪里
  • phpswoole面试
  • 增值税专用发票的税率是多少啊
  • php不使用内置函数的情况下,输出数组中重复最多的元素
  • 金融服务企业按照是否办理存款业务
  • 生产型企业出口退税计算案例
  • 配置nginx支持php
  • 自己买材料自己装修
  • php扩展安装方法
  • php框架怎么用
  • php filesize
  • 2021年车辆检测
  • vue路由跳转的三种方法
  • ip6tables-save命令 保存ip6tables表配置
  • 国税申报系统操作流程
  • 长期待摊费用如何处理
  • threejs 3dtiles
  • python线程间通信的几种方法
  • 公司员工兼职开公司
  • 哪些情况可以开立基本账户
  • 电子税务局增值税抵扣流程
  • 固定资产丢失进哪个科目
  • 建造合同信息表
  • 加班打车费用计入什么科目
  • 企业没有工会的需要计提嘛
  • 大修和维修怎样定义
  • 加油预付卡销售 IC卡充值
  • 保险公司赔付进项税
  • 出纳记帐凭证
  • 库存退货怎么做账
  • 日记账的设置和登记
  • SQL server 字符串函数
  • win10两个网络怎么选择网络
  • win7 光盘
  • xp系统的程序和功能在哪里
  • 电脑系统管理员已阻止这个应用怎么办
  • win7系统添加打印机没有USB端口选项
  • 如何卸载centos7
  • win8用户账户控制如何解除
  • win7打印机图标显示感叹号
  • win7ie8和ie11
  • vs2010配置opengl
  • js中数组操作
  • android-3
  • jquery.js插件
  • linux shell脚本实例
  • 常用python编程软件
  • python调用fortran函数传入数组
  • 全面解析俄乌武器对比
  • 广东省地方税务局历任局长
  • 涉嫌虚开增值税专用发票罪
  • 公司完税证明去哪里开具
  • 南京市高新园区
  • 瑞士州税
  • 盈利性组织与非盈利性组织公共关系不同之处
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设