介绍
介绍
隔了几天时间,福哥终于有时间了继续推进我们的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)来展示给用户,这里面只有模型层才会去连接数据库。