RSS
热门关键字:  php  lighttpd  找回密码  密码找回  client
当前位置 :| 主页>技术资料>PHP>

CMS模块化开发 一

来源:phpsoho.com 作者:无喱头 时间:2008-08-08 Tag:php   cms   模块   module   点击:


单一入口应用程序概述

为什么这里会讲到单一入口?这与我们的核心管理平台有很大的关系。我们需要一个统一、标准的核心管理平台来支撑整个系统平台的运作,这是模块化开发的基础。

什么是单一入口应用程序?

在解释什么是单一入口应用程序之前,我们先来看看传统的 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 。这是一个例外,只有我们在执行loginlogout操作时,act才会存在。

Admin.php可能文件如下所示:



通过admin.php的描述,应该很轻松的了解我们这次设计的基本理念了。

/admin目录对于我们来说,仅仅是提供一个初始的平台界面,当然。Top页面对我们的整个管理系统来说是很重要的。目录结构如下:



我们通过index.php分别载入topleftright框体页面,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剖析后得到的。
设计思想清晰了,我们制定这么一个流程出来,以应付我们的需求:










当然,我们这些模块是已经录入到数据库中的,比如我们可能存在着这么几个数据表:


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册