单一入口应用程序概述
为什么这里会讲到单一入口?这与我们的核心管理平台有很大的关系。我们需要一个统一、标准的核心管理平台来支撑整个系统平台的运作,这是模块化开发的基础。
什么是单一入口应用程序?
在解释什么是单一入口应用程序之前,我们先来看看传统的 web 应用程序。
list.php列表程序
view.php内容显示程序
这两个页面不但分别实现了两个功能,还成为了应用程序的两个入口。
所以单一入口的应用程序实际上就是说用一个文件处理所有的 HTTP 请求。例如不管是列表功能还是内容显示程序功能,都是从浏览器访问特定的文件。这个特定的文件就是这个应用程序的单一入口。
单一入口的处理方式:
当服务器收到一个http请求时,会解析此请求,并决定访问那个文件。如 www.demo.com/list.php 是请求服务器中的list.php程序来执行相应操作,并把结果返回给游览器。
现在我们看看通过单一入口程序的处理方式。 www.demo.com/?mod=article&file=list。不难发现,实际上默认执行文件(一般为index或者default)执行了二次整理解析,我们可能实现的程序如下:
其中 class.base.php文件可能有如下程序:
<?php
Class base
{
Var $mod;
Var $file;
Function get_module()
{
//get module
}
Functon get_file()
{
//get file
}
Function run()
{
Require_once($this->mod.$this->file);
}
}
?>
那么我们很可能将执行结果定位于 module/article/list.php,由list.php程序来进行相关操作。当然,对于一个安全、健壮的系统来说,上面的处理方式明显过于简单,我们只是以实例说明。
那么OK,同学们会说,单一入口,对我们有什么好处吗?
那么我们说一下其优势:
因为所有的执行操作都由一个文件去进行维护,进行管理,那么我们很轻易的对全局系统进行安全检测,核心类库的布署及相应的过滤。当我们添加一个模块时,我们仅仅需要在我们规划的相应目录下添加相应程序就OK。
当然,它也是有一定缺点的,任何事物都是两面性的。你在使用单一入口时,你必须对整体框架有一个长期的规划,这点是需要技术和经验的积累才能完成的。你在后续的程序写作中添加一些东西到index.php文件中也未尝不可,但我并不建议在已存在的执行文件中添加或者删除(删除绝对不允许的)一些功能,这有可能会影响到或者改变我们系统设计之初的一些思想,甚至背离了我们的初衷。
模块化CMS结构应用
前者我们提到了在CMS开发过程中的一些基本模块,本文就以这些为例。
早在2005年四月份,笔者发布了 phpsohov1.0 ,这个系统原来的设想是设计一个强大的平台,通过单一入口,进行多个系统的聚合,但最后由于种种原因被遗弃了。这个系统应用了模块化及单一入口,大家可以到网上搜索一下源码。
OK,话转回来,我们开始详细讲述模块化CMS的设计应用。
在此文中,我们以应用视角分布讲解,着重讲以后台为主的CMS设计,因为前台的灵活多样性,我们可以有很多种方案去处理。
我们布署文件目录:
首先从后台的单一入口讲起。
在管理系统中,我们使用了单一入口的模式进行项目模块的管理,admin.php文件即是为此功能而产生的。
我们在admin.php文件中,对http请求执行了二次解析,在getAdminModuleJobFile 函数中,我们进行了模块定位工作。通过这个函数,我们可以很轻松的把类似于 http://www.demo.com/admin.php?mod=article&file=add定位于 /module/article/admin/add.php中,从而执行相应的操作。
当然,在此文件中,我们还执行了另一情况检查: admin.php?act=login 。这是一个例外,只有我们在执行login及logout操作时,act才会存在。
Admin.php可能文件如下所示:
通过admin.php的描述,应该很轻松的了解我们这次设计的基本理念了。
/admin目录对于我们来说,仅仅是提供一个初始的平台界面,当然。Top页面对我们的整个管理系统来说是很重要的。目录结构如下:
我们通过index.php分别载入top、left、right框体页面,index.php文件可能如下:
那么我们知道,此次系统的关键在于module目录中,此目录存放了我们所根据系统平台开发的相应模块。如下图:
我们以article模块进行实例操作。在article的模块目录下,我们做以下目录布署:
顾名思义,admin目录是此模块(article)模块的管理程序,此目录中文件的相应功能大家通过文件名就可以看得出来,不再一一进行解说。
Include目录主要为模块前台所需要的公共文集。
相对于比较陌生的是cp文件夹,那么这个文夹是干什么的呢?OK,让我们打开此文件夹,里面的文件可能如下:
里面只有四个文件,且这四个文件一一对应了模块根目录下的文件。
想明白这个文件目录的用处,还须从我们设计中心思想讲起。
比如说我们在一个CMS系统中需要这样一些频道:财经新闻、体育新闻、娱乐新闻等等。
不难发现,这些频道有一个共性:他们都属于文章系统的范畴,而不同的仅仅是他们的表现形式(前台模板)的差异。
那么我们有必要反复的进行书写相似或者说相同的代码吗?
有没有一种方案使我们能够很好的利用已有的资源进行循环利用呢?
答案是肯定的。于是,频道设计理念被我们引入到当前实例中来。
我们假设 channel-1 ~ 3同为文章模块(module/article)中的分支频道,那么,我们可以使用它的执行流程如下图所示:
在cp/index.php文件中,我们执行以下程序:
我们引入了前台的全局文件 global.php,并且根据相应的一些参数得到了 $channeldir(频道所属目录),将系统执行解析程序定位在此module/article/index.php,其它类似,改变的只是定位的执行程序而已。
那么有一点我们可以确定,我们必须有一个channeldir 这个变量存在,而这个变量是通过URL剖析后得到的。
设计思想清晰了,我们制定这么一个流程出来,以应付我们的需求:
当然,我们这些模块是已经录入到数据库中的,比如我们可能存在着这么几个数据表:

