学习yii2.0框架阅读代码(二十)

vendor/yiisoft/yii2/base/Module. php(续)

   /**
     * 新建一个控制器实例基于给定的路线.
     *
     * 路线应该是相对于这个模块。该方法实现了以下算法
     * to resolve the given route:
     *
     * 1. If the route is empty, use [[defaultRoute]];
     * 2. If the first segment of the route is a valid module ID as declared in [[modules]],
     *    call the module‘s `createController()` with the rest part of the route;
     * 3. If the first segment of the route is found in [[controllerMap]], create a controller
     *    based on the corresponding configuration found in [[controllerMap]];
     * 4. The given route is in the format of `abc/def/xyz`. Try either `abc\DefController`
     *    or `abc\def\XyzController` class within the [[controllerNamespace|controller namespace]].
     *
     * If any of the above steps resolves into a controller, it is returned together with the rest
     * part of the route which will be treated as the action ID. Otherwise, false will be returned.
     *
     * @param string $route the route consisting of module, controller and action IDs.
     * @return array|boolean If the controller is created successfully, it will be returned together
     * with the requested action ID. Otherwise false will be returned.
     * @throws InvalidConfigException if the controller class and its file do not match.
     */
    public function createController($route)
    {
        if ($route === ‘‘) {
            $route = $this->defaultRoute;
        }

        // double slashes or leading/ending slashes may cause substr problem
        // 如果有双斜线或者结束的斜线,可能会引起问题
        $route = trim($route, ‘/‘);
        if (strpos($route, ‘//‘) !== false) {
            return false;
        }

        if (strpos($route, ‘/‘) !== false) {
            // 如果存在斜线,就根据斜线分割route,并限制最多分割成两个
            list ($id, $route) = explode(‘/‘, $route, 2);
        } else {
            // 不存在,就直接赋值给$id
            $id = $route;
            $route = ‘‘;
        }

        // module and controller map take precedence
        if (isset($this->controllerMap[$id])) {
            // 如果controllerMap中存在相应的$id,就使用Yii::createObject去创建该controller的实例
            $controller = Yii::createObject($this->controllerMap[$id], [$id, $this]);
            return [$controller, $route];
        }
        // 根据id获取module
        $module = $this->getModule($id);
        if ($module !== null) {
            // 获取到module,就递归调用相应module的createController去创建controller的实例
            return $module->createController($route);
        }

        // 如果取到了module,就需要继续去取controller的ID
        // 再次根据斜线分割
        if (($pos = strrpos($route, ‘/‘)) !== false) {
            // 如果有斜线,就将module的ID和后面截取出的内容一起拼成ID
            $id .= ‘/‘ . substr($route, 0, $pos);
            // 剩余的赋给route
            $route = substr($route, $pos + 1);
        }

        // 然后根据ID去创建controller的实例
        $controller = $this->createControllerByID($id);
        // 未创建成功,并且route不为空
        if ($controller === null && $route !== ‘‘) {
            // 将route拼接到ID中,再次去创建controller出的实例
            $controller = $this->createControllerByID($id . ‘/‘ . $route);
            $route = ‘‘;
        }

        return $controller === null ? false : [$controller, $route];
    }
时间: 2024-10-08 10:34:55

学习yii2.0框架阅读代码(二十)的相关文章

学习yii2.0框架阅读代码(二十一)

vendor/yiisoft/yii2/base/Module.php(完) /** * 创建一个控制器基于给定控制器ID. * * The controller ID is relative to this module. The controller class * should be namespaced under [[controllerNamespace]]. * * Note that this method does not check [[modules]] or [[cont

学习yii2.0框架阅读代码(二)

阅读入口文件 <?php //是否运行在调试模式下,如果已经定义了Yii_DEBUG, 则or后面的语句将不会执行 defined('YII_DEBUG') or define('YII_DEBUG', true); //部署当前环境,dev prod 是安装后默认的两个环境,分别表示开发环境和最终的成品环境.此外还有一个 test 环境,表示测试环境. defined('YII_ENV') or define('YII_ENV', 'dev'); // 注册 Composer 自动加载器 re

学习yii2.0框架阅读代码(十二)

先把Object.Component.Module三个核心搞清楚了在写实例 下面介绍一下Object -- Yii最基础的类,大多数类都继承了该类.常用的12个公共方法,有点类似于ThinkPHP里面的魔术方法. <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/

学习yii2.0框架阅读代码(十五)

行为是 yii\base\Behavior 或其子类的实例.行为,也称为mixins,可以无须改变类继承关系即可增强一个已有的 yii\base\Component 类功能.当行为附加到组件后,它将“注入”它的方法和属性到组件,然后可以像访问组件内定义的方法和属性一样访问它们.此外,行为通过组件能响应被触发的事件,从而自定义或调整组件正常执行的代码. <?php namespace yii\base; /** * 行为是所有行为类的基类. * * 一个行为可以用来增强现有的功能组件,无需修改其代

学习yii2.0框架阅读代码(十九)

vendor/yiisoft/yii2/base/Module. php(续) /** * 检索指定的子模块ID. * 这种方法支持检索两个子模块和子模块. * @param string $id module ID (case-sensitive). To retrieve grand child modules, * use ID path relative to this module (e.g. `admin/content`). * @param boolean $load wheth

学习yii2.0框架阅读代码(十八)

vendor/yiisoft/yii2/base/Module. php /** * 返回一个ID,惟一标识此模块在所有模块在当前应用程序. * @return string the unique ID of the module. */ public function getUniqueId() { //如果该模块是一个应用程序,将返回一个空字符串. return $this->module ? ltrim($this->module->getUniqueId() . '/' . $t

学习yii2.0框架阅读代码(十)

vendor/yiisoft/yii2/base/Module. <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; use yii\di\ServiceLocator; /** * 模块和应用程序类

学习yii2.0框架阅读代码(十六)

yii\base\InlineAction 追踪一个命令行请求的过程 namespace yii\base; use Yii; /** * InlineAction表示一个动作被定义为一个控制器的方法. * * The name of the controller method is available via [[actionMethod]] which * is set by the [[controller]] who creates this action. * * @author Qi

学习yii2.0框架阅读代码(十四)

组件(Component) 事件Event(温习) <?php namespace yii\base; //事件是所有事件类的基类.它封装了参数与事件相关联. //如果一个事件处理程序集[[进行]]是真的,其余的,uninvoked处理程序将不再被称为处理事件. //另外,添加一个事件处理程序时,额外的数据可能被传递和可以通过[[数据]]属性调用事件处理程序时. class Event extends Object { /** * @var string the event name. This