YII2中behavior行为的理解与使用
YII2中的行为说白了就是对组件功能的扩展,在不改变继承关系的条件下。
行为附加到组件后,行为将注入自已的方法和属性到组件,可以像组件访问自定义的方法和属性一样访问行为。
注意行为是对功能的扩展,不要乱用行为,比如有一个动物类和一个人类,他们各自有自已的名称,身高,体重,这些是属性。
他们都会跑,这个时候我们就可以抽象出来做成一个跑的行为,根据不同需求来扩展他们。
这里我们有两个控制器一个GoodsController,一个OrderController,他们都接收请求,返回数据给客户端,不过有的需要返回json,有的需要返回xml。
那么我们就创建一个返回数据行为来扩展这两个控制器。
我们在项目目录下创建common目录,并创建ReturnBehavior.php,代码如下:
<?php namespace app\common; use YII;
use yii\base\Behavior;
use yii\web\Controller;
use yii\web\Response; //必须继承自yii\base\Behavior
class ReturnBehavior extends Behavior
{ //返回类型,通过控制器里的behaviors()配置参数获取值
public $return_type = ''; //让行为响应组件的事件触发
public function events()
{
return [
//控制器方法执行后触发事件,调用returnData函数
Controller::EVENT_AFTER_ACTION => 'returnData',
];
} //返回数据
public function returnData()
{
switch ($this->return_type) {
case 'json':
YII::$app->response->format = Response::FORMAT_JSON;
break;
case 'xml':
YII::$app->response->format = Response::FORMAT_XML;
break;
case 'html':
YII::$app->response->format = Response::FORMAT_HTML;
break;
default :
break;
}
} //定义方法
public function test() {
echo 'returnBehavior test ...';
}
}
然后我们在两个控制器中配置behaviors()来使用行为:
GoodsController.php代码如下:
<?php namespace app\controllers; use YII;
use app\common\ReturnBehavior;
use yii\web\Controller; //想要使用行为,必须是component或是其子类
//yii\web\Controller继承自component,所以可以使用
class GoodsController extends Controller
{ //配置控制器需要使用的行为
public function behaviors()
{
return [
'returnBehavior' => [
'class' => ReturnBehavior::className(),
'return_type' => 'json',
],
];
} //获取商品列表
public function actionGetGoodsList()
{
return [
['id' => 1, 'name' => '商品1'],
['id' => 2, 'name' => '商品2'],
];
} public function actionIndex()
{
//控制器调用行为中的方法
$this->getBehavior('returnBehavior')->test();
//注意这里,因为使用了行为,方法执行后会设置返回内容为xml,我们重新设置为html
$this->getBehavior('returnBehavior')->return_type = 'html';
}
}
OrderController.php代码如下:
<?php namespace app\controllers; use YII;
use app\common\ReturnBehavior;
use yii\web\Controller; //想要使用行为,必须是component或是其子类
//yii\web\Controller继承自component,所以可以使用
class OrderController extends Controller
{
//配置控制器需要使用的行为
public function behaviors()
{
return [
'returnBehavior' => [
'class' => ReturnBehavior::className(),
'return_type' => 'xml',
],
];
} //获取商品列表
public function actionGetOrderList()
{
return [
['id' => 1, 'name' => '订单1'],
['id' => 2, 'name' => '订单2'],
];
} public function actionIndex()
{
//控制器调用行为中的方法
$this->getBehavior('returnBehavior')->test();
//注意这里,因为使用了行为,方法执行后会设置返回内容为xml,我们重新设置为html
$this->getBehavior('returnBehavior')->return_type = 'html';
}
}
这个时候我们在地址栏访问/goods/get-goods-list和/order/get-order-list,结果如下:

然后我们访问/goods/index和/order/index,行为方法成功调用,结果如下:

YII2中behavior行为的理解与使用的更多相关文章
- YII2中controller中的behaviors中的behavior内部是如何被使用的?
1. behaviors方法的调用: 在祖先对象components中有一个ensureBehaviors方法,代码如下: /** * Makes sure that the behaviors de ...
- yii2中如何使用modal弹窗之基本使用
作者:白狼 出处:http://www.manks.top/yii2_modal_baseuse.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...
- Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- PHP在yii2中封装SuperSlide 幻灯片编写自己的SuperSlideWidget的例子
因为近期给朋友公司做个门户网站,把荒置了6.7年的PHP又重新拾起,发现PHP这些年兴旺多了,很多新的东西看的不明不白,研究了几个框架ZendFramework.thinkphp.Symfony.yi ...
- SQL SERVER 2005/2008 中关于架构的理解(二)
本文上接SQL SERVER 2005/2008 中关于架构的理解(一) 架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...
- SQL SERVER 2005/2008 中关于架构的理解(一)
SQL SERVER 2005/2008 中关于架构的理解(一) 在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询, ...
- [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name cu ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
随机推荐
- linux 覆盖可执行文件的问题
测试环境是3.10.0 内核. 有一次操作中,发现cp -f A B执行的时候,行为不一样: 当B没被打开,则正常覆盖B. 当B是被打开,但没有被执行,则能覆盖, 当B被打开,且被执行,则不能直接覆盖 ...
- [ SHELL编程 ] 远程服务器传输文件
在shell编程中经常需要获取远程服务器文件.手工操作中使用scp命令完成.为避免脚本执行scp输入密码进行交互,需先建立本机服务器当前用户和远程服务器指定用户的信任关系.具体代码见操作实例,重点关注 ...
- 封装jQuery下载文件组件
使用jQuery导出文档文件 jQuery添加download组件 jQuery.download = function(url, data, method){ if( url && ...
- 关于servlet转发和重新定向
1:重新定向, 是sendRdix(记忆关键词R),firbug中的请求是两个 2:转发 是dispt,(记忆关键词是F),firbug中的请求时一个
- gdufe1534-小小怪一定认真听课-dfs
Problem Description: 又到了选课的时间啦.大一萌新小小怪下士第一次选课没有制定好高效的策略,导致第一学期的学分不高,他想在第二学期获得尽可能多的学分,因此作为小小怪下士的上司搭档兼 ...
- js基础-单体对象日期对象
Math对象 全局对象 日期对象 var t = new Date() t.toLocaleDateString(); t.getFullYear(); t.getMonth() + 1 t.getD ...
- linux系统上项目部署
步骤:(特别注意:虚拟机安装的一般是32位的操作系统,jdk也必须使用32位的)查看虚拟机版本:sudo uname --m i686 //表示是32位 x86_64 // 表示是64位 查看是否已经 ...
- Gradle安装和在IDEA使用 基本操作
阅读目录 简单介绍 安装 使用idea创建一个web的Gradle项目 如何进行打包 解释build.gradle和settings.gradle 有关gradle的jar冲突 本地jar包位置和修改 ...
- mysql里max_allowed_packet的作用
MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置: 代码如下: show VAR ...
- ftp删除目录和文件,目录下有文件删除提示【550 Remove directory operation failed.】
注意:目录下有文件,直接删除目录会失败,提示550 Remove directory operation failed. 必须先将目录下的文件都删除,才能删除目录 ftp命令行: ftp删除目 ...