• yii2源码学习笔记(十一)


    Controller控制器类,是所有控制器的基类,用于调用模型和布局。

      1 <?php
      2 /**
      3  * @link http://www.yiiframework.com/
      4  * @copyright Copyright (c) 2008 Yii Software LLC
      5  * @license http://www.yiiframework.com/license/
      6  */
      7 
      8 namespace yiibase;
      9 
     10 use Yii;
     11 
     12 /**
     13  * Controller is the base class for classes containing controller logic.
     14  *  控制器,是所用控制器类的基类
     15  * @property Module[] $modules All ancestor modules that this controller is located within. This property is
     16  * read-only.只读属性  当前控制器的所有模块
     17  * @property string $route The route (module ID, controller ID and action ID) of the current request. This
     18  * property is read-only.当前请求的路径  只读属性 可以获取到请求的路径
     19  * @property string $uniqueId The controller ID that is prefixed with the module ID (if any). This property is
     20  * read-only.为前缀的controller ID  唯一标识
     21  * @property View|yiiwebView $view The view object that can be used to render views or view files.
     22  * 视图用来传递视图或视图文件.
     23  * @property string $viewPath The directory containing the view files for this controller. This property is
     24  * read-only. 包含当前控制器的视图目录
     25  *
     26  * @author Qiang Xue <qiang.xue@gmail.com>
     27  * @since 2.0
     28  */
     29 class Controller extends Component implements ViewContextInterface
     30 {
     31     /**
     32      * @event ActionEvent an event raised right before executing a controller action.
     33      * ActionEvent事件提出正确的执行器动作之前执行。
     34      * You may set [[ActionEvent::isValid]] to be false to cancel the action execution.
     35      * 如果对事件的isValid属性设置为false,将取消action的执行
     36      */
     37     const EVENT_BEFORE_ACTION = 'beforeAction';
     38     /**
     39      * @event ActionEvent an event raised right after executing a controller action.
     40      * 在执行controller操作后触发的事件
     41      */
     42     const EVENT_AFTER_ACTION = 'afterAction';
     43 
     44     /**
     45      * @var string the ID of this controller.
     46      * 控制器id
     47      */
     48     public $id;
     49     /**
     50      * @var Module $module the module that this controller belongs to.
     51      * 所属模块
     52      */
     53     public $module;
     54     /**
     55      * @var string the ID of the action that is used when the action ID is not specified
     56      * in the request. Defaults to 'index'.控制器中默认动作,默认为index
     57      */
     58     public $defaultAction = 'index';
     59     /**
     60      * @var string|boolean the name of the layout to be applied to this controller's views.
     61      * 布局的名称 应用到该控制器的视图。
     62      * This property mainly affects the behavior of [[render()]].此属性主要影响[[render()]]行为
     63      * Defaults to null, meaning the actual layout value should inherit that from [[module]]'s layout value.
     64      * If false, no layout will be applied. 
     65      * 如果设置为false,则不使用布局文件
     66      */
     67     public $layout;
     68     /**
     69      * @var Action the action that is currently being executed. This property will be set
     70      * by [[run()]] when it is called by [[Application]] to run an action.
     71      * 当前执行的操作,可在事件中根据这个action来执行不同的操作
     72      */
     73     public $action;
     74 
     75     /**
     76      * @var View the view object that can be used to render views or view files.
     77      * 视图对象,用来定义输出的视图文件
     78      */
     79     private $_view;
     80 
     81 
     82     /**
     83      * @param string $id the ID of this controller.控制器的ID
     84      * @param Module $module the module that this controller belongs to.控制器的模块
     85      * @param array $config name-value pairs that will be used to initialize the object properties.
     86      * 初始化对像时的配置文件
     87      */
     88     public function __construct($id, $module, $config = [])
     89     {
     90         //初始化控制器id,模块,根据配置文件初始化控制器对象
     91         $this->id = $id;
     92         $this->module = $module;
     93         parent::__construct($config);
     94     }
     95 
     96     /**
     97      * Declares external actions for the controller.定义action声明控制器的外部操作
     98      * This method is meant to be overwritten to declare external actions for the controller.
     99      * It should return an array, with array keys being action IDs, and array values the corresponding
    100      * action class names or action configuration arrays. For example,
    101      * 这个方法指定独立的action,返回格式为数组,name为action的id,value为action类的实现,
    102      * ~~~
    103      * return [
    104      *     'action1' => 'appcomponentsAction1',
    105      *     'action2' => [
    106      *         'class' => 'appcomponentsAction2',
    107      *         'property1' => 'value1',
    108      *         'property2' => 'value2',
    109      *     ],
    110      * ];
    111      * ~~~
    112      *
    113      * [[Yii::createObject()]] will be used later to create the requested action
    114      * using the configuration provided here.
    115      * 使用此处提供的配置来创建请求的操作。
    116      */
    117     public function actions()
    118     {
    119         return [];
    120     }
    121 
    122     /**
    123      * Runs an action within this controller with the specified action ID and parameters.
    124      * 控制器中运行指定的操作标识和参数。
    125      * If the action ID is empty, the method will use [[defaultAction]].
    126      * 如果没有定义ID,会调用默认操作
    127      * @param string $id the ID of the action to be executed. 要执行的动作标识。
    128      * @param array $params the parameters (name-value pairs) to be passed to the action.
    129      * 传递给操作的参数。
    130      * @return mixed the result of the action.  操作结果
    131      * @throws InvalidRouteException if the requested action ID cannot be resolved into an action successfully.
    132      * @see createAction()
    133      */
    134     public function runAction($id, $params = [])
    135     {
    136         $action = $this->createAction($id);//创建操作
    137         if ($action === null) {//创建失败,抛出异常
    138             throw new InvalidRouteException('Unable to resolve the request: ' . $this->getUniqueId() . '/' . $id);
    139         }
    140 
    141         Yii::trace("Route to run: " . $action->getUniqueId(), __METHOD__);
    142 
    143         if (Yii::$app->requestedAction === null) {
    144             // 记录当前的操作为requestedAction
    145             Yii::$app->requestedAction = $action;
    146         }
    147 
    148         $oldAction = $this->action;//将操作中的信息保存
    149         $this->action = $action;//写入属性
    150         //保存当前控制器的所有父模块
    151         $modules = [];
    152         $runAction = true;
    153 
    154         // call beforeAction on modules 从外到里一层层执行module的beforeAction
    155         foreach ($this->getModules() as $module) {
    156             if ($module->beforeAction($action)) {
    157                  // 将执行成功的module放入到$modules中,顺序会颠倒
    158                 array_unshift($modules, $module);
    159             } else {
    160                  // 执行失败,就标记一下
    161                 $runAction = false;
    162                 break;
    163             }
    164         }
    165 
    166         $result = null;
    167 
    168         if ($runAction && $this->beforeAction($action)) {
    169             // run the action 执行成功就执行action
    170             $result = $action->runWithParams($params);
    171             // 执行controller本身的afterAction
    172             $result = $this->afterAction($action, $result);
    173 
    174             // call afterAction on modules 从里到外一层层执行所有
    175             foreach ($modules as $module) {
    176                 /* @var $module Module */
    177                 $result = $module->afterAction($action, $result);
    178             }
    179         }
    180 
    181         $this->action = $oldAction;
    182 
    183         return $result;
    184     }

    yii2aseController.php

  • 相关阅读:
    Vue常用特性-表单基本操作和表单修饰符
    Tab选项卡
    Vue模板语法
    Vue基本使用
    Vue概述
    Express框架
    模板引擎artTemplate
    MongoDB增删改查操作
    数据库概述及环境搭建
    请求响应原理及HTTP协议
  • 原文地址:https://www.cnblogs.com/dragon16/p/5557644.html
Copyright © 2020-2023  润新知