概述
皓优企php官网采用经典的MVC架构,并通过伪静态技术实现动态路由。伪静态的优点是搜索引擎能够抓取网页中的动态内容,缺点是性能没有静态网页高,搜索引擎需要等待动态内容生成后才能获得结果。
本文档是通过分析源码逆向形成的一个技术总结,目的在于针对未来的业务变迁或者工作交接,给接手工作者一个快速的可供参考的技术文档,避免重复工作。这份文档本应该由开发者提供,这样才更具参考价值。究竟这些总结是否符合设计者意图,并不完全保证。
1.目录结构
平台页面根目录:zh-groups/application/home
子目录:
controller:控制层
model:模型层
view:视图层
validate:验证规则
common.php:此处定义多页面重用的通用接口。
config.phg:此处定义全局配置,例如:路径别名,模板参数。
database.php:返回空数组,暂不确定具体作用和设计意图。
tag.php:定义php标签参数,此处定义了用于导航的标签。
2.页面结构
MVC的基本调用流程为:当用户发送http请求后,请求会首先进入控制层,控制层根据路由规则进行层层筛选后进入符合规则的控制接口,进入接口后再调用模型层接口,模型层主要处理数据库操作。服务器等待处理结果,并根据处理结果的不同将不同的view层页面返回给用户。
2.1 controller控制层
Base.php
控制层页面的基类,继承自系统Controller类。重写了初始化方法。
核心代码:
public function _initialize()
{
//创建模型层对象,该对象提供数据库访问接口
$common = new CommonModel();
//设置config缓冲区,并从数据库中读取config设置,对应数据库think_config表。
$config = cache('db_config_data');
if (!$config) {
$config = load_config();
cache('db_config_data', $config);
}
config($config);
...
...
}
Activity.php
活动控制类,继承自Base类,为具体实现类。在具体的实现中如需要访问数据库,则调用基类提供的$common对象,该类提供各种数据库访问接口,各个控制类的实现代码和接口都不一样,如需了解,请参考项目代码。
核心代码:
//活动列表
public function activitylist()
{
...
}
//活动详情
public function detail()
{
...
}
//活动申请
public function application()
{
...
}
//活动签到
public function sign ()
{
...
}
其他控制类
代码接口和Activity一样,都是继承自Base类。区别是具体的实现和对外提供的接口不一样,这一部分和业务相关,描述起来较繁杂,只能通过阅读代码去理解。
2.2 Model层
CommonModel.php
提供常规的数据库接口,为主要的数据库操作类。所有控制类都会初始化该类的对象。
其他Model
提供一些特殊的数据库接口,以完成特定功能,较少用到,实现也较简单。
2.3 View层
activity
活动页。
activitylist.html:活动列表
index_activity.html:活动详情
sign.html:活动签到
datatongji
数据统计。
index.html:数据统计主页
page.html:数据报表
default
首页以及相关详情页。
cover目录:首页相关
cover目录中的页面:
index_indexnews.html:新闻详情页
index_indexzhengce.html:惠企政策页
index_jituangaikuang.html:集团概况页
index_shehuizeren.html:社会责任页
index_zhinengpipei.html:智能匹配页
detail目录:详情目录
detail目录中的页面:
index.html:政策咨询详情页
index目录:页面主目录
index目录中的页面:
index.html:首页
list目录:列表相关
list目录中的页面:
index_app.html:移动端APP显示的页面
index_dajiangtang.html:中皓大讲堂列表
index_fuwuchanpin.html:服务产品列表
index_fuwuchanpin_small.html:服务产品小列表(列表项较少)
index_haochanpin.html:皓产品列表
index_kehuanli.html:客户案例列表
index_listnews.html:新闻资讯列表
index_listzhengce.html:惠企政策列表
index_openapp.html:app下载页
index_qiyejiayuan.html:企业家园列表
index_rongyuzizhi.html:荣誉资质列表
index_zhuanjialiebiao.html:专家列表
page目录:详情页目录
page目录中的页面:
index_dajiatangxiangqingye.html:大讲堂详情页
index_haochanpinxiangqing.html:皓产品详情页
index_jiayuanxiangqing.html:家园详情页
index_kehuanlixiangqingye.html:客户案例详情页
index_news.html:新闻详情页
index_pageprouduct.html:产品详情页
index_rongyuzizhineirong.html:荣誉资质内容
index_yulan.html:图片预览
index_zhuanjiaxiangqingye.html:专家详情页
index_zigongsi.html:子公司详情页
public目录:公共模板页
public目录中的页面:
footer.html:页脚
header.html:页头
liuyan.html:留言编辑区
nav.html:导航栏
pinglun.html:评论区
reglogin.html:注册登录
index
index目录中的页面:
gb.html:贯标详情页
xmsb.html:项目申报详情页
liuyan
留言
liuyan目录中的页面:
index.html:留言页面
live
直播
live目录中的页面:
index.html:直播列表页面
article.html:直播详情页
message
消息
message目录中的页面:
index.html:消息列表页面
order
order目录中的页面:
index.html:订单页面
process
订单处理
process目录中的页面:
generateorder.html:生成订单页面
purchase.html:商品详情页面
verification.html:订单提交页面
public
公共页
public目录中的页面:
error.html:错误提示页面
success.html:成功提示页面
2.4 Validate层
ActivityValidate.php:活动规则验证
LiuyanValidate.php:留言规则验证
3.伪静态技术
搜索引擎通常只对静态网页进行检索,而动态页面需要等待服务器编译生成html页面,因此搜索引擎无法搜索动态页面生成的内容。伪静态是这样一种技术:页面对搜索引擎表现为静态特性,而实际服务器处理的时候却是作为动态页面进行处理的。也就是说搜索引擎在查找该网页内容不会像静态页面那样直接返回,而是等待动态内容生成完之后再返回。因此,伪静态实现了搜索引擎对动态网页的搜索。缺点是伪静态页面的搜索效率没有静态页面高。
具体到我们的应用中,当我们点击首页菜单栏的链接时,地址栏会出现这样的url:http://aaa.123.cn/arlist/28/38。这是一个典型的动态路由,url中两个参数传到服务器后,服务器查找相关的数据库配置来返回对应的页面。在controller目录的index.php文件可以找到相关的处理逻辑。具体的动态路由配置,要参考数据库配置。
核心代码:
*/
public function arlist() {
...
//对不同的页面参数进行不同处理
if ($column['type'] == 1) { //封面
$tem = $common->getOneMsg('template', array('id' => $column['index_type'], 'status' => 1));
// var_dump($tem);die;
//判断没有模板不能预览
if (empty($tem['name'])) {
$this->error('该文档不支持预览或者访问', '/');
}
return $this->fetch("default/cover/index_" . $tem['title']);
} else if ($column['type'] == 2) { //列表
$tem = $common->getOneMsg('template', array('id' => $column['list_type'], 'status' => 1));
// var_dump($tem);die;
//判断没有模板不能预览
if (empty($tem['name'])) {
$this->error('该文档不支持预览或者访问', '/');
}
return $this->fetch("default/list/index_" . $tem['title']);
} else if ($column['type'] == 3) { //页面
$tem = $common->getOneMsg('template', array('id' => $column['content_type'], 'status' => 1));
//判断没有模板不能预览
if (empty($tem['name'])) {
$this->error('该文档不支持预览或者访问', '/');
}
return $this->fetch("default/detail/index_" . $tem['title']);
} else if ($column['type'] == 4) { //栏目绑定信息
return $this->fetch("");
}
$this->assign("selfconfig", load_config());
}
4. 总结
以上是本人在修改php官网时,总结的几个技术的核心关键点,并不涉及具体的业务处理。个人觉得,根据这些关键点去梳理业务,比较容易理顺具体的实现思路。同时,这仅是一个平台页面的框架性描述文档,不涉及数据库表结构和后台处理的逻辑。关于这一部分,还需要更深入地分析源码。