Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能:

 namespace yii\web;

 use Yii;
 use yii\base\InlineAction;
 use yii\helpers\Url;

 /**
  * Controller is the base class of web controllers.
  *
  * @author Qiang Xue <qiang.xue@gmail.com>
  * @since 2.0
  */
 class Controller extends \yii\base\Controller
 {
     /**
      * @var boolean whether to enable CSRF validation for the actions in this controller.
      * @var boolean 是否启动CSRF验证标记
      * CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
      */
     public $enableCsrfValidation = true;
     /**
      * @var array the parameters bound to the current action.
      * @var array 绑定到当前操作的参数
      */
     public $actionParams = [];

     /**
      * Renders a view in response to an AJAX request.
      * 这个渲染的结果用来作为ajax请求的的响应
      *
      * This method is similar to [[renderPartial()]] except that it will inject into
      * the rendering result with JS/CSS scripts and files which are registered with the view.
      * For this reason, you should use this method instead of [[renderPartial()]] to render
      * a view to respond to an AJAX request.
      * 这个方法和renderPartial类似,但这个返回的结果中会包含css/js以及其它在view中注册的文件。
      *
      * @param string $view the view name. Please refer to [[render()]] on how to specify a view name.
      * @param array $params the parameters (name-value pairs) that should be made available in the view.
      * @return string the rendering result.
      */
     public function renderAjax($view, $params = [])
     {
         return $this->getView()->renderAjax($view, $params, $this);
     }

     /**
      * Binds the parameters to the action.
      * 基类的 action 中绑定参数功能的实现
      * This method is invoked by [[\yii\base\Action]] when it begins to run with the given parameters.
      * This method will check the parameter names that the action requires and return
      * the provided parameters according to the requirement. If there is any missing parameter,
      * an exception will be thrown.
      * 根据action中定义的参数,从$_GET中取对应的值,
      * 如果没有,则抛出异常
      * @param \yii\base\Action $action the action to be bound with parameters
      * @param array $params the parameters to be bound to the action
      * @return array the valid parameters that the action can run with.
      * @throws BadRequestHttpException if there are missing or invalid parameters.
      */
     public function bindActionParams($action, $params)
     {
         if ($action instanceof InlineAction) {//如果action继承InlineAction
             $method = new \ReflectionMethod($this, $action->actionMethod);//通过反射得到动作action的方法信息
         } else {
             $method = new \ReflectionMethod($action, 'run');//如果action继承Action基类,通过反射得到动作action的方法信息,并实现里面的run方法
         }

         $args = [];
         $missing = [];
         $actionParams = [];
         foreach ($method->getParameters() as $param) {
              //获取在action中定义的参数的名称
             $name = $param->getName();
             if (array_key_exists($name, $params)) {
                 if ($param->isArray()) {//如果参数是数组类型的,如果从传入的参数中取得的数据是数组则返回,否则将得到的参数转换为数组
                     $args[] = $actionParams[$name] = (array) $params[$name];
                 } elseif (!is_array($params[$name])) {//如果不是数组,直接返回传入的参数中对应的结果
                     $args[] = $actionParams[$name] = $params[$name];
                 } else {
                     throw new BadRequestHttpException(Yii::t('yii', 'Invalid data received for parameter "{param}".', [
                         'param' => $name,
                     ]));
                 }
                 unset($params[$name]);
             } elseif ($param->isDefaultValueAvailable()) { //如果默认有默认值取默认值
                 $args[] = $actionParams[$name] = $param->getDefaultValue();
             } else {//action中定义的参数没有在传入的参数中找到,标记的missing中
                 $missing[] = $name;
             }
         }

         if (!empty($missing)) {//action中的参数有缺少,抛出异常
             throw new BadRequestHttpException(Yii::t('yii', 'Missing required parameters: {params}', [
                 'params' => implode(', ', $missing),
             ]));
         }

         $this->actionParams = $actionParams;

         return $args;
     }

     /**
      * @inheritdoc  重写基类的beforeAction
      */
     public function beforeAction($action)
     {
         if (parent::beforeAction($action)) {
             //父类的beforAction方法执行成功后,启动csrf验证功能
             if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) {
                 throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.'));
             }
             return true;
         }

         return false;
     }

     /**
      * Redirects the browser to the specified URL.
      * 重定向方法[[Response::redirect()]]的短方法
      * This method is a shortcut to [[Response::redirect()]].
      *
      * You can use it in an action by returning the [[Response]] directly:
      * 下面的例子是重定向到longin
      * ```php
      * // stop executing this action and redirect to login page
      * return $this->redirect(['login']);
      * ```
      *
      * @param string|array $url the URL to be redirected to. This can be in one of the following formats:
      * @param string|array $url 重定向的URL,有下列三种形式
      *
      * - a string representing a URL (e.g. "http://example.com")
      *   一个字符串URL
      * - a string representing a URL alias (e.g. "@example.com")
      *   别名形式的URL
      * - an array in the format of `[$route, ...name-value pairs...]` (e.g. `['site/index', 'ref' => 1]`)
      *   数组,第一个元素为生成路径的参数,后面的元素为链接中传递的参数
      *   [[Url::to()]] will be used to convert the array into a URL.
      *
      * Any relative URL will be converted into an absolute one by prepending it with the host info
      * of the current request.
      * 如果传入的是相对的url,都会根据当前请求的host info 转换为绝对url
      *
      * @param integer $statusCode the HTTP status code. Defaults to 302.
      * See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html>
      * for details about HTTP status code
      * @return Response the current response object
      */
     public function redirect($url, $statusCode = 302)
     {
         return Yii::$app->getResponse()->redirect(Url::to($url), $statusCode);
     }

     /**
      * Redirects the browser to the home page.
      * 重定向到首页
      *
      * You can use this method in an action by returning the [[Response]] directly:
      *
      * ```php
      * // stop executing this action and redirect to home page
      * return $this->goHome();
      * ```
      *
      * @return Response the current response object
      */
     public function goHome()
     {
         return Yii::$app->getResponse()->redirect(Yii::$app->getHomeUrl());
     }

     /**
      * Redirects the browser to the last visited page.
      * 返回上一页
      *
      * You can use this method in an action by returning the [[Response]] directly:
      *
      * ```php
      * // stop executing this action and redirect to last visited page
      * return $this->goBack();
      * ```
      *
      * For this function to work you have to [[User::setReturnUrl()|set the return URL]] in appropriate places before.
      *
      * @param string|array $defaultUrl the default return URL in case it was not set previously.
      * If this is null and the return URL was not set previously, [[Application::homeUrl]] will be redirected to.
      * Please refer to [[User::setReturnUrl()]] on accepted format of the URL.
      * @return Response the current response object
      * @see User::getReturnUrl()
      */
     public function goBack($defaultUrl = null)
     {
         return Yii::$app->getResponse()->redirect(Yii::$app->getUser()->getReturnUrl($defaultUrl));
     }

     /**
      * Refreshes the current page.
      * 刷新页面
      * This method is a shortcut to [[Response::refresh()]].
      *
      * You can use it in an action by returning the [[Response]] directly:
      *
      * ```php
      * // stop executing this action and refresh the current page
      * return $this->refresh();
      * ```
      *
      * @param string $anchor the anchor that should be appended to the redirection URL.
      * Defaults to empty. Make sure the anchor starts with '#' if you want to specify it.
      * @return Response the response object itself
      */
     public function refresh($anchor = '')
     {
         return Yii::$app->getResponse()->redirect(Yii::$app->getRequest()->getUrl() . $anchor);
     }
 }

Yii源码阅读笔记(二十八)的更多相关文章

  1. Yii源码阅读笔记(十八)

    View中的查找视图文件方法和渲染文件方法 /** * Finds the view file based on the given view name. * 通过view文件名查找view文件 * ...

  2. Yii源码阅读笔记(十二)

    Action类,控制器中方法的基类: namespace yii\base; use Yii; /** * Action is the base class for all controller ac ...

  3. Yii源码阅读笔记(十五)

    Model类,集中整个应用的数据和业务逻辑——验证 /** * Returns the attribute labels. * 返回属性的标签 * * Attribute labels are mai ...

  4. Yii源码阅读笔记(十六)

    Model类,集中整个应用的数据和业务逻辑—— /** * Generates a user friendly attribute label based on the give attribute ...

  5. Yii源码阅读笔记(十四)

    Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...

  6. Yii源码阅读笔记(十)

    控制器类,所有控制器的基类,用于调用模型和布局,输出到视图 namespace yii\base; use Yii; /** * Controller is the base class for cl ...

  7. Yii源码阅读笔记(十九)

    View中渲染view视图文件的前置和后置方法,以及渲染动态内容的方法: /** * @return string|boolean the view file currently being rend ...

  8. Yii源码阅读笔记(一)

    今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...

  9. werkzeug源码阅读笔记(二) 下

    wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...

  10. werkzeug源码阅读笔记(二) 上

    因为第一部分是关于初始化的部分的,我就没有发布出来~ wsgi.py----第一部分 在分析这个模块之前, 需要了解一下WSGI, 大致了解了之后再继续~ get_current_url()函数 很明 ...

随机推荐

  1. zjoi2016 day1【bzoj4455】【bzoj4456】

    首先做了T2的旅行者,看到bz上面过的人数比较多.. 考试的时候完全没有想太多.一闪而过了分块思想,然后就没有然后了.. 大视野上面有题解,竟然是一个初中生写的..? 正解其实是“分治”,每次选择中轴 ...

  2. Python基础3- 变量与数字

    1.Python变量不需要声明,其赋值操作既是变量声明和定义的过程;2.Python中每个变量在使用前都必须赋值,变量赋值后该变量才会被创建;3.Python变量是存储内存中的值,若变量赋值时内存中存 ...

  3. uva 11636

    #include <cstdio> #include <cstring> #include <iostream> using namespace std; int ...

  4. putty ssh连接老断

    有两种方法来解决:一. 配置客户端 1 在 linux下的ssh命令:vim /etc/ssh/ssh_config 然后找到里面的ServerAliveInterval 参数,如果没有你同样自己加一 ...

  5. 测试Centos硬盘读写速度

    yum install hdparm 参数:  -a<快取分区>   设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定.  -A<0或1& ...

  6. ACM 找点

    找点 时间限制:2000 ms  |  内存限制:65535 KB 难度:2   描述 上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点.但是这几天LYH太忙了,你 ...

  7. ACM: 继续畅通工程-并查集-最小生成树-解题报告

    继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...

  8. UVA 11609 - Teams(二项式系数)

    题目链接 想了一会,应该是跟二项式系数有关系,无奈自己推的式子,构不成二项式的系数. 选1个人Cn1*1,选2个人Cn2*2....这样一搞,以为还要消项什么的... 搜了一下题解,先选队长Cn1,选 ...

  9. 期望dp BZOJ3450+BZOJ4318

    BZOJ3450 概率期望DP f[i]表示到i的期望得分,g[i]表示到i的期望长度. 分三种情况转移: ① s[i]=‘x’:f[i]=f[i-1],g[i]=0 ② s[i]=‘o’:f[i]= ...

  10. (转)KeyDown、KeyUp、KeyPress区别

    Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入. 1.按键的类型 Windows窗体将键盘输入标 ...