THINKPHP中D方法调用逻辑层类

作者:袖梨 2022-06-25

ThinkPHP的D函数十分强大,一般情况下用D方法最多的情况是实例化自定义模型类,实现数据库相关的操作,但是D方法的功能远远不仅于此,D方法还可用于逻辑层,服务层自定义类的实例化。

调用格式如下:

D('[项目://][分组/]模型','模型层名称')

关于D方法的一般用法本文不再描述,就是常见的D(‘User’)实例化Model下面的UserModel.class.php。


我们在LIB_PATH,也就是和Controller(以前版本叫Action),Model文件夹同级的目录建立Logic或者Service文件夹。

ThinkPHP分层模型逻辑层

在Logic文件夹中新建文件UserLogic.class.php,作为用户逻辑业务的一个类,那么实例化这个类的时候,可以用tp自带的D方法,如下:


D('User','Logic');

这样就调用Logic文件夹下的UserLogic.class.php文件并实例化class UserLogic,专业一点的说法是D方法支持分成模型并实例化自定义类。这里的分层模型指的就是Logic和Service这样的目录。

注:分层模型从ThinkPHP 3.1版本开始支持。

我们来看看ThinkPHP D方法的源码:


/**
 * D函数用于实例化模型类 格式 [资源://][模块/]模型
 * @param string $name 资源地址
 * @param string $layer 模型层名称
 * @return Model
 */
function D($name='',$layer='') {
    if(empty($name)) return new ThinkModel;
    static $_model  =   array();
    $layer          =   $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,'/')){
        // 自动加载公共模块下面的模型
        $class      =   '\Common\'.$layer.'\'.$name.$layer;
        $model      =   class_exists($class)? new $class($name) : new ThinkModel($name);
    }else {
        ThinkLog::record('D方法实例化没找到模型类'.$class,ThinkLog::NOTICE);
        $model      =   new ThinkModel(basename($name));
    }
    $_model[$name.$layer]  =  $model;
    return $model;
}

当然,我们也可以重新写个调用分层模型中自定义类的方法,如:

/**
 * 业务逻辑层调用函数
 * @param string $name 业务模型名称
 * @return object
*/
function logic($name){
    static $_obj=array();
    $layer='Logic';
    $class=$name.$layer;
    if(isset($_obj[$name])){
        return $_obj[$name];
    }
    require LIB_PATH."{$layer}/".$class.'.class.php';
    $_obj[$name] = new $class($name);
    return $_obj[$name];
}

写到tp公共函数中,以后调用Logic分层模型(实际上就是这个文件夹)下的自定义类就可以直接这样用:Logic(‘User’)就ok了。

相关文章

精彩推荐