您现在的位置: 365建站网 > 365文章 > php项目框架设计

php项目框架设计

文章来源:365jz.com     点击数:422    更新时间:2009-09-18 10:22   参与评论

一、概述

因为最近小项目比较多,而且项目之间的重复度又比较大,所以搞了一个项目框架似的东西,边做边修改。

目前里面已经容纳了不少几个项目,也搞了些类似基础构件一样的东西:

flykobe@105 quick $ ls -FX

 inc/      jzj/  m2/      mstatic/  t/     template/  webtools/    robots.txt*

default/  jbft_v2/  m/    modsky/  nba/      env_setting.inc*  dispatch.php*  clean.sh*

子项目的结构:

flykobe@105 quick $ ls modsky/ -FX

control/  inc/  layout/  view/

所有的URL都经过dispatch.php的路由,经过一定的字符串处理规则,指定到子项目control中的某个文件上去。

根目录下,有一些公共的目录:

inc是全体项目公用的函数库

mstatic是一些临时的css、js文件生成后的存放位置

t是测试目录

template是公共模块库

default是一些默认路径,其中包括了项目公共的ajax接口(当然,每个项目也可以开发自己的ajax接口)

另外,env_setting.inc是整个项目的配置文件。

二、dispatch说明

开始的想法是,一个大项目目录,一个域名,下面靠不同的module名称,来区分不同的子项目,所以URL格式就是:

test.mydomain.cn/jzj/

test.mydomain.cn/modsky/

...

(但是,后来发现运营的需求总是在变的,他们需要不同的域名,所以就在apache的配置中做了alias,还都是指向根目录。但是造成的后果就是,不同的域名,通过不同的二级目录名称等,就可以访问到同样的页面,这样,不管是对于seo,还是逻辑上,都是很不好的!等休假回来,要整理整个!)

dispatch中,对每个二级目录,都做了uri和module之间的映射,这样每次添加一个新项目,都需要添加或者修改这个映射,虽然增加了工作量,但是也控制了无效访问,以及可以很方便的做uri的重新指向。比如,我做了一个子项目m,之后需要大改版,那么就可以新建子项目m2,然后改版完成之后,把访问m的uri指向到m2。

三、template公用模块

使用了面向对象的设计方法。主要目的是,由于网站开发中,存在大量的重复工作,除了php代码,还有html、css、js等,所以,要把这些全结合起来,生成一个一个的小模块,使用的时候,一行代码就搞定。

基类TpBase,将构造方法定义为protected的,使用了Register类,implements 了接口TpInterface,该接口中定义了getInstance方法。这样,就可以限制用户只能通过getInstance来创建实例,从而能够灵活的控制单例等。

子类中,有的需要单例,有的需要允许一个页面上有多个实例。

由于js、css、html component和view(html)都属于模块,开发阶段的时候,会把多个模块的js、css、components整合起来,分别生成一个js、css和html文件。在生成的时候,需要考虑到是否有重复等问题。

这样,多个实例的情况下,除了php代码端的某些控制之外,还需要对html的id,js中使用到的变量、函数等进行处理。这里是使用了一个static的变量,用来代码当前的实例是第几个实例,用这个数字来作为id、js函数等的后缀,从而保证了唯一性。

如果需要更改模块的css、js、html代码等,可以简单的重写属于自己的css、js、html代码,然后把文件名通过getInstance的参数传入,就可以修改默认指定的文件了。

当我们建立一个子项目的时候,搭建好页面的html框架,然后在模块应该出现的位置生成其实例就可以了。以下是一行调用代码:

                    <div id="cyNbaNewestMblog" class="panel cur_panel">

                          <?php TpMultiMblog::getInstance(array('refresh'=>false, 'user_id'=>$friend_id, 'kind_type'=>'newest', 'sho  w_num'=>$mblogs_show_count, 'mblogs'=>$reply_mblogs)); ?>

                      </div>           

也可以通过getInstance的show参数,来控制是否立即显示页面代码。如果不需要立即显示,就可以show=false,然后在需要显示的时候,$obj->show()来显示页面。如果采取这种方式,就可以在php 代码中统一的生成模块对应的objs,然后在view中显示它。

三、有待改进的上线方法

有几个需要注意的点,一个是我们的push工具是仅针对wwwroot下的目录的(囧啊),这样就意味着整个大项目只能一起上,而这中间不可避免的会有不想上线的代码。另外,由于引入了模块的编程方法,其中针对css、js等会在开发环境自动生成,但是我又没有上传这些文件到前端服务器的权限(再囧),所以需要其他同事手动取到这些文件,上传到前端服务器。

针对第一个问题,我修改了push工具的一个脚本。该工具针对每一个大项目目录,有一个clean.up的脚本,其中的shell语句会被执行,本来是用来清理log、test等文件的。现在修改如下:

rm *.log 

....

find * -maxdepth 0  -type d | grep -v "\<inc\>"  | grep -v "\<_common\>" | grep -v "\<default\>" | grep -v "\<m2\>" | xargs rm -rf

我认为,根目录下的所有文件和某些目录是公用的,所以一旦修改,必须保证是正确的,而且必须要上线(因为如果不这样,可能会忘记了某个修改是针对某个子项目的,而漏上了)。

这样,当需要上线某个子项目的时候,就把子项目名称也排除掉,就可以保证仅上线该项目了。比如,上面这个脚本就是上线m2子项目的。

而针对第二个问题,目前的想法是,先拿到前端服务器的权限,然后开ftp权限,在clean.sh脚本中用代码直接上传。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (422人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号