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行为的理解与使用的更多相关文章

  1. YII2中controller中的behaviors中的behavior内部是如何被使用的?

    1. behaviors方法的调用: 在祖先对象components中有一个ensureBehaviors方法,代码如下: /** * Makes sure that the behaviors de ...

  2. yii2中如何使用modal弹窗之基本使用

    作者:白狼 出处:http://www.manks.top/yii2_modal_baseuse.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...

  3. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  4. PHP在yii2中封装SuperSlide 幻灯片编写自己的SuperSlideWidget的例子

    因为近期给朋友公司做个门户网站,把荒置了6.7年的PHP又重新拾起,发现PHP这些年兴旺多了,很多新的东西看的不明不白,研究了几个框架ZendFramework.thinkphp.Symfony.yi ...

  5. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  6. SQL SERVER 2005/2008 中关于架构的理解(一)

    SQL SERVER 2005/2008 中关于架构的理解(一) 在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询, ...

  7. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  8. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  9. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

随机推荐

  1. 转: JS实现页面打印

    转载原文: http://shengren-wang.iteye.com/blog/1161367 1.js实现(可实现局部打印) <!--打印的实现1:start--> <inpu ...

  2. Python文件和目录模块介绍:glob、shutil、ConfigParser

    glob模块 查找符合特定规则的文件路径名,路径名可以使用绝对路径也可以使用相对路径.查找文件会使用到三个通配符,星号*,问号?和中括号[],其中"*"表示匹配0~n个字符, &q ...

  3. 【剑指offer】单链表尾部插入一个节点

    #include <iostream> using namespace std; //链表结构体 struct ListNode { int m_Value; ListNode *next ...

  4. webservice调用dll

    今天客户那里报出来,ws通讯不成功.但是在本机和windows2003上都可以测试成功.WS的页面(asmx)可以出来,但是点击接口方法,调用就报http500错误.   网站无法显示该页面  HTT ...

  5. Pandas数据排序

    Pandas数据排序 .sort_index() 在指定轴上根据索引进行排序,索引排序后内容会跟随排序 b = pd.DataFrame(np.arange(20).reshape(4,5),inde ...

  6. idea 这样 会快点

    最近使用IDEA来开发JAVA应用,对IDEA的界面很有爱,但是缺受不了它的运行速度.每次运行都要编译,所以就有了这边文章   总感觉IDEA的编译速度比eclipse慢,eclipse每次保存都自动 ...

  7. Java NIO Tutorial

    Java NIO Tutorial     Jakob JenkovLast update: 2014-06-25

  8. sql-mybatis-多表查询不查的字段一定不要查

    在多表联查的时候,这时用的是左外联(即如果右边的没有就查出左边的表) 如果右边的没有,那么在Navicat中查询出如下图 而在mybatis中运用同样的查询语句时,查询出来字段的也是这样 这时如果左表 ...

  9. notepad++查看二进制文件

    1.进入以下网址去下载 https://sourceforge.net/projects/npp-plugins/files/Hex%20Editor/Hex%20Editor%20Plugin%20 ...

  10. enum-枚举当做key-value业务使用

    1.枚举当做key-value业务使用 package com.uwillbe.pad.enums; import java.util.ArrayList; import java.util.List ...