php极简框架
使用框架进行更加高效的开发,功能完善的框架能够较大的减少开发的业务量,增强代码的可维护性。近期工作使用到php,实现了一个极简的php框架,在这里总结如下。
- Common:常用函数的封装
- Tool.php
- Ctrl:控制器
- BaseCtrl.php 基础控制器,包含基本方法
- Lib:核心方法
- Loader.php 对方法进行自动注册
- config.php:配置文件
- init.php:初始化函数,解析路由
- index.php:主入口
框架的核心主要包括如下几个部分:
单一入口
整个框架有一个统一的入口,进行路由的分发。所有的请求都是发送到这个文件中,然后进行分发,这样便于集中管理,index.php
位于项目的根目录下。
路由控制
所有的请求都指向index.php
,后面加上请求的具体参数,包含使用的是那一个控制器的哪一个方法以及一些具体的参数。主流有以下两种方式:
index.php?route=Controller/function
index.php?c=controller&a=action
分别带上对应的控制器和方法,两种方式只是最终解析的方式不同。
自动加载
在php中有一个自动注册的函数spl_autoload_register
,当我们实例化一个类时,如果无法找到当前类的定义,就会调用spl_autoload_register
的回调函数,去固定的目录下找到类的定义,进行require
,十分便捷。
具体实现
- 统一入口
所有的请求都是指向index.php
- 取出路由参数
首先从路由参数中取出具体的控制器和方法 - 实例化控制器和方法,实现逻辑
主要使用反射方法,找到是否有对应类和方法,自动注册
如果有对应方法,传递参数到对应方法并返回
# init.php
Loader::register(); // 自动注册
class Init
{
public static function initRun()
{
if($route = Tool::getParam('route')){
$res = explode("/", $route);
Tool::unsetParam('route');
if(count($res)!=2){
Tool::TlogExit('route input error');
}else{
$model = ucfirst(strtolower($res[0])).'Ctrl';
$action = ucfirst(strtolower($res[1])).'Action';
}
}
Tool::Tlog('model and actions: '.$model.' '.$action);
if(method_exists($model, $action))
{
$method = new ReflectionMethod($model, $action);
$params = $method->getParameters();
$values = []; // 参数数组
foreach($params as $k=>$val)
{
if(Tool::getParam($val->name)){
$values[] = Tool::getParam($val->name);
}else{
// 检查是否有默认值
$p = new ReflectionParameter([$model, $action], $val->name);
if($p->isDefaultValueAvailable()){
$values[] = $p->getDefaultValue();
}else{
Tool::TlogExit('parameter not request'); // 没有找到参数
}
}
}
call_user_func_array([$model, $action], $values);
}else{
Tool::TlogExit('action or model error');
}
}
}
# loader.php
class Loader
{
public static function register()
{
spl_autoload_register(array('Loader', 'appAutoload'));
}
public static function appAutoload($className)
{
$appCommonFile = COMMON_PATH . $className . '.php';
$appLibFile = LIB_PATH . $className . '.php';
$appCTRLFile = CTRL_PATH . $className . '.php';
if (!class_exists($className)) {
if (is_file($appCommonFile)) {
require_once $appCommonFile;
} else if (is_file($appLibFile)) {
require_once $appLibFile;
} else if (is_file($appCTRLFile)) {
require_once $appCTRLFile;
}
}
}
}
# index.php
Init::initRun(); // 启动程序
后期扩展
- 可以封装
mysql
和redis
操作 - 可以进行登录验证,在
index.php
的入口进行控制 - 封装一些常用的功能供业务调用
这样就完成了一个极简的php框架了。