第一篇博文:自用的PHP基础框架

      开篇介绍下自己,09年毕业通信专业,后来接触互联网,有点c的基础。从网站编辑做起,seo略懂一些。开始早期公司接触asp,然后做.net,开发过一个Android的应用(java),从.net到php一直到现在。几种语言一直用吧。

  php的框架很多,自学语言开始没接触框架,纯过程式编程。。。自学者接触的知识面总是狭隘了。

  后来用zend framework做过项目,看了一点其他的框架,也一直用.NET MVC。总体对php的框架不慎满意。大多说的互联网需求没有那么丰富,需要的就是快速开发,这也是开源cms流行的原因。同样开源的cms漏洞太多了。。。

  决定自己做一个框架,自己用吧。基本的安全能保障,性能还是不错的,下面具体说一下:

  暂定的框架名称是kaifw,名字无所谓,现在还是就我自己用,框架就几个文件,代码量很少,有几十K大小。

  框架为微型mvc架构,按照文档描述建立相关文件夹,建立mvc应用程序。

目录:
BLL 应用层 负责相关页面处理类
config 配置文件夹 应用程序相关配置,数据库信息,全局信息,路由规则
control 控制层 应用动作处理
function 自定义方法 用户自己开发或第三方服务的引用放置在此
library 库文件 架构相关的核心库文件
public 入口文件 默认的入口模块
TB 表模型 数据库表映射方法的模型
view 视图层 视图文件放在此处

  总控制代码库在library  中,后来function里面加入了memcached扩展类封装,为了性能~下载粘贴一段以前写的说明文字:

说明及规范:
BLL文件夹
内容为业务处理类,在此封装后控制层直接调用。
命名规范:文件与类名相同,类名后缀必须为“_BLL”
config文件夹
内容为应用程序相关配置,数据库信息,全局信息,路由规则
config.php为默认配置数据库和全局信息的文件,配置方法为直接书写键值对:key='val';
route_config.php为路由配置文件,配置方法参照下面路由配置方法。
其他配置可以自定义。
control文件夹
控制器存放文件夹
默认分区control/public/,可以根据项目需求自定义新分区比如后台用admin,在此建立admin文件夹(control/admin/)
每个控制器类文件名和类名必须相同,并且类名必须继承父类control,例如 class home extends control{}
function文件夹
用户扩展的自定义方法放在此处。还有第三方的服务器引用也放在这里,比如短信接口,邮件接口,支付网银接口等。
library文件夹
框架库文件
core 为核心文件夹
mysql 数据库相关类
document 说明文档
public入口文件夹
此文件夹里面放置入口文件index.php,使用方法见下面入口文件配置。
另外网站使用的静态资源放在这个文件夹下面,此文件为网站的根目录。
比如图片,样式,脚本,富媒体编辑器等
TB数据库表模型
数据表模型,数据库中每个表都在此映射一个类,
类名规范:类名加“_TB”结尾,例如,articles_TB.php,
此表模型类必须继承mtable父类,举例:class articles_TB extends mtable{}
内部已经实现部分方法,在下面的表模型中会详细描述。
view文件夹
此文件夹放置视图文件,路径规则view/分区/控制器/动作

路由规则:
路由规则设置在“config/route_config.php”,示例如下:
Route::addRoute(array(
'router'=>"ts/{control}/{action}.html",
'options'=>array(
'area'=>'public',
'control'=>'control',
'action'=>'action'
),
'reg'=>array(
'area'=>'[a-zA-Z0-9_-]+',
'control'=>'[a-zA-Z0-9_-]+',
'action'=>'[a-zA-Z0-9_-]+'
)
));
其中Route为路由类,调用静态方法addRoute添加新路由规则。生效顺序为最先添加的最先生效。
参数为数组,其中router是url,要匹配的规则用{key}替换。
options参数为匹配结果的映射,比如上例中分区area在路由中为设置,使用默认值为'public',而control直接匹配url中的“{control}”。
reg参数为匹配类型,默认使用规则'[a-zA-Z0-9_-]+',匹配字母数字下划线。在router中声明的规则{key},必须在此设置对于的正则规则。
入口规则:
入口文件为public/index.php。默认使用单一入口规则。当然你也可根据项目设置多域名,多入口,多分区的复合项目。
默认在入口文件需要引入核心文件,并调用初始化方法。示例如下:
require(dirname(dirname(__FILE__)) . '/library/core/core.php');
require_once(ROOT_PATH.'function/sro_function.php');
$_C=core::getInstance();
$_C->gotoAction();
在第一行引入核心文件:项目根目录/library/core/core.php.
第二行引入自定义公共方法,自定义的内容写在这里初始化即生效。因为此时系统还未完成初始化。
第三行调用核心静态方法初始化应用。
第四行调用控制器执行应用。
表模型:
在TB文件夹里面设置所有数据表的映射模型,需要遵循以下规范:
继承父类mtable
初始化表信息
public function __construct()
{
parent::__construct(array('tableName'=>'articles','tableIndex'=>'article_id'));
}
在表模型类的初始化方法中调用父类初始化方法,传递数组参数。此数据包含两项:表名和表的主键。
注意标模型文件名和表模型类名必须一致,并且表模型类名称为:表名+“_TB”
初始化表模型之后,默认可以使用的方法如下:
$this->find($id);//主键查询数据
$this->getcount($where='');//返回数据条数,默认为空,返回表中记录数
$this->getIndexDesc($num,$where='',$columns='');//按照主键降序排列,查询最新数据。$num返回条数,$where查询条件(可空,不包含where关键词),$columns为查询数据列类型是数据(示例:array('id','name'))
$this->getIndexAsc($num,$where='',$columns='');//同上,按照升序排列,查询最早数据。
$this->getAll($num='',$where='',$columns='');//返回查询数据,参数同上。如需返回数据排序,请在$where中声明 order by条件
$this->page($page,$columns,$where);//分页方法。$page第几页,$where查询条件(可空,不包含where关键词),$columns为查询数据列类型是数据(示例:array('id','name'))
$this->insert($data);//插入数据。参数$data为二维数组键值对,array('name'=>'test','tel'=>'123456');
$this->update($data,$where);//更新数据。参数$data为二维数组键值对,array('name'=>'test','tel'=>'123456');$where更新条件
$this->updateIndex($data,$id);//根据主键更新数据。参数$data为二维数组键值对,array('name'=>'test','tel'=>'123456');$id为主键值
$this->delete($where);//删除数据。参数$where删除条件
$this->deleteIndex($id);//根据主键删除数据。参数$id为主键值
伪静态设置:
在入口目录public中必须要做伪静态,导引请求进入入口文件。下面举例Apache的.htaccess设置:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
第一行开启伪静态
第二至五行,规定已有文件不做伪静态
第六行,把非静态请求重定向到入口文件(index.php)。
控制器:
控制器在control中,控制器必须继承父类control。
声明动作后,默认在视图中需要建立对应视图页面。
动作中使用$this->view();方法可以跳转视图,如果不调用此方法,系统调用默认此动作的视图。
也可以在view($acton='',$control='',$area='')方法传递参数做视图跳转。
视图:
现在视图中默认使用php代码输出数据,数据必须在控制器的方法中传入。
在视图中可以使用$this->action('b');调用控制器,会自动载入其中的视图输出内容。

最后:

以前用的是传统的mysql扩展访问数据库,前几天加入了pdo的扩展可选。

支持页面多视图,支持多域名绑定,也可以生成静态页面。。。

基本上的功能都有了,有些功能不好的话也会升级改进。。。

  

posted @ 2015-05-18 17:13  luxwell  阅读(342)  评论(0编辑  收藏  举报

luxwell 全栈进行时。说三道四