Yii2的Web控制器文件分析(yii\web\Controller.php)

这个控制器大体也分三部分
  • action相关功能
  • render相关功能
  • 常用response简写
1、action相关功能

action中绑定参数功能:public function bindActionParams($action, $params)

  1. /*
  2. * 这个是基类的 action中绑定参数功能的实现
  3. *
  4. * 根据action中定义的参数,从$_GET中取对应的值,
  5. * 如果没有,则报错
  6. */
  7. public function bindActionParams($action, $params)
  8. {
  9.         /*
  10.          * 先通过反射得到动作action的方法信息
  11.          *
  12.          * 有两种action,
  13.          * 一种是Yii提供的InlineAction,我们在控制器里面定义的actionXXX都是这种类型
  14.          * 另外一个就是独立action,直接继承自Action类,并实现里面的run方法。
  15.          */
  16.         if ($action instanceof InlineAction) {
  17.             $method = new \ReflectionMethod($this, $action->actionMethod);
  18.         } else {
  19.             $method = new \ReflectionMethod($action, 'run');
  20.         }

  21.         $args = [];
  22.         $missing = [];
  23.         $actionParams = [];
  24.         foreach ($method->getParameters() as $param) {
  25.             //获取在action中定义的参数的名称。
  26.             //如action定义为:actionIndex($x,$y=5)
  27.             $name = $param->getName();
  28.             //如果action中定义 的参数存在于$_GET中
  29.             if (array_key_exists($name, $params)) {
  30.                 if ($param->isArray()) {
  31.                     /*
  32.                      * 如果参数是数组类型的,
  33.                      * 如果从$_GET中取得的数据是数组,返回
  34.                      * 否则包装到数组
  35.                      */
  36.                     $args[] = $actionParams[$name] = is_array($params[$name]) ? $params[$name] : [$params[$name]];
  37.                 } elseif (!is_array($params[$name])) {
  38.                     /*
  39.                      * 如果不是数组,直接返回$_GET中对应的结果
  40.                      */
  41.                     $args[] = $actionParams[$name] = $params[$name];
  42.                 } else {
  43.                     throw new BadRequestHttpException(Yii::t('yii', 'Invalid data received for parameter "{param}".', [
  44.                         'param' => $name,
  45.                     ]));
  46.                 }
  47.                 unset($params[$name]);            
  48.             } elseif ($param->isDefaultValueAvailable()) {
  49.                 //如果默认有默认值。
  50.                 $args[] = $actionParams[$name] = $param->getDefaultValue();
  51.             } else {
  52.                 //action中定义的参数没有在$_GET中找到。
  53.                 $missing[] = $name;
  54.             }
  55.         }

  56.         //action中的参数有缺少,报异常
  57.         if (!empty($missing)) {
  58.             throw new BadRequestHttpException(Yii::t('yii', 'Missing required parameters: {params}', [
  59.                 'params' => implode(', ', $missing),
  60.             ]));
  61.         }

  62.         $this->actionParams = $actionParams;

  63.         return $args;
  64. }
启动csrf验证功能
  1. //这个重写基类的beforeAction
  2. public function beforeAction($action)
  3. {
  4.         if (parent::beforeAction($action)) {
  5.                 //启动csrf验证功能
  6.             if ($this->enableCsrfValidation && Yii::$app->errorHandler->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) {
  7.                 throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.'));
  8.             }
  9.             return true;
  10.         } else {
  11.             return false;
  12.         }
  13. }
2、render相关功能

除了基类的几个render外,在这个里面还增加了一种对ajax请求的响应
  1. /*
  2. * 这个渲染的结棍用来作为ajax请求的的响应
  3. * 这个方法和renderPartial类似,但这个返回的结果中会包含css/js以及其它在view中注册的文件。
  4. */
  5. public function renderAjax($view, $params = [])
  6. {
  7.         return $this->getView()->renderAjax($view, $params, $this);
  8. }
3、常用response简写

重定向

public function redirect($url, $statusCode = 302)
其中$url参数为
  • 完整的url,如:“http://www.yii2.com”
  • 别名url,如:"@yiifans.com"
  • 数组,如果为数组的话格式为[$route,.....name-value...],如:['site/index','id'=>5,'keyword'=>'test'],
不管哪种参数,都会在redirect内部用 Url::to() 来处理。

另外,如果传入的是相对的url,都会根据当前请求的host info 转换为绝对url,

返回首页
public function goHome()

后退
public function goBack($defaultUrl = null)
其中$defaultUrl为字符串或数组

刷新

public function refresh($anchor = '')


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值