
/ **
* 版权所有 (C) 2008 英才网联(北京)科技有限公司
* 作者:英才网联 技术部
* 时间:2008-5-23
*/
FleaPHP框架使用规范 2
一.FleaPHP 的MVC 模式 2
二.Fleaphp 的命名规范 2
1) 类的命名规则 2
2) 变量和常量命名规则 3
三.FleaPHP目录结构 3
四.MVC 模式下的程序和代码 4
1) 项目入口程序Index.php 4
2) 控制器Controller 5
3) MVC 模式下各类代码划分 5
4) 变量的引用和传递 6
5) 开发模式与日志输出 6
五.数据库操作 6
1) Table Data Gateway(表数据入口类) 6
2) 数据表关联 6
3) 多个数据库连接 7
六.其他框架插件 7
1) Smarty模板的使用 7
2) Ajax的使用 8
FleaPHP框架使用规范
一.FleaPHP 的MVC 模式
FleaPHP 采用的是Passive(被动)MVC 模式。在 Passive MVC 模式中,Model(模型)完全不知道自己身处于 MVC 结构之中。换句话说,Model 就是一个普通的对象,与 MVC 模式里面的其他组成部分完全没有关联。具体而言,MVC 模式涉及到下列三类对象:
M 代表 Model,即模型,用于封装与业务逻辑有关的代码和数据。例如对订单的各种计算。
V 代表 View,即视图,用于呈现内容给用户(也就是将程序运行的结果返回给浏览器显示)。例如商品列表页面、后台登录页面。
C 代表 Controller,即控制器, 用于接收用户输入(通过浏览器发起的请求),然后调用模型(Model)对输入数据进行处理并获得处理结果。最后将结果传递到视图(View),从而让用 户能够看到自己操作的结果。例如用户点击删除文章按钮后,控制器调用操作文章的模型,删除掉指定文章,最后通过视图显示成功删除文章的提示信息。
经过这样简单的分离,我们就把应用程序操作数据的代码(绝大部分 Web 应用程序都是对数据进行操作)和处理用户输入输出的代码分离开来了。
这种分离有许多好处:
1.清晰的将应用程序分隔为的部分;
2.业务逻辑代码能够很方便的在多处重复使用;
3.方便开发人员分工协作;
4.如果需要,可以方便开发人员对应用程序各个部分的代码进行测试。
二.Fleaphp 的命名规范
1) 类的命名规则
所有 FleaPHP 自带的类,都以 FLEA_ 开头。然后根据用途命名。例如 FLEA_Controller_Action、FLEA_Helper_ImgCode。然后将类名字中的“_”替换为目录分隔符,就是这个类的定义文件所在位置。
举例:
FLEA_Controller_Action 类,保存文件为 FLEA/Controller/Action.php
FLEA_Db_TableDataGateway 类,保存文件为 FLEA/Db/TableDataGateway.php
这种命名规则和目录结构的优缺点如下:
1.避免命名冲突
2.根据类名字就能找到文件存放位置
3.应用程序中可以使用 FleaPHP 的 FLEA::import()、FLEA::loadClass() 方法方便的载入类定义文件,也可以使用FLEA:: loadFile() 方法载入指定的文件。
4.如果使用 PHP5,可以很方便的用 __autoload() 来自动载入需要的类定义
2) 变量和常量命名规则
全局变量和常量
全局变量和常量都使用全大写,以“_”分隔。例如 $GLOBALS['CLASS_PATH'] 和 FLEA_DIR。不过 FleaPHP 中尽量避免了使用全局变量和常量,因此一般来说不会和应用程序产生冲突。
临时变量
函数、类方法中使用的变量都是临时变量,命名规则是第一个单词小写,后续的单词第一个字母大写。例如 $requestFilters、$dispatcherClass 等。
模版变量
之所以要把模版变量单独列出来, 是因为不同的模版引擎对变量名有不同的规范。从我个人来说,我倾向于模版变量使用全小写单词,并以“_”分隔,例如 $latest_products_list。这样在程序里面一眼就能看出哪些变量是用于模版的。
三.FleaPHP目录结构
以0.105服务器为例
|--FleaFrame 框架和插件程序目录
|--FLEA FleaPHP框架主程序目录
|--Smarty 模板程序目录
… 其他公用插件和类库
|--interviewing 面试项目程序目录
|--APP 项目主程序目录
|--Config 项目的配置文件目录
|--DSN.php 数据库链接数组
|--DEFAULT_APP_INF.php 系统默认配置参数数组
… 其他配置参数文件
|--Controller 控制器目录
|--Default.php 默认控制器
|--Interview.php 面试信息控制器
…
|--Model 模型目录
|--Interview.php 面试信息模型
|--PublicFunction.php 模型需要调用的公共函数
…
|--Table 数据表目录
|--Interview.php 面试信息模块
…
|--common 项目内公用文件目录
…
|--smarty_root 模板目录
|--cache 模板缓存目录
|--templates 模板文件目录
|--templates_c 模板编译目录
|--css 项目中的样式文件目录
|--images 项目中的图片文件目录
|--js 项目中的js文件目录
|--index.php 项目程序入口
目录结构说明:
FleaFrame是框架程序目录,所有项目需要使用该目录建立框架项目。包括FleaPHP主框架程序、Smarty模板或其他公用插件和类库
每个项目需要创建自己目录,用于保存该项目自己专用的文件和目录。例如 interviewing是面试系统使用的目录。
在interviewing目录下,index.php是面试系统的程序入口,css,images,js 目录放置到与index.php 并列的目录下。
APP目录包含是MVC 模式对应的各类文件目录。
Config目录内是项目的配置文件,
Controller 是控制器目,
Model是模型目录,包括模型需要调用的公用函数文件
Table是数据表目录,
common项目内公用文件目录,
smarty_root是 smarty模板目录。
四.MVC 模式下的程序和代码
1) 项目入口程序Index.php
index.php 是应用程序的入口文件,负责定义一些应用程序必须的常量,并载入 FleaPHP 框架,然后执行 run() 函数。
项目入口程序Index.php 部分代码说明:
/**
* 访问 http://www10.800hr.com/proxy/interview/ 时,服务器进行了代理转换,
* 访问路径发生变化,需要重新设置$_SERVER['SCRIPT_NAME'],保证页面能正常访问
*/
$_SERVER['SCRIPT_NAME'] = '/proxy/interview/index.php';
/**
* 当 DEPLOY_MODE 为 false 时,FleaPHP 使用调试模式运行,
* 应用程序开发结束后,应该将 DEPLOY_MODE 改为 true。
*/
define('DEPLOY_MODE', false);
// APP_DIR 常量定义为应用程序代码所在的父目录
define('APP_DIR', dirname(__FILE__) . DS . 'APP');
// TODO: 修改 DSN.php 内容为您所使用的数据库
FLEA::loadAppInf(APP_DIR . '/Config/DSN.php');
// 导入应用程序对象搜索路径
FLEA::import(APP_DIR);
// 启动 MVC 模式,并运行应用程序
FLEA::runMVC();
2) 控制器Controller
在 FleaPHP 应用程序中,应用程序包含多个控制器。每一个控制器又提供一组控制器动作。每一个浏览器发送给 FleaPHP 应用程序的请求,都是由一个动作来处理的。将一组相关的动作集中到一起,就形成了一个控制器。要合理的定义控制器,避免一个控制器内的动作过于复杂。
尽可能通过配置参数来指定默认使用哪个控制器,而不是将 “Default”作为控制器名称使用。配置参数如下:
'defaultController' => 'interview',
'defaultAction' => 'index',
3) MVC 模式下各类代码划分
要合理的区分MVC 模式下各类代码,将不同代码放置对应的目录下。
Controller控制器 按不同控制器和动作名接受用户的请求的数据,再按照action动作名 将请求数据交给对应Model模型 来的处理;
Model模型 进行数据检查、数据处理、查询条件生成等的工作。如果有数据库操作,就将处理后的数据交给Table数据表 进行处理;
Table数据表 只进行与数据库交互的操作,如添加、修改、删除、查询。然后将查询结果返回给Model模型;
Model模型 对Table数据表 返回的数据经过处理后,再返回给Controller控制器;
Controller控制器 将Model模型 返回的数据交给smarty模板,再让模板解释后显示出来。
代码进行有效划分后,有助于清晰流程,提高代码的可阅读性。
4) 变量的引用和传递
在MVC 模式下,除系统默认的全局变量外,其它变量要以参数的方式在各个类和函数间传递。对于$_GET或$_POST数据,尽可能直接使用原数组,不要将$_GET或$_POST里的各个变量都转换成单个变量使用,避免变量名过多,引发冲突。对于非富文本编辑器(如:fckeditor)编辑的$_GET或$_POST数据,要先通过htmlspecialchars()进行 html转码,再保存到数据库。
在系统配置文件内的定义的变量,可通过FLEA::getAppInf('dbDSN')的方式获得。“dbDSN”为变量名。
5) 开发模式与日志输出
在入口程序Index.php 内修改常量定义开启开发模式:
define('DEPLOY_MODE', true);
在开发模式下,系统默认打开的日志输出。输出目录默认在FleaFrame/_Cache目录下。可以通过系统配置文件参数修改路径。设置如下:
'internalCacheDir' => APP_DIR . '/_Cache',
五.数据库操作
1) Table Data Gateway(表数据入口类)
FleaPHP 默认使用 Table Data Gateway(表数据入口类)来提供数据库访问服务,有出色的自动化CRUD(Create, Read, Update, Delete)操作能力。
对于简单CRUD操作可以直接使用 表数据入口类 里面的create()、update()、find()、remove()、findAll()等成员函数。
2) 数据表关联
FleaPHP 支持四种类型的数据表关联,分别是:
HAS_ONE: 当前表的每一条记录都拥有最多一条(0–1)关联记录
HAS_MANY: 当前表的每一条记录都拥有多条(0-n)关联记录
MANY_TO_MANY: 当前表的每一条记录都和其他表的多条(0-n)记录关联
BELONGS_TO: 当前表的每一条记录都属于另一个表的某条记录
对于一般查询可以使用这四种数据表关联进行查询并输出。
对于复杂的多表联合查询可以 使用手写SQL查询条件语句后调用findAll()、或者手写完整SQL语句后调用 findBySql() 的方式进行。
findBySql()使用 sql 语句获取记录,将不会处理关联数据表。
3) 多个数据库连接
如果要分别连接不同的数据库,可以在Table数据表 模块的构造函数编写以写下代码
…
$params['dbDSN'] = FLEA::getAppInf('dbDSN');
$this -> FLEA_Db_TableDataGateway($params);
…
注: 'dbDSN' 是在系统配置文件中定义数据库连接数组
六.其他框架插件
FleaPHP集成了许多插件和类库,例如smarty模板,ajax(jquery.js)和助手Helper等,充分利用这些功能来提高开发效率。
在项目中引用了新的插件,需要根据新插件的公用程度分别放置。仅自用的插件放置在应用项目的目录下。模型需要调用函数文件放置到APP/Model目录下,项目内公用文件放置到APP/common目录下)。通用性强、能被大多其他项目使用的插件应放置在 “FleaFrame”目录下,与FLEA目录并列。
1) Smarty模板的使用
要使用smarty模板 需要在系统配置文件中设置以下参数:
'view' => 'FLEA_View_Smarty',
'viewConfig' => array(
'smartyDir' => '/var/webroot/FleaFrame/Smarty',
'template_dir' => APP_DIR . '/smarty_root/templates',
'compile_dir' => APP_DIR . '/smarty_root/templates_c',
'config_dir' => APP_DIR . '/smarty_root/configs',
'cache_dir' => APP_DIR . '/smarty_root/cache',
'left_delimiter' => '<%',
'right_delimiter' => '%>',
'caching' => 0 //禁用缓存
),
在控制器中使用smarty模板有两种方式, 详细使用方式参见FleaPHP框架自带Smarty样例。
在每个模板的文件的第一行添加一下代码。避免模板被外部直接访问。
对于简单标签如 类标签,直接使用标准html标签,不要是使用框架引入的新解释标签。这有助于不同页面器显示页面效果。
如将模板标签:
<%webcontrol type='textbox' name='user_name' value=$ user_name size='15' %>
改为标准html标签:
size='15' >
2) Ajax的使用
FleaPHP框架通过FLEA_Ajax类 和jquery.js 文件共同实现Ajax的操作。
如要使用jquery.js 时,需要将jquery.jsjs文件放置到可访问的js路径下。FLEAPHP系统自带的jquery.js 使用两个文件合并的,分别是:
jquery.js (来源:http://jquery.com/ )
jquery.form.js (来源:http://malsup.com/jquery/form/ 属于 jQuery Form Plugin )
jquery.form.js 不是必需的,只有在使用Ajax进行表单提交提交时需要。
详细使用方式参见FleaPHP框架自带Ajax样例。
