Warning: Error while sending QUERY packet. PID=5678 in /home/wwwroot/coco/domain/cnlamp/web/wp-includes/wp-db.php on line 1924 thinkphp模块分组后,cli模式无法使用的调整方法 | LAMP新闻|技巧|经验|资讯站
现在的位置: 首页PHP>正文
thinkphp模块分组后,cli模式无法使用的调整方法
发表于6年前 PHP 评论数 2

今天使用thinkphpcli模式,折腾了半天,总是出现错误,并且跳转到空模块下,或者出现Action中方法无法使用的错误。经查看源码,发现thinkphpcli模式不支持模块分组,而且Action是重写的,比标准模式下的Action简化了很多。Cli模式下Action类中的方法使用不多,暂且不用管他,主要来调整一下,让cli模式支持模块分组

进入Thinkphp的核心目录,找到文件App.class.php,具体路径是:Extend/Mode/Cli/App.class.php
第一步,获取GROUP_NAME

大约是38行开始:

define('MODULE_NAME',   !empty($params)?array_shift($params):C('DEFAULT_MODULE'));   
define('ACTION_NAME',  !empty($params)?array_shift($params):C('DEFAULT_ACTION'));

修改为:

// 取得模块和操作名称
if(C('APP_GROUP_LIST')) {
    define('GROUP_NAME',   !empty($params)?array_shift($params):C('DEFAULT_GROUP'));
    define('MODULE_NAME',  !empty($params)?array_shift($params):C('DEFAULT_MODULE'));
    define('ACTION_NAME',  !empty($params)?array_shift($params):C('DEFAULT_ACTION'));
}
else{
    define('MODULE_NAME',  !empty($params)?array_shift($params):C('DEFAULT_MODULE'));
    define('ACTION_NAME',  !empty($params)?array_shift($params):C('DEFAULT_ACTION')); 
}

这是URL_MODEL = 1的修改
下面还有URL_MODEL!=1的时候,将下面else中的内容替换为:

// 取得模块和操作名称
if(C('APP_GROUP_LIST')) {
    define('GROUP_NAME',   isset($_SERVER['argv'][1])?$_SERVER['argv'][1]:C('DEFAULT_GROUP'));
    define('MODULE_NAME',   isset($_SERVER['argv'][2])?$_SERVER['argv'][2]:C('DEFAULT_MODULE'));
    define('ACTION_NAME',    isset($_SERVER['argv'][3])?$_SERVER['argv'][3]:C('DEFAULT_ACTION'));
    if($_SERVER['argc']>4) {
        // 解析剩余参数 并采用GET方式获取
         preg_replace('@(\w+),([^,\/]+)@e', '$_GET[\'\\1\']="\\2";', implode(',',array_slice($_SERVER['argv'],4)));
    }
}
else{
    define('MODULE_NAME',   isset($_SERVER['argv'][1])?$_SERVER['argv'][1]:C('DEFAULT_MODULE'));
    define('ACTION_NAME',    isset($_SERVER['argv'][2])?$_SERVER['argv'][2]:C('DEFAULT_ACTION'));
    if($_SERVER['argc']>3) {
        // 解析剩余参数 并采用GET方式获取
        preg_replace('@(\w+),([^,\/]+)@e', '$_GET[\'\\1\']="\\2";', implode(',',array_slice($_SERVER['argv'],3)));
     }
}

第二步:修改$model

$module  =  A(MODULE_NAME);

修改为

if(C('APP_GROUP_LIST')) {
    $module  =  A(GROUP_NAME."/".MODULE_NAME);
}
else{
    $module  =  A(MODULE_NAME); 
}

说明:

1、修改的版本是Thinkphp3.0,如果是其他版本,可能有些出入,请对比代码自行修改 。
2、cli模式下,参数都是区分大小写的,所以,在写命令行时,分组名,模块名,方法名均需要区分大小写。

给我留言

留言无头像?


×
腾讯微博