老刘 Yii 2 源码学习笔记之 Module 类 [ 2.0 版本 ]
类图
从上图可以看出 Application 类继承了 Module,在框架中的是非常重要角色。
加载配置
public function setModules($modules)
{
foreach ($modules as $id => $module) {
$this->_modules[$id] = $module;
}
}
base\Module 通过 setModules 把 Module 配置信息加载进来,赋值给 私有变量 _modules。
解析路由
Module 还有一个重要的功能,就是找到路由中的 Controller
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) {
list($id, $route) = explode('/', $route, 2);
} else {
$id = $route;
$route = '';
}
// module and controller map take precedence
if (isset($this->controllerMap[$id])) {
$controller = Yii::createObject($this->controllerMap[$id], [$id, $this]);
return [$controller, $route];
}
$module = $this->getModule($id);
if ($module !== null) {
return $module->createController($route);
}
if (($pos = strrpos($route, '/')) !== false) {
$id .= '/' . substr($route, 0, $pos);
$route = substr($route, $pos + 1);
}
$controller = $this->createControllerByID($id);
if ($controller === null && $route !== '') {
$controller = $this->createControllerByID($id . '/' . $route);
$route = '';
}
return $controller === null ? false : [$controller, $route];
}
这个函数通过递归调用。假如路由是这样的:forum/admin/default/index
- 第一次递归会把路由字符串的 forum 过滤掉,还剩 admin/default/index
- 第二次 default/index
- 第三次 由于 default 不是 Module, 通过 Module 的 init 方法知道当时的命名空间,所以就可以推断出 Controller 位置。
总结
Module 的 getModule 方法 和 createController 方法 都是通过递归调用,层层剥离,设计精巧、简洁。
liuzhang
注册时间:2011-09-13
最后登录:2024-08-19
在线时长:89小时14分
最后登录:2024-08-19
在线时长:89小时14分
- 粉丝17
- 金钱9590
- 威望30
- 积分10780
热门源码
- 基于 Yii 2 + Bootstrap 3 搭建一套后台管理系统 CMF
- 整合完 yii2-rbac+yii2-admin+adminlte 等库的基础开发后台源码
- 适合初学者学习的一款通用的管理后台
- yii-goaop - 将 goaop 集成到 Yii,在 Yii 中优雅的面向切面编程
- yii-log-target - 监控系统异常且多渠道发送异常信息通知
- 店滴云1.3.0
- 面向对象的一小步:添加 ActiveRecord 的 Scope 功能
- Yii2 开源商城 FecShop
- 基于 Yii2 开发的多店铺商城系统,免费开源 + 适合二开
- leadshop - 基于 Yii2 开发的一款免费开源且支持商业使用的商城管理系统
共 0 条评论