一个极简的php框架

文章目录

  • php极简框架
    • 单一入口
    • 路由控制
    • 自动加载
    • 具体实现
    • 后期扩展

php极简框架

使用框架进行更加高效的开发,功能完善的框架能够较大的减少开发的业务量,增强代码的可维护性。近期工作使用到php,实现了一个极简的php框架,在这里总结如下。

一个极简的php框架_第1张图片

  • Common:常用函数的封装
    • Tool.php
  • Ctrl:控制器
    • BaseCtrl.php 基础控制器,包含基本方法
  • Lib:核心方法
    • Loader.php 对方法进行自动注册
  • config.php:配置文件
  • init.php:初始化函数,解析路由
  • index.php:主入口

框架的核心主要包括如下几个部分:

单一入口

整个框架有一个统一的入口,进行路由的分发。所有的请求都是发送到这个文件中,然后进行分发,这样便于集中管理,index.php位于项目的根目录下。

路由控制

所有的请求都指向index.php,后面加上请求的具体参数,包含使用的是那一个控制器的哪一个方法以及一些具体的参数。主流有以下两种方式:

  1. index.php?route=Controller/function
  2. 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(); // 启动程序

后期扩展

  1. 可以封装mysqlredis操作
  2. 可以进行登录验证,在index.php的入口进行控制
  3. 封装一些常用的功能供业务调用

这样就完成了一个极简的php框架了。

你可能感兴趣的:(日常总结,脚本语言)