今天使用thinkphp的cli模式,折腾了半天,总是出现错误,并且跳转到空模块下,或者出现Action中方法无法使用的错误。经查看源码,发现thinkphp的cli模式不支持模块分组,而且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模式下,参数都是区分大小写的,所以,在写命令行时,分组名,模块名,方法名均需要区分大小写
传参 Mongodb snoopy调用还有点问题