一、概述
因为最近小项目比较多,而且项目之间的重复度又比较大,所以搞了一个项目框架似的东西,边做边修改。
目前里面已经容纳了不少几个项目,也搞了些类似基础构件一样的东西:
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脚本中用代码直接上传。