昨天看blog的demo的时候看到一个new post(search); 的运用场景的例子没明白,查了一下没找到很好的解释。麻烦大哥们指点一下:
场景是什么?
场景的作用?
场景有哪些,是开发者自定义还是yii已经定义了的?.
昨天看blog的demo的时候看到一个new post(search); 的运用场景的例子没明白,查了一下没找到很好的解释。麻烦大哥们指点一下:
场景是什么?
场景的作用?
场景有哪些,是开发者自定义还是yii已经定义了的?.
场景的概念来自 用例驱动的方法学
用银行操作来说 存款 取款 转账 就是用例(关于用例的概念自己查阅相关资料或者google 简单点说就是里程碑式的操作 是系统级的方法 可以认为是应用级别的事务) 在面向对象中 模型层的东西会参加多个用例(一个对象有若干个方法 并不是所有方法在一次操作中都被用到 某个用例操作中只会用到一个或几个) 你可以这样认为用例等价场景 还有就是一个用例中可能不止一个模型参与其中
对AR来说 其中的若干属性只会参与一个用例(插入insert 更新update 或者搜索search) 在某种高度对象的方法和属性是一个级别概念 所以某些属性/方法 可以用用例来归组 经常在一起使用的方法或属性可以归为一个用例(场景)之中
用例可以自己定义 根据应用特征 比如User 这个模型类 在登陆操作(场景/用例/应用事务)中只会用到用户名和密码 所有这两个组合可以归为一个场景 其他属性根据业务可以自定义归组 ; 在拿改密码来说你可能需要用户输入旧密码 和新密码 那么这两个就会归属同一个用例(可以随意起名 比如changePassword等)
场景名不是yii定死的 但insert update 和search 是默认的(惯例而已) 在actionCreate actionUpdate actionAdmin中出现的$model 默认的scenario 就分别是insert,update,search 你可以打印出来
echo $model->scenario ;die(); //在render 之前 试着调试输出
这里给你一个参考地址:用例场景
谢谢你这么详细的解答,另外我还有一些不明白的地方:
1.运用场景为方法/属性分组的作用或目的是什么,是不是构造特定的实例,以减少需要填充的属性的数量?
2.yii中如何定义场景?
下面描述混用用例跟场景的概念(当然这是不对的 为了便于你理解就这么说了 ):
用场景分组方法或属性 的原因 是因为在设计一个类时 你不会一下就考虑到所有可能的用例 比如Yii中的CHtml(当然它是静态工具类)其中的某些方法可能是某个人在某个项目中需要用到并逐步抽象出来放在这个工具类中 并不是说这个类从诞生时就具有这么多方法 他们中的某些可能会内聚式的出现在一个用例中 当然你一下看到这个类有这么多方法会有点恐惧心理 其实针对简单场景仅仅只用到个别方法而已(我说的内聚式是他们经常出现在一起);对于其他常规类的设计也是这样 根据当前用例 一次添加一些 这样整个类就如同生日蛋糕一样某一层来自一个用例(当然也可能多个用例中都会用到同一属性,方法 ; 所以属性可以属于多个场景)
所以在设计类(类是设计期概念 对象是运行时概念)往往是逐步添加属性、方法的。
关于如何定义场景 这个很简单看这里 只是一个标识性的字符串而已 然后再rules方法中 模拟search场景定义验证规则即可 在new MyModel(‘myScenario’); 传递场景名 或者先new在setScenario 这样在调用模型的save或者validate方法时场景对应的验证规则就会被应用 当然你应该注意到massive assignment 注意其中的massive assignment部分 $model->attributes = $_POST[‘MyModel’]; 也会应用scenario的 没有出现在场景中的属性不会没赋值的
明白了很多,不知道我的理解对不对:场景是特定或相类似的请求的归组,用来约束或引导各场景组的请求的执行过程:包括实例化、验证等,根据场景定义各个阶段规则(如验证阶段),或者将阶段规则赋予场景,使程序在不同阶段执行符合场景需求的差异化的操作。
另外yii的预定义的场景都是和模型中诸如insert,update等操作同名,不知道他们是不是有直接关系?
场景这个词 本是用在舞台剧话剧等的术语 比如一场戏 会由若干段重要场景构成 一段场景中会有不同人物出场
拿程序设计做比较 一个大的系统级别功能(一个用例)比作一个演出 它涉及若干段场景 每段场景有不同对象参与 。
你还是要结合我给的那个参考资料来理解 。 当用例没有备选流只有基本流时 可认为用例退化为场景概念(一个演出 只有一个场景(不切换到其他景区))
yii中的insert update 没必然关系 但是有联系 当你要做insert时 你必须先 new 一个模型 而默认的模型用的就是insert场景(你去看构造方法AR构造方法签名) 当你要做update操作时 会先find一下 所有find后(包括各种findXXX)默认都会置于update场景的
update流程不像你直接用mysql那种操作 它会先查询 再保存 你如果用常规php编程方法 可能直接做更新而不用查询这个步骤
呵呵,终于算是明白了,以后我再去看看代码就清楚了。但是你说的用例、基本流,包括场景这些词让我感觉自己很不专业,虽然大概能理解,但是没有系统的认识。我毕竟不是计算机专业,想多补充相关的知识,不知道这些知识属于什么范畴?
RUP UML 统一过程 是软件工程学的知识
Thank you very much !