yii2源码学习笔记(十五)
Posted dragon16
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii2源码学习笔记(十五)相关的知识,希望对你有一定的参考价值。
这几天有点忙今天好些了,继续上次的module来吧
1 /** 2 * Returns the directory that contains the controller classes according to [[controllerNamespace]]. 3 *根据控制器的命名空间返回控制器的目录路径 4 * Note that in order for this method to return a value, you must define 5 * an alias for the root namespace of [[controllerNamespace]]. 6 * 为了使该方法返回正确的值,必须为[[controllerNamespace]]定义一个根别名 7 * @return string the directory that contains the controller classes. 8 * @throws InvalidParamException if there is no alias defined for the root namespace of [[controllerNamespace]]. 9 */ 10 public function getControllerPath() 11 { 12 //通过将命名空间转换为路径构造别名路径,然后通过getAlias方法取得控制器的绝对路径 13 return Yii::getAlias(‘@‘ . str_replace(‘\\‘, ‘/‘, $this->controllerNamespace)); 14 } 15 16 /** 17 * Returns the directory that contains the view files for this module. 18 * 取得当前模块的视图文件目录路径 19 * @return string the root directory of view files. Defaults to "[[basePath]]/views". 20 */ 21 public function getViewPath() 22 { 23 if ($this->_viewPath !== null) { 24 return $this->_viewPath; 25 } else { 26 //getBasePath()返回当前模块的根路径,然后拼接出视图文件路径 27 return $this->_viewPath = $this->getBasePath() . DIRECTORY_SEPARATOR . ‘views‘; 28 } 29 } 30 31 /** 32 * Sets the directory that contains the view files.设置视图文件目录路径 33 * @param string $path the root directory of view files. 34 * @throws InvalidParamException if the directory is invalid 35 */ 36 public function setViewPath($path) 37 { 38 $this->_viewPath = Yii::getAlias($path); 39 } 40 41 /** 42 * Returns the directory that contains layout view files for this module. 43 * 取得当前模块的布局文件路径 44 * @return string the root directory of layout files. Defaults to "[[viewPath]]/layouts". 45 */ 46 public function getLayoutPath() 47 { 48 if ($this->_layoutPath !== null) { 49 return $this->_layoutPath; 50 } else {//getBasePath()返回当前模块的根路径,然后拼接出布局文件目录路径 51 return $this->_layoutPath = $this->getViewPath() . DIRECTORY_SEPARATOR . ‘layouts‘; 52 } 53 } 54 55 /** 56 * Sets the directory that contains the layout files.设置当前模块的布局文件路径 57 * @param string $path the root directory or path alias of layout files. 58 * @throws InvalidParamException if the directory is invalid 59 */ 60 public function setLayoutPath($path) 61 { 62 $this->_layoutPath = Yii::getAlias($path); 63 } 64 65 /** 66 * Defines path aliases. 定义路径别名 67 * This method calls [[Yii::setAlias()]] to register the path aliases. 68 * This method is provided so that you can define path aliases when configuring a module. 69 * 通过调用[[Yii::setAlias()]]注册路径别名,方便在配置模块的时候定义路径别名 70 * @property array list of path aliases to be defined. The array keys are alias names 71 * (must start with ‘@‘) and the array values are the corresponding paths or aliases. 72 * See [[setAliases()]] for an example. 73 * @param array $aliases list of path aliases to be defined. The array keys are alias names 74 * (must start with ‘@‘) and the array values are the corresponding paths or aliases. 75 * For example, 76 * 77 * ~~~ 78 * [ 79 * ‘@models‘ => ‘@app/models‘, // an existing alias 80 * ‘@backend‘ => __DIR__ . ‘/../backend‘, // a directory 81 * ] 82 * ~~~ 83 */ 84 public function setAliases($aliases) 85 { 86 foreach ($aliases as $name => $alias) { 87 Yii::setAlias($name, $alias);//调用[[Yii::setAlias()]]路径别名 88 } 89 } 90 91 /** 92 * Checks whether the child module of the specified ID exists. 93 * This method supports checking the existence of both child and grand child modules. 94 * @param string $id module ID. For grand child modules, use ID path relative to this module (e.g. `admin/content`). 95 * @return boolean whether the named module exists. Both loaded and unloaded modules 96 * are considered. 97 */ 98 public function hasModule($id) 99 { 100 if (($pos = strpos($id, ‘/‘)) !== false) { 101 // sub-module 如果模块ID格式为 `admin/content` 取出当前模块的子模块 102 $module = $this->getModule(substr($id, 0, $pos)); 103 //如果没有取到,返回false 104 return $module === null ? false : $module->hasModule(substr($id, $pos + 1)); 105 } else { 106 //模块ID没有父模块的情况,直接判断_modules数组中是否有值 107 return isset($this->_modules[$id]); 108 } 109 } 110 111 /** 112 * Retrieves the child module of the specified ID.取出指定模块的子模块 113 * This method supports retrieving both child modules and grand child modules. 114 * 该方法支持检索子模块和子模块的子模块 115 * @param string $id module ID (case-sensitive). To retrieve grand child modules, 116 * use ID path relative to this module (e.g. `admin/content`). 117 * 检索子模块,使用标识路径相对 118 * @param boolean $load whether to load the module if it is not yet loaded. 是否加载模块 119 * @return Module|null the module instance, null if the module does not exist. 不存在删除 120 * @see hasModule() 121 */ 122 public function getModule($id, $load = true) 123 { 124 if (($pos = strpos($id, ‘/‘)) !== false) { 125 // sub-module 判断模块id格式是否为 `admin/content` 取子模块 126 $module = $this->getModule(substr($id, 0, $pos)); 127 128 return $module === null ? null : $module->getModule(substr($id, $pos + 1), $load); 129 } 130 131 if (isset($this->_modules[$id])) { 132 if ($this->_modules[$id] instanceof Module) { 133 return $this->_modules[$id];//如果_modules数组中有该模块,直接返回该模块 134 } elseif ($load) {//否则,先实例化后返回 135 Yii::trace("Loading module: $id", __METHOD__); 136 /* @var $module Module */ 137 $module = Yii::createObject($this->_modules[$id], [$id, $this]); 138 $module->setInstance($module); 139 return $this->_modules[$id] = $module; 140 } 141 } 142 //不存在,返回null 143 return null; 144 } 145 146 /** 147 * Adds a sub-module to this module. 为当前模块添加子模块 148 * @param string $id module ID 模块标识 149 * @param Module|array|null $module the sub-module to be added to this module. This can 150 * be one of the followings: 151 * 152 * - a [[Module]] object 153 * - a configuration array: when [[getModule()]] is called initially, the array 154 * will be used to instantiate the sub-module 155 * - null: the named sub-module will be removed from this module 156 */ 157 public function setModule($id, $module) 158 { 159 if ($module === null) { 160 //为空删除 161 unset($this->_modules[$id]); 162 } else {//存在则添加 163 $this->_modules[$id] = $module; 164 } 165 }
以上是关于yii2源码学习笔记(十五)的主要内容,如果未能解决你的问题,请参考以下文章