php yii action 取值,yii2的操作action()

1、什么是内联操作,什么是独立操作。

操作通常是用来执行资源的特定操作,因此,操作ID通常为动词,如view, update等。

内联操作:

操作方法的名字是根据操作ID遵循如下规则衍生:

将每个单词的第一个字母转为大写;

去掉中横杠;

增加action前缀.

例如index 转成 actionIndex, hello-world 转成 actionHelloWorld。

注意: 操作方法的名字大小写敏感,如果方法名称为ActionIndex不会认为是操作方法, 所以请求index操作会返回一个异常,也要注意操作方法必须是公有的,私有或者受保护的方法不能定义成内联操作。

因为容易创建,内联操作是最常用的操作,但是如果你计划在不同地方重用相同的操作, 或者你想重新分配一个操作,需要考虑定义它为独立操作。

所以一句话总结,内联操作就是定义在Controller中的,以action前缀,并且完成需要功能的操作。

独立操作:

顾名思义,就是一个完成独立功能的操作,处理过程独立定义,在需要的Controller只是调用,完成一些事物功能,特别是一些公共的重用的功能。

独立操作通过继承yii\base\Action或它的子类来定义。 例如Yii发布的yii\web\ViewAction和yii\web\ErrorAction都是独立操作。

要使用独立操作,需要通过控制器中覆盖yii\base\Controller::actions()方法在action map中申明,如下例所示:

public function actions()

{

return [

// 用类来申明”error” 操作

‘error’ => ‘yii\web\ErrorAction’,

// 用配置数组申明 “view” 操作

‘view’ => [

‘class’ => ‘yii\web\ViewAction’,

‘viewPrefix’ => ”,

],

];

}

如上所示, actions() 方法返回键为操作ID、值为对应操作类名或数组configurations 的数组。 和内联操作不同,独立操作ID可包含任意字符,只要在actions() 方法中申明.

为创建一个独立操作类,需要继承yii\base\Action 或它的子类,并实现公有的名称为run()的方法, run() 方法的角色和操作方法类似,例如:

namespace app\components;

use yii\base\Action;

class HelloWorldAction extends Action

{

public function run()

{

return “Hello World”;

}

}

操作参数

内联操作的操作方法和独立操作的 run() 方法可以带参数,称为操作参数。 参数值从请求中获取,对于yii\web\Application网页应用, 每个操作参数的值从$_GET中获得,参数名作为键; 对于yii\console\Application控制台应用, 操作参数对应命令行参数。

如下例,操作view (内联操作) 申明了两个参数 $id 和 $version。

namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller

{

public function actionView($id, $version = null)

{

// …

}

}

操作参数会被不同的参数填入,如下所示:

http://hostname/index.php?r=post/view&id=123: $id 会填入’123’,$version 仍为 null 空因为没有version请求参数;

http://hostname/index.php?r=post/view&id=123&version=2: $id 和 $version 分别填入 ‘123’ 和 ‘2’`;

http://hostname/index.php?r=post/view: 会抛出yii\web\BadRequestHttpException 异常 因为请求没有提供参数给必须赋值参数$id;

http://hostname/index.php?r=post/view&id[]=123: 会抛出yii\web\BadRequestHttpException 异常 因为$id 参数收到数字值 [‘123’]而不是字符串.

如果想让操作参数接收数组值,需要指定$id为array,如下所示:

public function actionView(array $id, $version = null)

{

// …

}

现在如果请求为 http://hostname/index.php?r=post/view&id[]=123, 参数 $id 会使用数组值[‘123’], 如果请求为 http://hostname/index.php?r=post/view&id=123, 参数 $id 会获取相同数组值,因为无类型的’123’会自动转成数组。

控制器生命周期:

处理一个请求时,应用主体 会根据请求路由创建一个控制器,控制器经过以下生命周期来完成请求:

在控制器创建和配置后,yii\base\Controller::init() 方法会被调用。

控制器根据请求操作ID创建一个操作对象:

如果操作ID没有指定,会使用yii\base\Controller::defaultAction默认操作ID;

如果在yii\base\Controller::actions()找到操作ID,会创建一个独立操作;

如果操作ID对应操作方法,会创建一个内联操作;

否则会抛出yii\base\InvalidRouteException异常。

控制器按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction() 方法;

如果任意一个调用返回false,后面未调用的beforeAction()会跳过并且操作执行会被取消; action execution will be cancelled.

默认情况下每个 beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作;

控制器执行操作:

请求数据解析和填入到操作参数;

控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;

默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作;

应用主体获取操作结果并赋值给响应

所以总结一下:当访问一个操作请求时,整个过程是这样子:

(1)执行控制器,按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction(),即从访问顺序执行beforeAction(),完成一些必要事物。

(2)再判断有没有指定访问操作ID,如果没有,则访问yii\base\Controller::defaultAction默认操作ID。

(3)如果访问指定了访问的操作ID,那首先去执行独立操作actions里定义的对应的操作ID,如果独立的操作ID不存在,则再去访问内联操作ID,完成对应操作。

(4)最后按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作。

(5)返回操作结果给应用主体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值