YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior
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()反回那个对应关系的数组,如果这里为空,没有默认的对应关系?
转载于:https://www.cnblogs.com/mrcoke/articles/2409663.html
YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior相关推荐
- Yii中的CComponent应用实例
首先我们先了解一下如何创建一个CComponent,手册讲述如下: CComponent 是所有组件类的基类. CComponent 实现了定义.使用属性和事件的协议. 属性是通过getter方法 ...
- Yii中Action详解
在此篇中,主要介绍Yii是如何看待Action的.那么在Controller中又是如何如何处理Action的,Action又有哪些需要注意的特性呢? 带着这些问题,我们来看看下面的代码,里面会涉及到Y ...
- YII中session和cookie
一,在Yii中使用session 与原生态php5的session使用差别是,php5使用session_start();$_session['key'] = $value; 在yii中,sess ...
- yii 1.4 constant.php,yii 中设置提示成功信息,错误提示信息,警告信息
方法一: Yii::app()->user->setFlash('success',"Data saved!"); 设置键值名为success的临时信息.在getFla ...
- yii 引用php文件,Yii中引出php文件及插件
Yii中引入php文件及插件 作者:zccst 一.设置环境变量(在PHP) echo get_include_path(); //获取当前所有环境变量.即该项目中那些代码已被引用. se ...
- 【Yii框架系列一】Yii中CDbCriteria常用总结
2019独角兽企业重金招聘Python工程师标准>>> Yii中CDbCriteria常用总结 Yii的Active Recorder包装了很多. 特别是把SQL中 把where,o ...
- [Yii][RBAC]Yii中应用RBAC完全指南
开端筹办 Yii供给了强大的设备机制和很多现成的类库.在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码.所以筹办工作就是,打开编辑器,跟我来. 设置参数.建树数据库 在设备数组中,增长以 ...
- YII 开启URL伪静态方法(yii中urlManager匹配和注意点)
Yii高性能PHP框架 Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP ...
- YII中You are not authorized to perform this action的解决方法
当访问:TblOrders/listdetial时 YII中出现You are not authorized to perform this action的提示,是因为当前用户没有访问这个控制器下面的 ...
最新文章
- html焦点试图代码,HTML DOM focus()用法及代码示例
- php读取usb设备信息,急,请问如何获取USB设备的路径,非HID类型
- java线上排查利器arthas
- ITK:优化简单的抛物面函数
- [maven][spring boot] mvn -f 指定pom文件
- 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
- 系统调用功能模块的初始化
- elementUI中复选框checkbox的使用
- selnium 判断页面加载完成_Selenium 的页面加载以及几种等待的问题
- 精通javascript 代码总结
- 【实验】基于朴素贝叶斯的新闻分类
- ArcGIS教程:图形处理概述
- edge linux 下载软件,微软Edge浏览器Linux开发版
- IPv6的DNS,设置DNS
- 怎么关闭自动启动的屏幕键盘
- 查询各学生的年龄-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
- zjs-my-diary-0220118
- SSM开发笔记-尚硅谷-佟刚-Spring4.0.0
- 【Docker】docker安装elasticsearch集群,Kibana安装以及开启认证
- javaScript 结构算法刷题 数组题