From 8293e4d9d76f9d00986476ac4e67aa3ea45af771 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Wed, 16 Oct 2013 20:27:18 -0400 Subject: [PATCH] Refactored getModule and hasModule. --- framework/yii/base/Module.php | 56 +++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/framework/yii/base/Module.php b/framework/yii/base/Module.php index a85e249..7c29a8b 100644 --- a/framework/yii/base/Module.php +++ b/framework/yii/base/Module.php @@ -326,55 +326,47 @@ abstract class Module extends Component } /** - * Checks whether the named module exists. - * @param string $id module ID + * 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 (strpos($id, '/') === false) { - return isset($this->_modules[$id]); + if (($pos = strpos($id, '/')) !== false) { + // sub-module + $module = $this->getModule(substr($id, 0, $pos)); + return $module === null ? false : $module->hasModule(substr($id, $pos + 1)); } else { - // it's a sub-module - $ids = explode('/', $id); - $module = $this; - foreach ($ids as $id) { - if (!isset($module->_modules[$id])) { - return false; - } - $module = $module->getModule($id); - } - return true; + return isset($this->_modules[$id]); } } /** - * Retrieves the named module. - * @param string $id module ID (case-sensitive). + * Retrieves the child module of the specified ID. + * This method supports retrieving both child modules and grand child modules. + * @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 whether to load the module if it is not yet loaded. * @return Module|null the module instance, null if the module does not exist. * @see hasModule() */ public function getModule($id, $load = true) { - if (strpos($id, '/') === false) { - if (isset($this->_modules[$id])) { - if ($this->_modules[$id] instanceof Module) { - return $this->_modules[$id]; - } elseif ($load) { - Yii::trace("Loading module: $id", __METHOD__); - return $this->_modules[$id] = Yii::createObject($this->_modules[$id], $id, $this); - } - } - } else { - // it's a sub-module - $ids = explode('/', $id); - $module = $this; - foreach ($ids as $id) { - $module = $module->getModule($id); + if (($pos = strpos($id, '/')) !== false) { + // sub-module + $module = $this->getModule(substr($id, 0, $pos)); + return $module === null ? null : $module->getModule(substr($id, $pos + 1), $load); + } + + if (isset($this->_modules[$id])) { + if ($this->_modules[$id] instanceof Module) { + return $this->_modules[$id]; + } elseif ($load) { + Yii::trace("Loading module: $id", __METHOD__); + return $this->_modules[$id] = Yii::createObject($this->_modules[$id], $id, $this); } - return $module; } return null; }