介绍
介绍
隔了几天时间,福哥终于有时间了继续推进我们的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);
}
}
总结
今天我们建立了模型模块的基础对象Model/TFModel,但是这个对象是一个空对象,里面没有任何具体逻辑。真正的逻辑是在WEB-INF/Model/website模型对象里面实现的,而WEB-INF/Model/website又是继承自WEB-INF/Classes/DefaultModel模型对象。
项目模型对象实现具体模型需要的逻辑
项目默认模型对象用来实现模型对象全局处理逻辑
框架模型对象为基础功能
使用MVC分层之后,控制器层(Controller)只负责将模型层(Model)提取的数据传递给视图层(View)来展示给用户,这里面只有模型层才会去连接数据库。