Action类,控制器中方法的基类:

 namespace yii\base;

 use Yii;

 /**
  * Action is the base class for all controller action classes.
  * Action是所有控制器方法的基类
  * Action provides a way to reuse action method code. An action method in an Action
  * class can be used in multiple controllers or in different projects.
  * Action提供了一种重用代码的方法,一个Action类中的方法可以被多个控制器或不同的项目调用
  * Derived classes must implement a method named `run()`. This method
  * will be invoked by the controller when the action is requested.
  * 驱动类必须实现run()方法,该方法在action被请求的时候被控制器调用
  * The `run()` method can have parameters which will be filled up
  * with user input values automatically according to their names.
  * 如果请求带有参数,run方法会自动带参数运行,例如:
  * For example, if the `run()` method is declared as follows:
  *
  * ```php
  * public function run($id, $type = 'book') { ... }
  * ```
  *
  * And the parameters provided for the action are: `['id' => 1]`.
  * Then the `run()` method will be invoked as `run(1)` automatically.
  *
  * @property string $uniqueId The unique ID of this action among the whole application. This property is
  * read-only.
  *
  * @author Qiang Xue <qiang.xue@gmail.com>
  * @since 2.0
  */
 class Action extends Component
 {
     /**
      * @var action的ID
      */
     public $id;
     /**
      * @var Controller|\yii\web\Controller 当前action的控制器
      */
     public $controller;

     /**
      * Constructor.
      * 构造函数,用于初始化action 的ID和控制器,并且调用component的构造方法初始化对象
      *
      * @param string $id the ID of this action
      * @param Controller $controller the controller that owns this action
      * @param array $config name-value pairs that will be used to initialize the object properties
      */
     public function __construct($id, $controller, $config = [])
     {
         $this->id = $id;
         $this->controller = $controller;
         parent::__construct($config);
     }

     /**
      * Returns the unique ID of this action among the whole application.
      * 用于取得当前action的唯一ID  形式为controller ID/action ID
      * @return string the unique ID of this action among the whole application.
      */
     public function getUniqueId()
     {
         return $this->controller->getUniqueId() . '/' . $this->id;
     }

     /**
      * Runs this action with the specified parameters.
      * This method is mainly invoked by the controller.
      * 用指定的参数运行,该方法主要被控制器调用
      *
      * @param array $params the parameters to be bound to the action's run() method.
      * @return mixed the result of the action
      * @throws InvalidConfigException if the action class does not have a run() method
      */
     public function runWithParams($params)
     {
         if (!method_exists($this, 'run')) {//如果run方法不存在,抛出异常
             throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.');
         }
         $args = $this->controller->bindActionParams($this, $params);//绑定参数
         Yii::trace('Running action: ' . get_class($this) . '::run()', __METHOD__);//记录trace信息
         if (Yii::$app->requestedParams === null) {
             Yii::$app->requestedParams = $args;//如果是命令行运行,按命令行方式获取参数
         }
         if ($this->beforeRun()) {//调用run的前置操作
             $result = call_user_func_array([$this, 'run'], $args);//用php内置函数带参数执行run方法
             $this->afterRun();//调用后置操作

             return $result;//返回结果
         } else {
             return null;
         }
     }

     /**
      * This method is called right before `run()` is executed.
      * You may override this method to do preparation work for the action run.
      * If the method returns false, it will cancel the action.
      * run方法的前置方法,通常在子类中重写来实现某些前置功能
      *
      * @return boolean whether to run the action.
      */
     protected function beforeRun()
     {
         return true;
     }

     /**
      * This method is called right after `run()` is executed.
      * You may override this method to do post-processing work for the action run.
      * run方法的后置方法,通常在子类中重写来实现某些后置功能
      *
      */
     protected function afterRun()
     {
     }
 }

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

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

    动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...

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

    Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...

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

    Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...

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

    Module类中获取子模块,注册子模块,实例化控制器,根据路由运行指定控制器方法的注释: /** * Retrieves the child module of the specified ID. * ...

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

    Module类,属性的注释和构造函数的注释: <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) ...

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

    Module类中剩余部分代码,通过控制器ID实例化当前模块的控制器,当前模块的Action方法的前置和后置方法: /** * This method is invoked right before a ...

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

    View中应用布局和缓存内容部分: /** * Begins recording a block. * This method is a shortcut to beginning [[Block]] ...

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

    接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...

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

    Theme 类,即一个应用的主题,主要通过替换路径实现主题的应用,里边的方法为获取根路径和根链接,以及应用主题的方法: namespace yii\base; use Yii; use yii\hel ...

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

    Module类中的辅助功能方法: /** * Returns an ID that uniquely identifies this module among all modules within t ...

随机推荐

  1. List、Map、Set

    这样的题属于随意发挥题:这样的题比较考水平,两个方面的水平:一是要真正明白这些内容,二是要有较强的总结和表述能力.如果你明白,但表述不清楚,在别人那里则等同于不明白. 首先,List与Set具有相似性 ...

  2. Burp Suite详细使用教程

    Burp Suite详细使用教程-Intruder模块详解 最近迷上了burp suite 这个安全工具,百度了关于这个工具的教程还卖900rmb...ohno.本来准备买滴,但是大牛太高傲了,所以没 ...

  3. POJ2407 Relatives(欧拉函数)

    题目问有多少个小于n的正整数与n互质. 这个可以用容斥原理来解HDU4135.事实上这道题就是求欧拉函数$φ(n)$. $$φ(n)=n(1-1/p_1)(1-1/p_2)\dots(1-1/p_m) ...

  4. LianLianKan[HDU4272]

    LianLianKan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. sql 关联查询

    SELECT mms_sample_datas.* from mms_sample_datas where mms_sample_datas.mms_id in ( SELECT mms_sample ...

  6. BZOJ3742 : Painting

    设f[i][j]表示以i为根的子树,i与父亲之间的边染成j的最小代价 DP的过程中转移时相当于求一个最小权匹配,用费用流即可 感觉复杂度飞起来了… #include<cstdio> con ...

  7. Codeforces Round #192 (Div. 2) B. Road Construction

    #include <iostream> #include <vector> using namespace std; int main(){ int n,m; cin > ...

  8. 【BZOJ】1270: [BeijingWc2008]雷涛的小猫(DP+水题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1270 这完全是一眼题啊,但是n^2的时间挺感人.(n^2一下的级别请大神们赐教,我还没学多少dp优化 ...

  9. HDU 4533 威威猫系列故事——晒被子

    题目链接 扫描线可做,然后当时比赛后问虎哥,他说可以标记,然后拖了很久,今天从早上折腾到晚上,终于把两种情况写出来,分析太弱.改天扫描线,再来一次. 被子如果被y = x 穿过,可以分成两部分,上和下 ...

  10. Spring动态配置多数据源

    Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...