同福

做个web框架(10)——模型Model(三)TFModel对象的实现【20201105】

介绍

介绍

隔了几天时间,福哥终于有时间了继续推进我们的TFPHP框架的进程了。今天我们继续设计模型模块,上一课我们已经完成了TFDO对象的设计,有了数据连接能力之后就可以进行模型对象TFModel的基本架构的设计了。

大家都知道,模型对象TFModel是用来读取/写入数据的,所以我们需要在TFModel里面进行TFDO对象的初始化操作。但是TFDO对象初始化需要知道连接数据库的各种参数,这些参数是根据项目运行环境而变化的。所以,我们还需要一个地方可以保存项目的环境参数,然后在TFModel里面调用这些环境参数。那么福哥就在TFPHP的System下面建立了一个TFConfig对象,用来设置项目的环境参数。

代码

TFConfig

getGroup

private static function getGroup(string $group):string {
    if($group == null){

        return "default";
    }

    return $group;
}

set

public static function set(string $key, $value, string $group=null){
    $group = TFConfig::getGroup($group);
    TFConfig::$items[$group][$key] = $value;
}

get

public static function get(string $key, string $group=null){
    $group = TFConfig::getGroup($group);

    return TFConfig::$items[$group][$key];
}

TFModel

init

protected function init(){

}

讲解

现在我们来对TFModel对象的设计讲解一下。

TFConfig

配置对象,程序文件保存在System\TFConfig.inc.php。

getGroup

获取配置分组$group的值,如果传入值为null则设置为默认分组。

set

设置配置参数,可以通过$group分组值进行分组,不同分组可以有相同名称的参数。

get

获取配置参数,可以通过$group分组值进行分组,不同分组可以有相同名称的参数。

TFModel

模型对象基类,程序文件保存在Model\TFModel.inc.php。

init

这个方法是一个空方法,是用来给继承TFModel的具体项目模型对象重载使用的,它会对模型对象进行一些初始化的处理。

使用

下面我们来使用TFConfig和TFModel应用到WEB-INF默认项目里面。

项目自动加载器

建立WEB-INF/Autoload.inc.php程序文件,写入如下内容:

define('FRAMEWORK_DEMO_ROOT_PATH', __DIR__. "/");

function TFPHP_Demo_Autoload(string $class):bool {
    $classPath = FRAMEWORK_DEMO_ROOT_PATH. substr(str_replace("\\", "/", $class), 11). FRAMEWORK_CLASS_EXTENSION;
    if(file_exists($classPath)){
        include_once ($classPath);

        return true;
    }

    return false;
}

spl_autoload_register("TFPHP_Demo_Autoload");

配置参数

建立WEB-INF/Config.inc.php程序文件,写入如下内容:

use TFPHP\System\TFConfig;

TFConfig::set("mysql", array(
    'host'=>"127.0.0.1",
    'port'=>3306,
    'user'=>"root",
    'pass'=>"abcdef",
    'db'=>"tfse",
    'charset'=>"utf8",
), "db");

建立模型

默认模型

建立WEB-INF/Classes/DefaultModel.inc.php程序文件,写入如下内容:

namespace TFPHP\Demo\Classes;

use TFPHP\Database\SQL\TFDO;
use TFPHP\Model\TFModel;
use TFPHP\System\TFConfig;

class DefaultModel extends TFModel{
    protected TFDO $TFDO;

    public function __construct(){
        parent::__construct();
    }

    protected function init(){
        $mysqlArgv = TFConfig::get("mysql", "db");
        $this->TFDO = new TFDO(
            TFDO::T_MYSQL,
            $mysqlArgv["host"],
            $mysqlArgv["port"],
            $mysqlArgv["user"],
            $mysqlArgv["pass"],
            $mysqlArgv["db"],
            $mysqlArgv["charset"]
        );
        $this->TFDO->connect();
    }
}

website模型

建立WEB-INF/Model/website.inc.php程序文件,写入如下内容:

namespace TFPHP\Demo\Model;

use TFPHP\Demo\Classes\DefaultModel;

class website extends DefaultModel{
    public function __construct(){
        parent::__construct();
    }

    public function getByDomainName($domainName){
        $row = $this->TFDO->fetchOne("select * from websites where domainName = @str", array($domainName));

        return $row;
    }
}

控制器

index控制器

修改WEB-INF/Controller/index.inc.php程序文件,写入如下内容:

use TFPHP\Controller\Page\TFController;
use TFPHP\Demo\Model\website;

class PageController extends TFController{
    protected function process(){
        $myWebsite = new website();

        $website = $myWebsite->getByDomainName("tongfu.net");
        var_dump($website);
    }
}

f284ce1006a93777.jpg

总结

今天我们建立了模型模块的基础对象Model/TFModel,但是这个对象是一个空对象,里面没有任何具体逻辑。真正的逻辑是在WEB-INF/Model/website模型对象里面实现的,而WEB-INF/Model/website又是继承自WEB-INF/Classes/DefaultModel模型对象。

  • 项目模型对象实现具体模型需要的逻辑

  • 项目默认模型对象用来实现模型对象全局处理逻辑

  • 框架模型对象为基础功能

使用MVC分层之后,控制器层(Controller)只负责将模型层(Model)提取的数据传递给视图层(View)来展示给用户,这里面只有模型层才会去连接数据库。