Skip to content

helpManual controller

tolizhan edited this page May 1, 2025 · 14 revisions

控制层核心

of::dispatch($class = null, $action = null, $check = false) 调度入口, 触发of::dispatch事件

  • classstring, null
    读取调度或设置类名称, null(默认)=读取调度{"class" : 类名, "action" : 方法}, 字符串=("class" | "action")读取调度值
  • actionstring
    调用的方法名, null(默认)=读取调度, 字符串=设置方法名
  • check
    加载类返回值校验,false=永不通过,null=永远通过
<?php
/**
 * 如果加载'/demo/ofControllers.php'的返回值通过check, 便new对象后调用index方法
 * 返回 index 方法的返回值
 */
$result = of::dispatch('demo_ofControllers', 'index', 'allow');
if( is_array($result) ) {
    echo json_encode($result);                                         //ajax + hmtl 方式开发很有用
}
/**
 * 返回值为{'class': 'demo_ofControllers', 'action' => 'index'}
 */
of::dispatch();
/**
 * 修改调度信息
 */
of::dispatch('demo_test', 'demo', false);

of::config($name = null, $default = null, $format = 'off') 读取config数据, 返回值,失败返回$default

  • namestring
    配置名,以'.'分割读取深层数据
  • default
    默认值,没读到数据时,替换原值做为以后使用
  • actionstring
    附属动作
     
        0=无任何操作
        1=读取到的数据格式化成磁盘路径
        2=读取到的数据格式化成网络路径
        4=本次使用实时配置读取数据
<?php
of::config('_of.xx.cc');    //读取框架变量['xx']['cc']的值

&of::event($key, $event, $params = null) 为类提供回调事件, 触发时返回一个数组包含所有触发返回的数据,管理时返回事件数据,其它无返回值

  • keystring
    事件类型
  • eventbool, null, asCall
    true=触发事件,false=删除事件,null=管理事件,其它=添加事件(符合回调结构)
  • formatstring
    添加时=true为特殊结构,删除时=指定删除的回调,触发时=自定义参数[_]键的值,默认null
<?php
/**
 * 框架内部事件说明如下 :
 * of::halt             代码执行结束后回调
 * of::error            自定义异常或错误
 *     触发参数 : 对象=异常对象, 数组=指定错误 {
 *          "code" : 错误代码, 默认 E_USER_NOTICE
 *          "info" : 错误描述, 默认 "Unknown error"
 *          "file" : 文件路径, 默认 代码触发文件
 *          "line" : 错误行数, 默认 代码触发行数
 *     }
 * of::dispatch         调度信息变化时调用
 *     触发参数 : {
 *          "class"  : &调度类名
 *          "action" : &调度方法
 *          "check"  : &校验参数
 *     }
 * of::loadClass        加载新类前调用      应用演示
 *     注册参数 : {
 *          "filter" :*匹配的类前缀触发回调
 *          "router" : 路由模式, 映射前缀,字符串=类前缀替换该字符串(第一个字符不为"/"时会把"_"替换为"/"做为寻类路径)
 *          "asCall" : 回调模式, 函数回调,不能与router共存
 *          "params" : 回调参数,用[_]键指定触发参数位置
 *     }
 *     触发参数 : 回调模式下生效 {
 *          "name" : 类名
 *          "code" :&代码, 更改执行的代码, null=不更改
 *          "file" :&路径, 更改代码的路径, null=不更改
 *     }
 * of_view::display     加载视图模板前触发
 *     触发参数 : {
 *          "tplDir"  : &加载的模板路径
 *          "viewObj" : of_view对象
 *     }
 * of_db::rename        重命名指定连接池
 *     触发参数 : {
 *          "oName" : 旧名称
 *          "nName" : 新名称
 *     }
 * of_db::before        sql语句执行前触发
 *     触发参数 : {
 *          "sql"  : &sql语句
 *          "pool" : 连接池键
 *     }
 * of_db::after         sql语句执行后触发
 *     触发参数 : {
 *          "sql"    : &sql语句
 *          "pool"   : 连接池键
 *          "result" : &执行的结果集
 *     }
 * of_db::error         sql出现错误时回调
 *     触发参数 : {
 *          "code" : 错误编码
 *          "info" : 错误信息
 *          "note" : 详细日志
 *          "sql"  : &sql语句
 *          "pool" : 连接池键
 *     }
 * of_base_htmlTpl_engine::compile     编译模版引擎前触发
 *     触发参数 : {
 *          "tplObj" : &模板的hParse对象
 *          "tplDir" : 模版的磁盘路径
 *     }
 * of_base_error_writeLog::error     发生错误时触发
 *     触发参数 : {
 *          "type" : 错误来源, 其中一个(js, php, mysql)
 *          "data" : 错误信息
 *     }
 *     回调返回 :
 *          true=接替日志记录, 框架不记录日志
 * of_base_com_net::before     请求开始前触发
 *     触发参数 : {
 *          "params" :&请求参数 {
 *              "type"    : 交互类型(大写字符串)可以是 OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE
 *              "data"    : 报文主体数据(字符串)
 *              "get"     : get数据(字符串)
 *              "cookie"  : cookie数据(字符串)
 *              "header"  : 自定义头信息(字符串)
 *              "timeout" : [连接超时, 响应超时]
 *              "url"     : 访问路径(字符串)

               其它调用调用参数            }       }   of_base_com_net::after     请求结束后触发       触发参数 : {            "params" :&请求参数, 同"of_base_com_net::before事件"结构            "result" :&请求结果, 同"of_base_com_net::request"响应结构       }  */

/**   事件列表结构如下($event为null时会返回对应事件类型的引用) : {       事件类型 : {           "change" : 添加删除时会变true           "list"   : [{               "isCall" : true=是回调类型,false=特殊结构               "event"  : 回调事件               "change" : 新加时会为true           }]       }   }  */

  • namestring
    方法名, 可以用 &name 来表示返回引用
  • argsstring
    参数列表, 参考 create_function
  • codestring
    方法体, 参考 create_function
  • staticbool
    是否为静态函数, true=静态, false=动态

of::work($code, $info = '', $data = array()) 管理工作流程

参数使用说明
描述 : 管理工作流程, 独立的 时间 队列 错误及事务, 让代码更简洁
     工作可以嵌套, 产生任何错误, 事务都会回滚, 避免无意的嵌套, 每个工作都会占用独立数据库连接资源
     可以使用 try catch 或 回调方式 开始一个工作
     可以获取 当前工作开始时间 与 产生的错误
     可以抛出 工作异常 并通过捕获简化代码逻辑
参数 :
    #开启工作(数组, null)
     code : 监听数据库连接, 产生问题会自动回滚, 数组=[连接池, ...], null=自动监听
     info : 功能参数
         int=增加数据监控, 0为当前工作, 1=父层工作..., 指定工作不存在抛出异常
         框架回调结构=回调模式创建工作, 不需要 try catch, 回调接收(params)参数 {
                 "result" : &标准结果集
                 "data"   : &标准结果集中的data数据
             }
             返回 false 时, 回滚工作, 等同 of::work(200, 'Successful', params['data'])
             返回 array 时, 赋值data, 等同 params['data'] = array;
     data : null=启动集成工作, 统一监听子孙工作事务, 启动时自动设置自动监听

    #结束工作(布尔)      code : 完结事务, true=提交, false=回滚

    #抛出异常(数字)      code : 问题编码, [400, 600)之间的数字      info : 提示信息      data : 扩展参数, 一个数组

    #捕捉异常(对象)      code : 异常对象, 通过 try catch 捕获的异常

    #获取时间(文本)      code : 固定"time"      info : 返回时间格式, 默认2=格式化时间, 1=时间戳, 3=[时间戳, 格式化, 时区标识, 格林时差]

    #操作错误(文本)      code : 固定"error"      info : 默认true=获取错误, false=清除错误

    #全局排除监听(文本)      code : 固定"block"      info : 排查的监听列表, {          "数据库连接池" : true=排除, false=移除          ...      }

    #工作信息(文本)      code : 固定"info"      info : 获取指定"info"信息, 默认=3(1 | 2), 1=工作ID, 2=监听数据库, 4=注入回调信息

    #延迟回调(文本) 在工作事务提交前按队列顺序执行      code : 固定"defer"      info : 回调方法接收参数结构 {"wuid" : 工作ID, "isOk" : true=最终提交 false=最终回滚}          true = 读取指定标识的回调          false = 删除指定标识的回调          框架回调结构 = 不开启工作直接回调, 若报错将影响当前工作执行结果          {"onWork" : 监听数据库, "asCall" : 框架回调, "params" :o回调参数} = 在新工作中回调      data : 回调唯一标识, 默认=随机标识, 字符串=指定标识

    #完成回调(文本) 在工作事务提交后按队列顺序执行      code : 固定"done"      info : 回调方法接收参数结构 {"wuid" : 工作ID, "isOk" : true=最终提交 false=最终回滚}          true = 读取指定标识的回调          false = 删除指定标识的回调          框架回调结构 = 不开启工作直接回调, 若报错将影响父级工作执行结果          {"onWork" : 监听数据库, "asCall" : 框架回调, "params" :o回调参数} = 在新工作中回调      data : 回调唯一标识, 默认=随机标识, 字符串=指定标识 返回 :     #开启工作(数组)      失败抛出异常, 成功 {"code" : 200, "info" : "Successful", "data" : []}

    #结束工作(布尔)      失败抛出异常

    #抛出异常(数字)      抛出工作异常

    #捕捉异常(对象)      其它异常继续抛出, 为工作异常返回 {          "code" : 异常状态码          "info" : 提示信息          "data" : 问题数据      }

    #获取时间("time")      返回当前工作的开始时间, 未在工作中抛出异常

    #操作错误("error")      未在工作中依然生效, 没错误返回null, 有错误返回 {          "code" : 编码,          "info" : 错误,          "file" : 路径,          "line" : 行数,          ...      }

    #全局排除监听("block")      排查的监听列表 {          "数据库连接池" : true          ...      }

    #工作信息("info")      不在工作中返回 null      指定项存在, 返回项信息, 单项返回值, 多项返回数组 {              1"wuid"  : 工作ID,              2"list"  : [监听连接池, ...],              4"defer" :&{回调ID : 回调信息, ...}              4"done"  :&{回调ID : 回调信息, ...}          }

    #延迟回调("defer")     #完成回调("done")      info为true时, 返回回调信息, 不存在返回null, 不在工作中抛出异常 注明 :      返回的状态码一览表          500 : 发生内部错误(代码报错)

回调用法演示(推荐)
//开始工作, 动态开启SQL事务, $params 结构 {"result" : &接口响应结构, "data" : &标准结果集中的data数据}
$result = of::work(null, function ($params) {
    //$params['result'] 数据 {"code":200,"info":"Successful","data":[]}
    echo '实参数据: ', json_encode($params['result']), "&ltbr&gt\n";
    //修改结果集数据
    $params['data'] = array(1, 2, 3);

    //生成一个演示错误     trigger_error('产生一个错误');     //无错误返回 null, 否则返回 {"code" : 编码, "info" : 错误, "file" : 路径, "line" : 行数, ...}     echo '是否产生错误: ', of::work('error') ? '是' : '否', "&ltbr&gt\n";     //清除当前工作错误     of::work('error', false);

    //添加延迟调用到工作结束前(依然在事务中)     of::work('defer', array(         'onWork' => array(),         'asCall' => 'var_dump',         'params' => array(             "\n<br>执行延迟回调: "         )     ), METHOD);

    //添加完成调用到工作结束前(在父级工作中)     of::work('done', array(         'onWork' => of::work('info', 'list'),         'asCall' => 'var_dump',         'params' => array(             "\n<br>执行完成回调: "         )     ), METHOD);

    //不在工作中返回 null, 反之返回 {"list" : [监听连接池, ...]}     echo '是否在工作中: ', of::work('info') ? '是' : '否', "&ltbr&gt\n";

    //查询工作时间     echo '工作开始时间: ', of::work('time'), "&ltbr&gt\n";     echo '工作开始时间戳: ', of::work('time', 1), "&ltbr&gt\n";

    //抛出可捕捉异常     of::work(401, '工作异常不会抛错', array(4, 5, 6));     //返回 false 回滚工作, 不写产生错误时回滚, 返回 array 等同赋值到 $params['data']     return false; });

//打印结果集 {"code"401,"info":"工作异常不会抛错","data":[4,5,6]} echo json_encode($result);

常规用法演示
try {
    //开始工作, 会启动"default"事务, 返回 {"code" : 200, "info" : "Successful", "data" : []}
    $result = of::work(array('default'));

    //演示两种不同异常     of::work(401, '工作异常不会抛错', array(1, 2, 3));     throw new Exception('常规异常会被记录');

    //完结工作, true=提交事务, false=回滚事务, 失败会抛出常规异常     of::work(true); } catch (Exception $e) {     //捕获异常, 常规异常记录日志, 返回"接口响应结构"     $result = of::work($e); }

//打印结果级 echo '<br>工作完成结果: '; print_r($result);

&of::slashesDeep(&$data, $func = 'addslashes') 深度加/删反斜杠, 返回 $data 引用

  • datastring, array
    指定替换的数据
  • funcstring
    addslashes=添加反斜线, stripslashes=删除反斜线

&of::arrayReplaceRecursive(&$baseData, &$replace) 深度替换属性, 返回$baseData

  • baseData
    被替换的数据
  • replace
    替换的数据

of::callFunc(&$call, $params = null, $return = error) 回调函数, 返回 调用函数 返回的数据

  • callarray, 一般来自监听事件
    调用函数的信息有四种写法 :
    1. 符合 is_callable 格式的, 如 匿名方法, "class::action" 或 [object, action]
    2. 每次调用创建对象的格式, 如 [class, action], 会将会创建class的对象
    3. 自定义调用的信息 {
        "asCall" : 符合上面两种规范
        "params" : call_user_func_array 格式的参数,用[]键指定类名位置,默认最后一位 array(
            自定义参数一,
            自定义参数二,
            '' => null,    //params的参数会传到此处
            自定义参数三,
    }
    4. 含"."的字符串, 会从of::config中读取对应配置后按上述格式解析, 配合动态配置更灵活
    //调用函数
    $call = 'action';
    //调用静态方法
    $call = 'className::action';
    //调用动态方法
    $call = array(new className, 'action');
    //实例化类后调用动态方法
    $call = array('className', 'action');
    //自定义参数写法
    $call = array(
        'asCall' => 上述四种写法
        'params' => array(
            自定义参数一,
            '' => null,
            自定义参数三
        )
    );
    //实例演示
    function action($a = 'a', $b = 'b', $c = 'c') {
        echo $a, $b, $c;
    }
    of::callFunc('action', '-');                        //输出: -bc
    of::callFunc(array(                                 //输出: m-n
        'asCall' => 'action',
        'params' => array('m', '' => 0, 'n')           //""键为"-"参数的位置
    ), '-');
    
  • params一般来自触发事件
    传入到 [] 位置的参数
  • return
    指定无法回调的返回值, 不指定调用失败时报错

of::formatPath($path, $prefix) 格式化路径

  • pathstring
    指定格式化的路径,''开头的去掉'',其它字符以加上指定前缀,数组则以回调的返回值为值
  • prefixstring
    path不以'_'开头字符串的前缀

&of::getArrData($key, &$data = null, $default = null, $extends = 0) 通过字符串获取数组深度数据

  • keystring, array
    null(默认)=返回 data, 字符串=以"."作为分隔符表示数组深度, 数组=以数组的方式代替传参[key, data, default, isEscape]
  • dataarray
    被查找的数组
  • defaultmixed
    没查找到的代替值(null)
  • extendsint
    扩展参数, 使用"|"连接多个功能, 0(默认)=不转义, 1=以"`"作为key的转义字符, 2=默认值赋值到原数据

&of::syntax($code, $exec = false, $tips = false, &$data = null) 校验php语法

  • codestring
    检查的代码, 符合 eval 的规范
  • execbool
    是否执行 false=不执行, true=执行, 字符串=执行且指定文件路径
  • tipsbool string
    是否显示行号源码 false=不显示, true=显示
  • datamixed
    执行时返回的数据
<?php
/**
  语法通过返回 null
  语法失败返回 {
      "info" : 错误信息
      "line" : 错误行数
      "tips" : 按 tips 参数显示的代码
  }
 */
of::syntax('if');     // {"info":"syntax error, unexpected $end, expecting '('","line":1}
of::syntax('echo FILE;', 'file.php');     // file.php
Clone this wiki locally