YII2中behavior行为的理解与使用

编程

YII2中的行为说白了就是对组件功能的扩展,在不改变继承关系的条件下。

行为附加到组件后,行为将注入自已的方法和属性到组件,可以像组件访问自定义的方法和属性一样访问行为。

注意行为是对功能的扩展,不要乱用行为,比如有一个动物类和一个人类,他们各自有自已的名称,身高,体重,这些是属性。

他们都会跑,这个时候我们就可以抽象出来做成一个跑的行为,根据不同需求来扩展他们。

这里我们有两个控制器一个GoodsController,一个OrderController,他们都接收请求,返回数据给客户端,不过有的需要返回json,有的需要返回xml。

那么我们就创建一个返回数据行为来扩展这两个控制器。

我们在项目目录下创建common目录,并创建ReturnBehavior.php,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<?php

 

namespace

appcommon;

 

use

YII;

use

yiiaseBehavior;

use

yiiwebController;

use

yiiwebResponse;

 

//必须继承自yiiaseBehavior

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代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<?php

 

namespace

appcontrollers;

 

use

YII;

use

appcommonReturnBehavior;

use

yiiwebController;

 

//想要使用行为,必须是component或是其子类

//yiiwebController继承自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代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<?php

 

namespace

appcontrollers;

 

use

YII;

use

appcommonReturnBehavior;

use

yiiwebController;

 

//想要使用行为,必须是component或是其子类

//yiiwebController继承自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行为的理解与使用 的全部内容, 来源链接: utcz.com/z/512112.html

回到顶部