Module类中的辅助功能方法:

     /**
      * Returns an ID that uniquely identifies this module among all modules within the current application.
      * 返回模块的唯一标识
      * Note that if the module is an application, an empty string will be returned.
      * @return string the unique ID of the module.
      */
     public function getUniqueId()
     {
         //三元运算符,如果当前模块有父模块,则返回[父模块ID/当前模块ID]的格式作为唯一ID,否则只返回当前模块ID
         return $this->module ? ltrim($this->module->getUniqueId() . '/' . $this->id, '/') : $this->id;
     }

     /**
      * Returns the root directory of the module.
      * 返回当前模块的根路径
      * It defaults to the directory containing the module class file.
      * @return string the root directory of the module.
      */
     public function getBasePath()
     {
         if ($this->_basePath === null) {
             $class = new \ReflectionClass($this);//生成当前类的反射对象
             $this->_basePath = dirname($class->getFileName());//getFileName()取得类定义的路径
         }

         return $this->_basePath;
     }

     /**
      * Sets the root directory of the module.
      * 设置当前模块的根路径
      * This method can only be invoked at the beginning of the constructor.
      * @param string $path the root directory of the module. This can be either a directory name or a path alias.
      * @throws InvalidParamException if the directory does not exist.
      */
     public function setBasePath($path)
     {
         $path = Yii::getAlias($path);
         $p = realpath($path);
         if ($p !== false && is_dir($p)) {
             $this->_basePath = $p;
         } else {
             throw new InvalidParamException("The directory does not exist: $path");
         }
     }

     /**
      * Returns the directory that contains the controller classes according to [[controllerNamespace]].
      * 根据控制器的命名空间返回控制器的目录路径
      * Note that in order for this method to return a value, you must define
      * an alias for the root namespace of [[controllerNamespace]].
      * 为了使该方法返回正确的值,必须为[[controllerNamespace]]定义一个根别名
      * @return string the directory that contains the controller classes.
      * @throws InvalidParamException if there is no alias defined for the root namespace of [[controllerNamespace]].
      */
     public function getControllerPath()
     {
         //通过将命名空间转换为路径构造别名路径,然后通过getAlias方法取得控制器的绝对路径
         return Yii::getAlias('@' . str_replace('\\', '/', $this->controllerNamespace));
     }

     /**
      * Returns the directory that contains the view files for this module.
      * 取得当前模块的视图文件目录路径
      * @return string the root directory of view files. Defaults to "[[basePath]]/views".
      */
     public function getViewPath()
     {
         if ($this->_viewPath === null) {
             $this->_viewPath = $this->getBasePath() . DIRECTORY_SEPARATOR . 'views';//getBasePath()返回当前模块的根路径,然后拼接出视图文件路径
         }
         return $this->_viewPath;
     }

     /**
      * Sets the directory that contains the view files.
      * 设置视图文件目录路径
      * @param string $path the root directory of view files.
      * @throws InvalidParamException if the directory is invalid
      */
     public function setViewPath($path)
     {
         $this->_viewPath = Yii::getAlias($path);
     }

     /**
      * Returns the directory that contains layout view files for this module.
      * 取得当前模块的布局文件路径
      * @return string the root directory of layout files. Defaults to "[[viewPath]]/layouts".
      */
     public function getLayoutPath()
     {
         if ($this->_layoutPath === null) {
             $this->_layoutPath = $this->getViewPath() . DIRECTORY_SEPARATOR . 'layouts';//getBasePath()返回当前模块的根路径,然后拼接出布局文件目录路径
         }

         return $this->_layoutPath;
     }

     /**
      * Sets the directory that contains the layout files.
      * 设置当前模块的布局文件路径
      * @param string $path the root directory or path alias of layout files.
      * @throws InvalidParamException if the directory is invalid
      */
     public function setLayoutPath($path)
     {
         $this->_layoutPath = Yii::getAlias($path);
     }

     /**
      * Defines path aliases.
      * 定义路径别名
      * This method calls [[Yii::setAlias()]] to register the path aliases.
      * This method is provided so that you can define path aliases when configuring a module.
      * 通过调用[[Yii::setAlias()]]注册路径别名,方便在配置模块的时候定义路径别名
      * @property array list of path aliases to be defined. The array keys are alias names
      * (must start with '@') and the array values are the corresponding paths or aliases.
      * See [[setAliases()]] for an example.
      * @param array $aliases list of path aliases to be defined. The array keys are alias names
      * (must start with '@') and the array values are the corresponding paths or aliases.
      * For example,
      * 传入测参数的格式,键名为别名名称,以@开始,键值为对应的路径
      * ```php
      * [
      *     '@models' => '@app/models', // an existing alias
      *     '@backend' => __DIR__ . '/../backend',  // a directory
      * ]
      * ```
      */
     public function setAliases($aliases)
     {
         foreach ($aliases as $name => $alias) {
             Yii::setAlias($name, $alias);//调用[[Yii::setAlias()]]注册路径别名
         }
     }

     /**
      * Checks whether the child module of the specified ID exists.
      * This method supports checking the existence of both child and grand child modules.
      * @param string $id module ID. For grand child modules, use ID path relative to this module (e.g. `admin/content`).
      * @return boolean whether the named module exists. Both loaded and unloaded modules
      * are considered.
      */
     public function hasModule($id)
     {
         if (($pos = strpos($id, '/')) !== false) {//如果模块ID格式为 `admin/content`
             // sub-module
             $module = $this->getModule(substr($id, 0, $pos));//取出当前模块的子模块

             return $module === null ? false : $module->hasModule(substr($id, $pos + 1));//如果没有取到,返回false,否则判断子模块的子模块
         } else {//模块ID没有父模块的情况,直接判断_modules数组中是否有值
             return isset($this->_modules[$id]);
         }
     }

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

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

    Model类,集中整个应用的数据和业务逻辑: namespace yii\base; use Yii; use ArrayAccess; use ArrayObject; use ArrayItera ...

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

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

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

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

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

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

  5. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...

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

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

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

    ServiceLocator,服务定位类,用于yii2中的依赖注入,通过以ID为索引的方式缓存服务或则组件的实例来定位服务或者组件: namespace yii\di; use Yii; use Cl ...

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

    web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...

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

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

随机推荐

  1. http://www.cnblogs.com/baizhanshi/p/5593431.html

    http://www.cnblogs.com/baizhanshi/p/5593431.html

  2. dotnet core 初试两个小问题解决

    1. Setup has detected that visual studio 2015 update 3 may not be completely installed 在安装 DotNetCor ...

  3. ASP.NET MVC中使用highcharts 生成简单的折线图

        直接上步骤:   生成一个options,选项包含了一些基本的配置,如标题,坐标刻度,serial等: 配置X轴显示的Category数据,为一个数组: 配置Y轴显示的数据,也为一个数据: 用 ...

  4. Windows下安装Docker

    放在三年前,你不认识Docker情有可原,但如果现在你还这么说,不好意思,只能说明你OUT了,行动起来吧骚年,很可能你们公司或者你即将要去的公司,或者你想去的公司很可能就会引入Docker,或者已经引 ...

  5. BZOJ3764 : Petya的序列

    首先如果一段连续子序列里没有任何幸运数,那么显然可以缩成一个点. 设幸运数个数为$m$,那么现在序列长度是$O(m)$的,考虑暴力枚举$R_1$,然后从右往左枚举$L_1$. 每次碰到一个幸运数,就将 ...

  6. eclipse svn proxy

    C:\Users\userName\AppData\Roaming\Subversion下的servers文件, 将#http-proxy-host和#http-proxy-port这两行前面的#号去 ...

  7. JavaScript实现存储HTML字符串

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  8. topcoder SRM 622 DIV2 FibonacciDiv2

    关于斐波那契数列,由于数据量比较小, 直接打表了,代码写的比较戳 #include <iostream> #include <vector> #include <algo ...

  9. ACM 田忌赛马

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Here is a famous story in Chinese history. "That ...

  10. ACM 取石子(七)

    取石子(七) 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈,Yougth和Hrdv分别从其中取石子,谁先取完 ...