YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior个人理解
这一块教程少,今天个人理解了下,写了个小例子,有助于理解
完成如下功能,一个JTool类,继承CComponent,当其长度改变时,调用事件,输出"change me".
JTool.php在protected/components 下
<?php
class JTool extends CComponent{
private $_width;
public function getWidth(){
return $this->_width ? $this->_width : 1;
}

public function setWidth($width){
if($this->hasEventHandler('onChange')){
$this->onChange(new CEvent());
}
$this->_width = $width;
}

public function onChange($event){
$this->raiseEvent('onChange', $event);
}

}

OK,功能已经实现了,找个控制器,执行
$j = new JTool();
$j->onChange = "showChange"; //给事件绑定handle showChange
$j->width = 100; //调用setWidth,解发绑定的事件showChange
function showChange(){
echo 'changed me';
}

现在我们想给JTool添加一个功能,返回长度的100倍,我们可以继承JTool.php写一个方法
class JToolSub extends JTool{
public function get100width(){
return $this->width*100;
}
}
OK,功能实现了,这个执行就简单了new JToolSub调用方法即可

上边的这两种办法,就是仅完成功能,下边演示Behavior及events来实现

如何用Behavior来实现上边的增加一个方法,返回长度的100倍的功能呢?
写类JBe
JBe.php在protected/behavior 下

class JBe extends CBehavior{

public function get100width(){
return $this->Owner->width*100;
}
}

OK,功能已经实现了,找个控制器,执行
$j = new JTool();
$j->attachBehavior('JBe', 'application.behavior.JBe');
echo $j->get100width();

如何用Behavior实现JTool中的长度改变时,调用一个事件的功能呢?
写类JBe

class JBe extends CBehavior{
public function events(){
return array_merge(parent::events(),array(
'onChange'=>'change',
));
}

public function change(){
echo 'changed';
}

public function get100width(){
return $this->Owner->width*100;
}
}

OK,功能实现随便找个控制器,执行
$j = new JTool();
$j->attachBehavior('JBe', 'application.behavior.JBe');
$j->width = 100;

这里的要点是events方法
返回的数组array('onChange'=>'change')定义了事件(event)和对应的事件处理方法(event hander)

事件是是Compents(JTool中)定义的,即JTool中的onChange
处理方法同由Behavior(JBe中)类定义的,即JBe中的change

这样子再看CActiveRecordBehavior,其是绑定给CActiveRecord 这个组件的,绑定方法重写behaviors()
CActiveRecordBehavior中的events() 方法返回事件及事处理函数的对应,如:
'onBeforeSave'=>'beforeSave'

即组件CActiveRecord中的onBeforeSave这个事件对应的处理函数是
CActiveRecordBehavior中的beforeSave方法

这样子CActiveRecord在调用save()时,触发事件onBeforeSave,调用CActiveRecordBehavior对应的处理函数beforeSave
我们只要写一个CActiveRecordBehavior的子类,重写其中的beforeSave,执行一些操作,然后给CActiveRecord绑定即可

我还有个疑问,在继承CBehavior时,是不是一定要让方法events()反回那个对应关系的数组,如果这里为空,没有默认的对应关系?

0

转载于:https://www.cnblogs.com/mrcoke/articles/2409663.html

YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior相关推荐

  1. Yii中的CComponent应用实例

    首先我们先了解一下如何创建一个CComponent,手册讲述如下: CComponent 是所有组件类的基类.  CComponent 实现了定义.使用属性和事件的协议.  属性是通过getter方法 ...

  2. Yii中Action详解

    在此篇中,主要介绍Yii是如何看待Action的.那么在Controller中又是如何如何处理Action的,Action又有哪些需要注意的特性呢? 带着这些问题,我们来看看下面的代码,里面会涉及到Y ...

  3. YII中session和cookie

    一,在Yii中使用session  与原生态php5的session使用差别是,php5使用session_start();$_session['key'] = $value;  在yii中,sess ...

  4. yii 1.4 constant.php,yii 中设置提示成功信息,错误提示信息,警告信息

    方法一: Yii::app()->user->setFlash('success',"Data saved!"); 设置键值名为success的临时信息.在getFla ...

  5. yii 引用php文件,Yii中引出php文件及插件

    Yii中引入php文件及插件 作者:zccst 一.设置环境变量(在PHP) echo get_include_path();       //获取当前所有环境变量.即该项目中那些代码已被引用. se ...

  6. 【Yii框架系列一】Yii中CDbCriteria常用总结

    2019独角兽企业重金招聘Python工程师标准>>> Yii中CDbCriteria常用总结 Yii的Active Recorder包装了很多. 特别是把SQL中 把where,o ...

  7. [Yii][RBAC]Yii中应用RBAC完全指南

    开端筹办 Yii供给了强大的设备机制和很多现成的类库.在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码.所以筹办工作就是,打开编辑器,跟我来.  设置参数.建树数据库 在设备数组中,增长以 ...

  8. YII 开启URL伪静态方法(yii中urlManager匹配和注意点)

    Yii高性能PHP框架 Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP ...

  9. YII中You are not authorized to perform this action的解决方法

    当访问:TblOrders/listdetial时 YII中出现You are not authorized to perform this action的提示,是因为当前用户没有访问这个控制器下面的 ...

最新文章

  1. html焦点试图代码,HTML DOM focus()用法及代码示例
  2. php读取usb设备信息,急,请问如何获取USB设备的路径,非HID类型
  3. java线上排查利器arthas
  4. ITK:优化简单的抛物面函数
  5. [maven][spring boot] mvn -f 指定pom文件
  6. 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
  7. 系统调用功能模块的初始化
  8. elementUI中复选框checkbox的使用
  9. selnium 判断页面加载完成_Selenium 的页面加载以及几种等待的问题
  10. 精通javascript 代码总结
  11. 【实验】基于朴素贝叶斯的新闻分类
  12. ArcGIS教程:图形处理概述
  13. edge linux 下载软件,微软Edge浏览器Linux开发版
  14. IPv6的DNS,设置DNS
  15. 怎么关闭自动启动的屏幕键盘
  16. 查询各学生的年龄-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
  17. zjs-my-diary-0220118
  18. SSM开发笔记-尚硅谷-佟刚-Spring4.0.0
  19. 【Docker】docker安装elasticsearch集群,Kibana安装以及开启认证
  20. javaScript 结构算法刷题 数组题

热门文章

  1. 数据库---查询操作
  2. 每日长难句打卡Day23
  3. Vue报错:npm run start npm ERR! missing script: start
  4. erp软件是什么软件
  5. 失眠,很困但是睡不着怎么办?
  6. 磕头如捣的拼音及解释
  7. 农村电商,如何做到年入100万?
  8. C语言手写快排算法,两个值时也可以使用哦!
  9. 自下而上分析法基本问题
  10. bison、lex版本不同造成的问题