Yii2 - 06模型(Model)

Yii2—模型(Model) 模型(Model) 模型的定义 属性 属性的定义 属性的访问 属性的批量读取和赋值 属性标签 场景 验证 验证规则的实现 自定义验证器和内置验证器 条件验证 验证规则和批量赋值 Yii中的模型有以下基本特征: 属性声明:可以在模型里面定义自己需要的属性。 属性标签:每个属性都有一个对应的标签以便在界面上显示友好的名称 批量属 阅读详情

Model

模型是MVC模式中的一部分,是代表业务数据、规则和逻辑对象
默认情况下你的模型类直接从yii\base\Model继承,所有非静态公有成员变量都是属性。
例如,下述ContactForm模型类有4个属性name,email,subject,content,
ContactForm模型用来代表从HTML表单获取的输入数据。

namespace app\models;

use yii\base\Model;

class ContactForm extends Model
{
    public $name;
    public $email;
    public $subject;
    public $content;
}

验证

当模型接收到终端用户输入的数据,数据应该满足某种规则(称为验证规则,也称为业务规则)。
通过覆盖yii\base\Model::rules() 方法指定模型属性应该满足的规则来申明模型相关验证规则。
下述例子显示ContactForm 模型声明的验证规则:

    public function rules()
    {
        return [
            //username,email,subject,content属性必须有值
            [['username','email','subject','content'],'required'],
            ['email','email'], //email必须是邮箱格式
        ];
    }

控制器里验证

 $model = new \app\models\ContactForm();
 if($model->validate()){
     // 验证通过
 }else{
     // 验证没有通过
 }

场景

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

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

// 场景作为属性来设置
$model = new User();
$model->scenario = 'login';

// 场景通过构造初始化配置来设置
$model = new User(['scenario'=>'login'])

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

    // 验证规则
    public function rules()
    {
        return [
            // 在'register'场景下 username,email,password属性必须有值
            [['username','email','password'],'required','on'=>'register'],

            // 在'login'场景下 username,password属性必须有值
            [['username','password'],'required','on'=>'login'],
        ];
    }

模型最佳实践

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

归纳起来,模型:

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

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

定义可被多个`application(应用)`或`module(模块)`共享的模型基类,这些模型应包含通用的最小规则集合和逻辑。
在每个使用模型的[应用]和[模块]中,通过继承对应的模型基类来定义具体的模型类,具体模型类包含应用主体或模型指定的规则和逻辑。

例如,在[高级应用模板],你可以定义一个模型基类common\models\Post,
然后在前台应用中,定义并使用一个继承common\models\Post的具体模型类frontend\models\Post,
在后台应用中可以类似的定义backend\models\Post。
通过这种策略,你清楚frontend\models\Post只对应前台应用,如果你修改它,就无需担心修改会影响后台应用。

示例

1、新建models\Member.php

<?php

namespace app\models;

use yii\base\Model;

class Member extends Model
{
    public $username;
    public $email;

    // 验证规则
    public function rules()
    {
        return [
            // username,email属性必须有值
            [['username','email'],'required','on'=>'register'],

            // email必须是邮箱格式
            ['email','email']
        ];
    }
}

2、控制器里使用模型

public function actionIndex()
{
    $member = new Member();
    $member->scenario = 'register';

    $member->email = 'a@b.c';
    $member->username = 'Lily';

    // 验证是否合法
    if($member->validate()){
        return 'ok';
    }else{
        // 打印验证未通过的原因信息
        var_dump($member->getFirstErrors());
    }

}
OpencvSharp学习笔记(一):图片的打开,保存灰度化,保存 近来萌生了学习OpenCv的想法,经过度娘得知老夫会的C#不能直接用OpenCv,只能用他的儿子OpenCvSharp与EmguCV,奈何奈何,这两玩意的资料少的出奇,只能慢慢的摸索了,EmguCV先不说,老夫找到了牛批的资料,先摸索OpencvSharp吧 首先打开VS通过Nuget安装 选择版本后点击安装就OK了. 安装完成后,引用里面就有以下的玩意儿了… 废话不多说了,在写程序前先 using OpenCvSharp 图片打开,灰度化,保存代码如下: static void Main(strin 阅读详情

相关推荐

pentaho-kettle依赖拉取失败?试试这个Maven仓库配置的终极解决方案

本文详细解析了Pentaho Kettle依赖拉取失败的常见原因,并提供了三种Maven仓库配置方案,包括基础pom.xml配置、全局settings.xml设置以及企业级私有镜像仓库搭建。通过实战验证的方法和常见问题排查指南,帮助开发者彻底解决pentaho-kettle依赖问题,提升项目构建效率。

weixin_30275415的博客 202

Yii2 深入了解模型之增删改查

一、ActiveRecord活动记录的CURD DQL 1. 查询所有 Article::findAll(['status'=>1]); 2.查询一条 Article::findOne(1); //根据ID查询 Article::findOne(['status' => 1]); //根据条件查询 3.find()方法返回yii\db\Act

郭先生的博客 1万+

【理论&实战篇】大模型RAG技术详解(一)-基础篇

RAG的初衷是为了增强大模型的事实性、时效性,减少幻觉,引入专业知识优化生成回复,是一种结合了信息检索技术与语言生成模型的人工智能技术。通过,并将其作为提示(Prompt)输入给大模型(LLM),来。

qq_41375680的博客 373

Yii2模型的关联模型使用

Active Record 可以将相关数据集中进来, 使其可以通过原始数据轻松访问。 例如,客户数据与订单数据相关 因为一个客户可能已经存放了一个或多个订单。这种关系通过适当的声明, 你可以使用 $customer->orders 表达式访问客户的订单信息 这表达式将返回包含 Order Active Record 实例的客户订单信息的数组。 声明关联关系 你必须先在 Active Record 类中定义关联关系,才能使用 Active Record 的关联数据。 简单地为每个需要定义关联关系声明一个

Peak Xin's Blog 922

5.1 滑模控制(SMC)及其改进

本文系统阐述了滑模控制(SMC)的基本原理及其在永磁同步电机(PMSM)控制系统中的应用。首先介绍了滑模控制的核心思想,包括滑模面设计和不连续控制律,其强鲁棒性使其在电机控制领域得到广泛应用。其次分析了SMC在PMSM速度控制器和无位置传感器观测器中的具体实现方案。重点探讨了SMC固有的抖振问题,详细比较了边界层法、高阶滑模和自适应方法等多种改进策略的优缺点。最后指出改进SMC的研究趋势是多种策略的融合应用,如自适应高阶滑模等,以在保持鲁棒性的同时有效抑制抖振。

技术工作者 1448

解决uc浏览器劫持video标签问题

解决uc视频悬浮播放 ,video标签被浏览器劫持 ,vide0适配

smile_y_y的博客 3449

Yii2.0 模型规则(rules)详解

【代码】Yii2.0 模型规则(rules)详解。

学习者小高 1061

从实验室到生活:构建一份全面的手机相机主观画质评测指南

本文详细介绍了如何从实验室数据转向实际体验,构建全面的手机相机主观画质评测指南。通过基础装备清单、室内外场景实战评测及数据之外的感知艺术,帮助用户发现手机相机在色彩还原、动态范围和夜景模式等方面的真实表现。特别关注主观体验与客观参数的差异,提供实用的评测技巧和报告撰写心法。

weixin_30940783的博客 307

yii2—数据模型

单表查询 配置config\db.php return [ 'class' =&gt; 'yii\db\Connection', 'dsn' =&gt; 'mysql:host=localhost;dbname=test', 'username' =&gt; 'root', 'password' =&gt; '12345...

shaonian1996 428

某程token参数逆向分析

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

weixin_73499887的博客 2880

GEE:基于自定义的年度时序数据集进行LandTrendr变化检测

本文介绍了使用年度时序数据进行LandTrendr变化检测的方法,包括核心函数调用、参数设置和结果可视化。通过筛选参数(年份、变化幅度和持续时间)对结果进行过滤,输出变化年份、变化幅度和持续时间。代码提供了完整的处理流程,包括数据输入、LandTrendr算法运行、结果筛选与可视化,并支持结果导出。适用于基于Google Earth Engine平台的地表变化检测分析。

养乐多的博客 751

简述Yii 的CGridView如何使用及怎么用model的search搜索

Yii的CGridview挂件可以自动生成数据列表,很适合在后台管理页面使用。 但Yii的文档还是很缺乏,只能在 class reference 中找到一些简单的说明,可并不直观。在这里总结下CGridview的用法。 在模板页面中,可以这样来使用CGridv

hy840429的专栏 3162

【Qt开发】管理OpenGL上下文QOpenGLContext类及应用实践示例代码

QOpenGLContext 提供了一个简单、高效的接口来管理 OpenGL 上下文。本文详细介绍了 QOpenGLContext 的基本功能、常用方法、信号槽机制、高级应用技巧及常见问题的解决方法。通过这些介绍,读者可以更好地掌握和利用 QOpenGLContext 进行 OpenGL 渲染和管理实验。对于有特殊需求的开发者,也可以通过探索更多高级设置和优化策略,以满足具体的应用场景。

科技改变人类,技术成就未来 1871

YII2 unknown scenarios:default问题原因查找

最近用YII2场景的时候发现用到的地方功能是好的,但是和其他地方冲突了 报错如下:unknown scenarios:default model文件下书写规则 /* * 定义执行的场景 * zhaoyinfan * 2016-06-16 */ public function scenarios() { $scen

简单的世界 4411

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

YII Framework学习教程-YII的Model-实现原理-2011-11-22

今天的最后一节了,来讲讲神圣的Model在YII中是如何实现的。以及和Controller怎么无缝的结合在一起的。     文章《YII Framework学习教程-YII架构设计官方图解-2011-11-11》给除了我们yii框架的整个结构和应用的流程。不难发现Model和Controller的关系。      要讲原理可能要讲CModel是怎么实现的,以及在Application中如何

梦想摆渡的专栏 7369

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

YII框架之soap协议的配置跟使用(Webservice)

Yii依靠文档注解(doc comments)和类反射(class reflection)来识别哪个方法可以被远程调用,包括他们的参数和返回值,但目前只能返回字符串,不能返回数组,若返回数组,则为"array";故我将返回值转换为json字符串再返回. 1. 定义Service Provider,服务器端文件代码,WebServerController.php <?php

Sara的专栏 7650

Yii2.0中文开发向导——查询条件Where全解析

Yii2.0中文开发向导——查询条件Where全解析 2014-06-16 17:47 316人阅读 评论(0) 收藏 举报 yii2.0yiiwhere 在Yii的Model里进行查询的时候 where是必不可少的。 Where方法声明为 static where( $condition ) 复制代码 其中参数 $condition类型为

Terry - 专注外贸B2C 1186

yii dwz 分页功能

利用dwz分页 controller中设置页面数量:DEFAULT_PAGE_SIZE const DEFAULT_PAGE_SIZE = 20; const DEFAULT_PAGE_NUM = 0; public function actionIndex() { $numPerPage = self::DEFAULT_PAGE_SIZE; if...

weixin_30651273的博客 127

yii技术文档最佳MVC实践

阅读yii的技术文档,其中一篇最佳MVC实践感觉写的非常好,为了方便阅读,本打算将文章翻译为中文,并写进博文的,但是bing了一下,发现已经有前辈做了这样的事情,我就自己转过来用了,多谢这位前辈原始英文文档链接地址:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.best-practices翻译后的博文地址:http://sexywp...

weixin_30266885的博客 84

Yii学习笔记(二)使用脚手架搭建CURD

听起来脚手架这个名字挺牛逼的,一开始也吓我一跳,脚手架 绞架。。。。 其实没多少关系, 脚手架是辅助施工(主要是建筑)搭的架子,在 Yii框架里边可以片面理解为自动生成一些代码的脚本(我这么理解)。 生成代码之前必须先配置数据库, 配置文件在 protected/config/main.php, 系统的主要配置都在这个文件,数据库的配置也在这里 'db'=>array( '...

weixin_30323961的博客 133

Yii-跳转页面-用法设置N秒后自动跳转

控制器  1、方法1 //执行操作 if(Product::model()->updateAll($set,$criteria)){ //成功跳转 $this->render('../index/success',array('message'=>'恭喜,产品审核成功')); exit; }else{ //失败跳转 $this->rende

周祥平程序专栏 3773

yii php中怎么跳转页面,yii 里面js 怎么跳转页面

控制器方法1[html] view plain copy print?//执行操作if(Product::model()->updateAll($set,$criteria)){//成功跳转$this->render('../index/success',array('message'=>'恭喜,产品审核成功'));exit;}else{//失败跳转$this->rende...

weixin_32325225的博客 176

http://blog.youkuaiyun.com/jake451/article/details/6117272

[quote]http://blog.youkuaiyun.com/jake451/article/details/6117272 需求:原网站功能庞大,数据库服务器与数据库众多 问题:YII单DB方式已经满足不了我们的需求,急切需要对YII进行扩展设计,支持多DB方式 解决方法: 1、在protected/components目录下新建Ar.php脚本文件。 v...

sealbird的专栏 230

更改gridview pageSize

可以用以下三种方法 1.在view里面 1 <span style="color:#000000;">$provider=$model->search(); 2 $provider->pagination->pageSize=20; 3 $this->widge...

weixin_30815427的博客 286

精通 Python 设计模式第二版(三)

在本章中,我们讨论了并发和异步模式,这些模式对于编写高效、响应性软件,能够同时处理多个任务非常有用。线程池模式是并发编程中的一个强大工具,它提供了一种有效管理资源并提高应用程序性能的方法。它帮助我们提高应用程序性能,同时减少开销并更好地管理资源,因为线程池限制了线程的数量。虽然线程池模式侧重于重用固定数量的线程来执行任务,但工作模型模式更多地关注于在可能可扩展和灵活的工作实体之间动态分配任务。这种模式特别适用于任务独立且可以并行处理的情况。

龙哥盟 1849

RA8D2窗口看门狗配置详解:从寄存器原理到实战避坑指南

看门狗定时器是嵌入式系统中保障系统稳定运行的关键安全机制,其核心原理是通过周期性刷新操作监控程序运行状态,一旦超时即触发复位或中断。这一机制在汽车电子、工业控制等高可靠性场景中具有不可替代的技术价值。窗口看门狗在基础看门狗之上引入了时间窗口概念,要求刷新操作必须在特定时间区间内完成,从而能检测程序局部紊乱等更细微的故障。本文聚焦瑞萨RA8D2微控制器的看门狗模块,深入解析其控制寄存器(WDTCR)的时钟分频、超时周期及窗口设置等关键位域,并结合实际调试经验,详细阐述如何计算参数、编写配置代码,并规避手册中未

weixin_30628801的博客 569

ThinkPHP - 目录介绍

ThinkPHP框架 特点: 免费开源 敏捷开发(快速开发) 面向对象 MVC思想 yii,ci之类的框架都有这些特点.是06年到现在的一个老牌框架,现在还是个很不错的框架 Application:应用程序目录 Public:静态资源目录 ThinkPHP:tp框架本身 Common:公共文件目录 Conf:配置文件 Lang:语言包 ...

weixin_34214500的博客 116
上一篇: Yii2 - 05如何操作数据库
下一篇: show engine innodb status解读
学习笔记666
博客等级 码龄12年 1047粉丝 1369原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值