IcePHP框架文档
简介
2014年6月25日 星期三
10:27
定位 | IcePHP是一个私有的,非开源,基于MVC结构的轻量级PHP开发框架. |
首要目标 | 以最低的学习成本提供了一个简单,易用,高效的PHP开发框架. 并根据具体项目需求进行裁剪,修改,增强 |
阅读前提 | 本手册假设阅读人员已经熟练掌握以下概念 OOP,MVC,设计模式,ORM,CRUD,单一入口 如有疑问,请百度之 |
环境要求 | 框架随时进化,请尽可能提供最新的稳定版开发及运行环境 开发环境推荐WAMP最新版 运行环境推荐LNMP最新稳定版 |
使用许可 | 仅在本人曾经工作的互联网公司曾经参与过的项目中使用. 框架随时进化,不提供向后兼容 |
特性 | 框架尽可能精简,清晰,以方便随时根据需求进行进化 仅支持Mysql,Mongo,不支持SQL Server,Oracle及其它不常用数据库 内建简单模板,不支持Smarty或其它模板 所有看起来高大上的功能均不支持,请开发人员自行实现 |
调试模式 | 框架提供调试模式与运行模式的切换功能 |
目录结构
2014年6月25日 星期三
10:36
一级目录
program | 程序目录,存放开发人员编写的项目代码 |
public | 公开目录,存放所有允许Web用户访问的静态文件,上传文件以及项目入口文件 |
run | 运行时期目录,存放框架运行时生成的缓存文件,日志文件以及编译后的视图文件 |
system | 框架目录,存放框架系统类 |
程序目录
controller | 控制器目录,MVC结构中的C 当项目规模较大时,可建立一层二级目录以分别存放控制器类 但不同目录之中的控制器类不允许同名 |
model | 数据逻辑目录,MVC结构中的M |
view | 视图目录,MVC结构中的V |
logical | 业务逻辑目录,除小型项目外,MVC中的M将被拆分为两部分 数据逻辑(Model)存放单一数据表内部的逻辑实现 业务逻辑(Logical)存放多个数据表之间/之上的逻辑实现 |
unit | 逻辑单元目录,大型项目时,MVC中的M将分拆分为三部分 逻辑单元(Unit)存放与数据表无关的逻辑实现 |
config | 配置目录,存放系统配置及项目配置 |
lib | 外接库目录,提供与其它非框架代码库的对接功能 |
公开目录
static | 静态文件目录,存放所有项目中使用到的脚本文件,样式表文件,图片文件及其它静态文件 |
upload | 上传文件目录,存放Web用户上传的文件 |
index.php | 单一入口文件,此文件需要Apache或Nginx配置为默认文件 |
运行时期目录
cache | 缓存文件目录 |
log | 日志文件目录 |
view_c | 编译后的视图目录 |
系统目录
frame.system.php | 框架入口类 |
plugin.php | 框架作为插入模式使用时的入口文件 |
program.php | 框架作为命令行模式使用时的入口文件 |
core | 框架核心类目录 |
dao | 数据访问对象类目录 |
mvc | MVC相关类目录 |
enhance | 扩展功能类目录 |
静态文件目录
static/js | JS脚本文件目录 |
static/img | 图片文件目录 |
static/css | 样式表文件目录 |
其它 | 其它静态文件 |
命名规范
2014年6月25日 星期三
11:16
所有文件名 | 全部由小写字母组成(不包括外接库文件) |
控制器类 | 以.controller.php结尾 |
数据逻辑类 | 以.model.php结尾 |
业务逻辑类 | 以.logical.php结尾 |
逻辑单元类 | 以.unit.php结尾 |
视图文件 | 以.tpl结尾(可通过配置文件修改) |
编译后的视图文件 | 以.php结尾 |
框架类 | 以.system.php结尾 |
日志文件 | 以.log结尾 |
缓存文件 | 以.cache结尾 |
所有文件以无BOM头的UTF-8编码格式保存
调用方法
2014年6月25日 星期三
13:57
Web模式 | …/ice/public/index.php?c=<控制器名称>&a=<动作名称>&…… | 默认使用参数c来指定控制器名称,使用a来指定动作名称,也可以在系统配置中修改 |
插入模式 | <?php require_once '../../ice/system/plugin.php'; plugin('webservice','index',array('s'=>'answer')); exit; | 1.包含ice/system/plugin.php 2.调用plugin方法,并指定控制器名称,动作名称,以及其它参数 |
命令行模式 | php ice/system/program.php "c=webservice&a=test&…" | 1.使用PHP启动 ice/system/program.php 2.所有参数如Web模式, 使用引号包含 |
|
|
|
控制器(controller)
2014年6月25日 星期三
10:56
类名 | 以C前缀,之后是驼峰规则,如 CIndex 与文件名对应 index.controller.php => CIndex otherprocess.controll.php => COtherProcess |
|
基类 | SController |
|
属性rawController | 原始请求的控制器名称 |
|
属性rawAction | 原始请求的动作名称 |
|
属性controller | 当前请求的控制器名称,可能与原始控制器名称不一致 |
|
属性action | 当前请求的动作名称,可能与原始动作名称不一致 |
|
属性header | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | 常用于输出HTML头 |
属性backUrl | 本次请求的来源页面地址 | 即referer |
属性request | 本次请求的参数对象 | 类SRequest |
方法redirectTemporary | 输出一个302跳转(临时重定向) |
|
方法redirectPermanent | 输出一个301跳转(永久重定向) |
|
方法headerto | 重定向到指定控制器及动作(Action),利用302跳转实现 |
|
方法ajaxOk | 输出一个固定格式的JSON | 用于Ajax响应 |
方法ajaxError | 输出一个固定格式的JSON错误 | 用于Ajax响应 |
方法setBack | 记录当前地址为回退地址,以便后继使用 | 跨请求 |
方法getBack | 取回之前由setBack记录的回退地址,以便跳转 | 跨请求 |
方法goBack | 取回之前记录的回退地址,并跳转 |
|
方法cacheToday | 输出一个CDN的缓存头,指定本次输出可以缓存的时间 |
|
方法mustWWW | 限制本次请求的二级域名必须是www,利用must实现 |
|
方法must | 限制本次请求的二级域名必须是指定的二级域名,不允许Ajax请求 |
|
伪构造函数 | 如果控制器中存在方法 construct ,则此方法将在具体动作前执行,此时$this->request等属性已经生成. 原构造 方法__construct 时,属性尚未生成 |
|
|
|
|
数据逻辑(model)
2014年6月25日 星期三
10:56
类名 | 以M前缀,之后是驼峰规则,如 MOttProgram 与文件名对应 ottprogram.model.php => MOttProgram program.model.php => MProgram |
|
基类 | SModel |
|
属性table | 相对应的表对象 | STable |
方法table | 获取相对应的表对象 | STable |
其它方法 | 请参考类 STable |
|
常用定义
class <类名> extendsSModel {
protectedstatic $handle;
/**
* 构造方法
*/
protectedfunction __construct() {
$this->table= table ( '<对应的表名>' );
}
/**
* 单例化
*
* @return <类名>
*/
public staticfunction instance() {
if (!self::$handle) {
self::$handle= new self ();
}
returnself::$handle;
}
<其它数据逻辑方法>
}
常用调用
$mProgram=MProgram::instance();
$mProgram->select(……);
业务逻辑(logical)
2014年6月25日 星期三
10:56
类名 | 以L前缀,之后是驼峰规则,如 LDeviceAuth 与文件名对应 deviceauth.logical.php => LDeviceAuth webservice.logical.php => LWebservice |
|
基类 | SLogical |
|
约束 | 禁止实例化,所有方法都是静态方法 |
|
示例
视图(view)
2014年6月26日 星期四
10:40
简介
模板 | 框架自建一个简单的模板系统,使用一套类PHP的语法 |
|
编译 | 编译后的视图文件存放在view_c目录下 | 可通过系统配置修改 |
自动编译 | 视图更新后,将会自动重新编译 自动编译将浪费一定效率来判断视图是否已经更新 | 可通过系统配置修改 不再自动编译 |
约束 | 语法紧密,不要书写多余的空格 | 将导致编译错误 |
约束 | 避免一行内多个模板语法 | 有时将导致编译错误 |
模板语法
模板定界符 | { } |
|
for循环 | {for($i=0;$i<count($arr);$i++)} {endfor} | 定界符内是PHP语法 |
foreach循环 | {foreach($arr as $k=>$v)} {endforeach} | 定界符内是PHP语法 |
while循环 | {while(条件表达式)} {endwhile} | 定界符内是PHP语法 |
if判断 | {if($i>5)} {elseif($i>2)} {else} {endif} | 定界符内是PHP语法 |
嵌套原生代码 | {php} {/php} | 其中可以书写任意PHP代码 |
子模板包含 | {include('子模板',参数数组)} | 注意:子模板中使用的变量,必须在主模板中明确传递 |
赋值 | {assign(结果变量名=model('模型类名')->方法名(参数表))} {assign(结果变量名=逻辑类名::方法名(参数表))} | ()间是PHP语法 |
显示函数返回值 | {date('Y-m-d H;i:s')} {dump($var,'title',true)} | 既然是函数调用,最后就应该是')'结束 |
显示变量的值 | {$变量} {$对象->属性} {$数组[下标]} |
|
判断是否IE浏览器 | {ifIE} {else} {endif} |
|
自定义标签 | {:方法名称(参数列表)}
| 这将调用STemplate下的静态公开方法,并显示返回结果 |
包含JS文件 | {js('jquery','my'[,…])} | 不需要书写后缀 可一次包含多个脚本文件 文件存储路径由系统配置文件决定,默认是 /ice/public/static/js/ |
包含CSS文件 | {css('main','page'[,…])} | 同上 |
输出图片路径 | {img} | 输出图片所在路径前缀 常用在IMG标签的SRC属性中 |
输出XML头 | {xml} | <?xml version="1.0" encoding="utf-8"?> |
输出上传文件路径 | {upload} |
|
配置(config)
2014年6月25日 星期三
10:57
系统配置ice/program/config/system.config.php
以下为经常修改项目
path_root | 应用程序根路径 默认值为 /ice/public/ 此处需要根据Web服务器的配置决定,即访问到 ice/public/index.php 文件所需要的URL地址中的路径部分 如 Apache的documentRoot配置为 ice 目录,则此处应为 /public/ |
|
config | 配置模式,当此处使用debug时,自动开启调试模式 当此处使用run时,开启运行模式 | 参考调试 |
cachePage | 页面片段缓存的方法 , none/file/mem | 参考页面片段 |
cacheData | 数据缓存的方法 , none/file/mem | 参考DAO |
cacheMust | 特定缓存的方法 , none/file/mem | 参考缓存 |
调用方法 | config('system','<配置项名称>'); |
|
日志配置ice/program/config/log.config.php
通常不修改
应用配置ice/program/config/*.config.php
根据项目决定
调用方法 | config('<配置文件名>','<配置项名称>'[,<下级配置项名称>]); |
|
以下配置根据系统配置中的config的值分别存放在 ice/program/config/debug/目录下 及ice/program/config/run/目录下
数据库配置database.config.php
以下为经常修改项目
_default | array( 'host'=>'192.168.60.24',//数据库服务器地址 'port'=>'3306', //数据库服务端口 'user'=>'root', 'password'=>'', 'database'=>'ronghetv',//数据库名称 ) | 此处配置默认数据库 |
<表名> | 同上 | 特意指定某个表所在的数据库配置 |
*注意 | 配置文件是一个PHP文件,这表明此处允许全部PHP语法 如果有多个表需要指定同一个非默认数据库配置 那么可以事先定义一个变量来存储数据库配置,以简化表配置 |
|
Memcache配置memcache.config.php
servers | 共有多少台缓存服务器 |
|
<N> | array( 'host'=>'127.0.0.1',//缓存服务器主机地址 'port'=>'11211' //缓存服务端口 ) | 第N台缓存服务器的配置 |
文件缓存配置filecache.config.php
通常不修改
Mongo数据库配置mongo.config.php
<表名> | 服务地址 | mongodb://localhost/ice |
系统类(system)
2014年6月25日 星期三
11:10
框架常量(仅用于框架)
ICE_PHP_FRAMEWORK | 用于判断是否已经包含框架 | by liyong@nenu.edu.cn QQ:31008088 |
DIR_ROOT | 框架根目录 | /ice/ |
DIR_SYS | 框架系统目录 | /ice/system/ |
DIR_CONFIG | 框架配置目录 | /ice/progra/config/ |
框架全局函数(为开发人员提供)
dump | 显示/返回一个复杂变量/对象的值 |
|
debug | 记录一个调试信息 如果在调试模式下,输出时会附带输出全部调试信息 | 由SDebug实现 |
isDebug | 判断是否处于调试状态 | 由SDebug实现 |
setDebug | 设置当前调试状态 | 由SDebug实现 |
config | 获取配置 | 由SConfig实现 |
cache | 获取缓存实例 | SCache |
table | 创建一个标准表对象 | STable |
mongo | 创建一个标准Mongo对象 | SMongo |
lib | 引入一个外接库文件 |
|
plugin | 本框架作为插入模式使用时,主入口函数 | 由SFrame实现 |
fragment | 显示一个页面片段,通常由View来调用 | 由SFrame实现 |
display | 显示一个指定的视图 | 由STemplate实现 |
fetch | 获取一个视图的结果,而不显示 | 由STemplate实现 |
url | 创建一个URL地址 | 由STemplate实现 |
writeLog | 写文本日志 | 由SLog实现 |
sessionLog | 写入当前会话日志 | 由SLog实现 |
isCliMode | 判断当前是否是命令行模式 |
|
mid | 字符串截取 |
|
框架类(只描述开发人员可以使用的)
SFrame::checkfile | 检查本地文件是否存在 |
|
SFrame::timeLog | 获取当前时间/获取当前时间与指定时间的时间差 |
|
SFrame::getRequest | 获取当前请求的请求参数对象 | SRequest |
SFrame::getModule | 获取当前模块名称 |
|
SFrame::getController | 获取当前控制器名称 |
|
SFrame::getAction | 获取当前动作名称 |
|
SFrame::getRawController | 获取原始控制器名称 |
|
SFrame::getRawAction | 获取原始动作名称 |
|
SFrame::makeDir | 根据文件名,创建必要的目录 |
|
不对开发人员开放
SConfig | 实现配置文件的读取 |
|
SDebug | 实现调试模式及调试信息的管理 |
|
SArrayObj | 实现数组与对象的转换 |
|
|
|
|
请求参数(SRequest)
2014年6月25日 星期三
17:53
SRequest
属性requests | 其中保存了$_REQUEST的数据 | 支持SArrayObj访问(见下) |
属性posts | 其中保存了$_POST的数据 | 同上 |
属性gets | 其中保存了$_GETS的数据 | 同上 |
属性servers | 其中保存了$_SERVER的数据 | 同上 |
属性env | 其中保存了$_ENV的数据 | 同上 |
属性files | 其中保存了$_FILE的数据 | 同上 |
属性cookies | 其中保存了$_COOKIE的数据 | SCookie |
属性sessions | 其中保存了$_SESSION的数据 | SSession |
属性url | 本次访问的URL |
|
属性referer | 本次访问来源页面的URL |
|
属性ip | 访问者的IP(去除CDN路径上的IP) |
|
属性rawIp | 原始IP(完整的IP,如果经过CDN,应该是三段,如果不经过CDN,应该是一段) |
|
属性curUrl | 当前访问路径 (去除域名,端口,去除参数) |
|
属性https | ||
属性domain | 当前访问协议及域名 |
|
属性port | 当前访问端口 |
|
属性post | 当前访问域名 |
|
属性agent | HTTP_USER_AGENT |
|
属性domains | 当前访问域名 分解 |
|
静态属性isAjax | 当前是否Ajax访问 |
|
方法antiHtml | 防入侵,包括IP黑名单,禁止字符,禁止词 | anti.config.php |
方法getRequest | 返回全部_POST及_GET 数组方式 |
|
方法instance | 获取一个实例 | 单例化 |
方法isIe | 当前请求来源浏览器是否是IE |
|
方法isIe67 | 当前请求来源浏览器是否是IE6或者7 |
|
方法isMobile | 当前请求来源是否是手机浏览器 |
|
方法judge | 参数验证体系(尚未完善) | 通过SJudge实现 |
SArrayObj 提供了统一的访问接口
方法all | 将数据以数组方式返回 | $request->all(); |
方法count | 计数数据的个数 | $request->count(); |
方法exist | 判断某个参数是否存在 | $request->exist('id'); |
方法get | 获取某个参数的值 | $request->get('id'); |
方法del | 删除某个参数 | $request->del('id'); |
| 删除某个参数 | unset($request->id); |
| 获取某个参数的值 | $request->id; |
| 设置某个参数的值 | $request->id=<something> |
SCookie,SSession
在实现SArrayObj功能的同时,提供以下功能
方法set | 设置某个参数的值 | $request->sessions->set('user_id',1234'); |
缓存(cache)
2014年6月25日 星期三
11:14
获取缓存实例 | cache('must') |
方法set | 缓存一个数据 |
方法get | 获取一个缓存数据 |
方法clear | 清除全部/指定域的缓存数据 |
方法clearAll | 清除全部缓存数据 |
方法delete | 清除一个指定的缓存数据 |
方法enabled | 当前缓存是否可用 |
|
|
日志(log)
2014年6月25日 星期三
11:14
日志文件位置 | 日志根目录由系统配置决定 下面按年/月/日进行目录划分 |
|
记录文本日志 | log 全局函数 | 由SLog实现 |
记录会话日志 | sessionLog 全局函数 | 由SLog实现 |
清除指定日志 | SLog::clear |
|
外接库(lib)
2014年6月25日 星期三
11:12
外接库文件位置 | 由系统配置文件决定 |
引入外接库 | lib全局函数 |
DAO
2014年6月25日 星期三
15:31
表(STable)
创建表对象 | table('表名') | 表所在的数据库配置由database配置文件决定 |
方法exist | 判断是否存在满足条件的记录 |
|
方法col | 获取一列数据 | 返回一个一维数组 |
方法count | 计数满足条件的记录数 | 返回一个自然数 |
方法get | 获取一行一列的值 | 返回一个单值 |
方法row | 获取一行数据 | 返回SRow对象 |
方法getPrimaryKey | 获取当前表的主键字段名 |
|
方法query | 执行一个SQL查询 参数是一个完整的SQL语句 用于解决复杂查询 | 返回SResult对象 |
方法execute | 执行一个SQL语句 参数是一个完整的SQL语句 用于解决复杂操作 |
|
方法increase 方法decrease | 对表中满足条件的记录的某一字段的值进行增减指定常量 |
|
方法insert | 插入一条记录 |
|
方法insertIgnore | 插入一条记录 如果原来已经存在(根据表约束判断),则放弃 |
|
方法replace | 插入一条记录 如果原来已经存在(根据表约束判断),则更新 |
|
方法update | 修改满足条件的记录 |
|
方法delete | 删除表中满足条件的记录 |
|
方法deleteAll | 删除表中全部数据 |
|
方法disableCache | 临时禁止缓存,只禁止一次 |
|
方法selectHandle | 生成一个原生的查询句柄 此方法内存占用较少,用于查询大量数据 | 参考PHP手册中的PDO::query |
方法select | 获取多行数据 | 返回SResult对象 |
方法distinct 方法fields 方法groupby 方法having 方法limit 方法orderby 方法where | 为后继Select,指定Distinct 为后继Select,指定字段 为后继Select,指定分组 为后继Select,指定分组过滤 为后继Select,指定分页 为后继Select,指定排序 为后继Select,指定条件 |
|
SMongo
建设中
结果集SResult
来源 | STable的select,query的结果 |
|
方法count | 计数本结果集的行数 |
|
访问方法 | 与数组相同 |
|
join joinMongo | 一对多关联 下一个表 |
|
map mapMongo | 一对一映射 下一个表 |
|
行(SRow)
来源 | STable的row的结果 SResult中的一行 |
|
方法exists | 判断是否存在此列 |
|
访问方法 | 与数组相同 |
|
join joinMongo | 一对多关联 下一个表 |
|
map mapMongo | 一对一映射 下一个表 |
|
调试(debug)
2014年6月25日 星期三
11:31
配置 | 修改系统配置中的config为 debug |
判断是否调试状态 | isDebug全局函数 |
输出调试信息 | debug全局函数 |
模块(module)
2014年6月25日 星期三
16:58
概念 | 当项目规模增长到一定阶段时,项目应划分为若干模块(Module) |
|
请求方法 | 请求中指定模块 c=<模块名称>/<控制器名称> |
|
文件存储 | controller/<模块名称>/<控制器> |
|
Model | 所有模块公用 | 如果想自用,干脆重新搭个Web服务好了 |
Logical | 自带目录结构 |
|
View | 自带目录结构 |
|
Config | 所有模块公用 | 请自行约束使用 |
路由(router)
2014年6月26日 星期四
10:19
建设中
参数检查(judge)
2014年6月26日 星期四
10:19
建设中
逻辑单元(unit)
2014年6月25日 星期三
10:56
此部分暂时未启用,略
跨页面消息(SMessage)
2014年6月26日 星期四
13:43
建设中
页面片段(fragment)
2014年6月25日 星期三
15:24
建设中
上传文件
2014年6月25日 星期三
11:14
未实现
CRUD
2014年6月26日 星期四
13:43
建设中
进化计划
2014年6月25日 星期三
14:21
3 | DAO | 去除 预留的 MSSql,Oracle接口 |
|