Skip to content

D 方法实例化 Model 时查找 Model 的问题

🏷️ ThinkPHP

版本是 ThinkPHP3.2.2

如果当前模块名是 Test,使用 D('test_test') 时查找的 Class 名是 Test/Model/TestTestModel;

Test/Model 下没有对应的 Model,自动去 Common 目录下查找时,查找的 class 名却是 Common/Model/test_testModel

对应方法

暂时的对应方法是将 '\\Common\\'.$layer.'\\'.$name.$layer 改为 '\\Common\\'.$layer.'\\'.parse_name($name, 1).$layer

修改后 D 方法

php
/**
 * 实例化模型类 格式 [资源://][模块/] 模型
 * @param string $name 资源地址
 * @param string $layer 模型层名称
 * @return Model
 */
function D($name='',$layer='') {
    if(empty($name)) return new Think\Model;
    static $_model  =   array();
    $layer          =   $layer? : C('DEFAULT_M_LAYER');
    if(isset($_model[$name.$layer]))
        return $_model[$name.$layer];
    $class          =   parse_res_name($name,$layer);
    if(class_exists($class)) {
        $model      =   new $class(basename($name));
    }elseif(false === strpos($name,'/')){
        // 自动加载公共模块下面的模型
        if(!C('APP_USE_NAMESPACE')){
            import('Common/'.$layer.'/'.$class);
        }else{
//             $class      =   '\\Common\\'.$layer.'\\'.$name.$layer;
            $class      =   '\\Common\\'.$layer.'\\'.parse_name($name, 1).$layer;
        }
        $model      =   class_exists($class)? new $class($name) : new Think\Model($name);
    }else {
        Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE);
        $model      =   new Think\Model(basename($name));
    }
    $_model[$name.$layer]  =  $model;
    return $model;
}