用tpframe或其它框架的时候,你们都是用什么方式来取内容的呢?每种框架的模式多少有点区别,下面我简单介绍一下几种在模板显示内容的几种方式
第一种:直接连接数据库读取模式
我们常见的就是php原生模式,直接在.php文件里面写html代码,连接数据库取内容,然后进行相应的数据显示,类似于这样的:
<?php
$db = array(
'host' => '127.0.0.1', //设置服务器地址
'port' => '3306', //设端口
'dbname' => 'test', //设置数据库名
'username' => 'root', //设置账号
'password' => 'root', //设置密码
'charset' => 'utf8', //设置编码格式
'dsn' => 'mysql:host=127.0.0.1;dbname=test;port=3306;charset=utf8', //这里不知道为什么,也需要这样再写一遍。
);
//连接
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //默认是PDO::ERRMODE_SILENT, 0, (忽略错误模式)
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认是PDO::FETCH_BOTH, 4
);
try{
$pdo = new PDO($db['dsn'], $db['username'], $db['password'], $options);
}catch(PDOException $e){
die('数据库连接失败:' . $e->getMessage());
}
$stmt = $pdo->prepare("select * from posts where title = ?");
$stmt->bindValue(1,'zhangsan');
$stmt->execute(); //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE
$rows = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<?php
foreach ($rows as $key => $value) {
// 这里面进行处理
}
?>
</body>
</html>
<?php
unset($pdo);
?>
这样的方式运行效率无疑肯定是非常好的,但有非常多的不足,缺占谁用谁知道,我就不在这里说了,因为就有了框架这个玩意
第二种:MVC正常模式
我所谓的MVC正常模式就是指每个MVC框架默认呈现的方式,model取数据,controller转发数据,view显示数据
我想你可能经常使用的就是这种方式,也是大部分人在喜欢用的方式,针对这种我就提一个问题,对于每个页面或大部分页面都要用到的数据,你是怎么处理的呢?
曾经有人给我说每个控制器都去调模型取,是的,没问题,这样不是每个控制器都写了大量的重复代码了吗,因此很多框架采用的方式是用的公共函数,定义一个公共函数实现相应的功能,然后在模板里面直接调用函数,这种方式要比写在控制器里面科学一点
但有些人就问了,我不想写函数,太low了,一定要写类怎么办或其它方式怎么办,接下来的两种方式就可以实现
第三种:模板标签
用过dedecms的人都知道模板标签的好处,在相关的模板调用相应的模板标签就能随便取到我想要的数据,是不是很方便呢,tpframe也定义了这样的模板标签,通过{tpf:posts num='1'}{/tpf:posts} 就能取到一条内容,具体源码可以看tpfcore\taglib\Tpf.php
这样你在模板里面想显示想要的内容的时候,就可以直接通过模板标签来获取,任何地方都可以调取,不限模板位置
第四种:模板从逻辑里直接拉取
这种模式就是在模板里面直接取数据,跟第一种模式类似,只是这种只数据相关的逻辑独立了出去,达到模板不通过控制器转发就能取数据的目的,同时逻辑也得到了共用(多个模板都要取相应的数据情况),所以这也是我比较喜欢的一种模式,tpframe就实现了这样的模式,例如取文章,所先我们要定义好相应的取文章逻辑功能,例如在 app\frontend\logic\Posts里定义如下逻辑:
public function getPosts($data=[]){
return self::getList($data);
}
这里只是举例说明一下,实际情况你可以写得更灵活
接着在你的模板里面就可以像这样来调用这个逻辑
<ul class="list-unstyled">
{volist name=':Core::loadAction("Posts/getTpfPosts",["data"=>["where"=>["isdelete"=>0,"type"=>1],"field"=>"__POSTS__.id,__POSTS__.title,__POSTS__.updatetime,__POSTS__.author,__POSTS__.source,__POSTS__.view,__POSTS__.reply,__USER__.headimg","join"=>["join"=>"__USER__","condition"=>"__POSTS__.uid=__USER__.id"],"order"=>"updatetime DESC","limit"=>10]])' id="vo"}
<li>
<p class="clearfix">
<a href="{:url('Posts/show',['id'=>$vo.id])}" class="pull-left" target="_blank">{$vo.title|StringHelper::msubstr=0,36}</a>
<span class="text-muted pull-right">{$vo.updatetime|date='m-d H:i',###}</span>
</p>
</li>
{/volist}
</ul>
看上去有点复杂,实际上很简单,用的是模型里面灵活的getList方法来获取数据,里面用到了Core里面的loadAction方法来直接调用逻辑,参数data表示直接向逻辑方法的参数data传递参数,里面的参数就是取数据要用到的
这种方式是最灵活的,类似于标签去取数据,只是这种我们少了运用标签的那一步,比标签更灵活
后面三种方式在tpframe框架里面都是可以运用的,根据习惯你可以选择当中的一种,如果你有更好的方法或建议可给我们留言~,先介绍在这里
文章由tpframe社区发布,禁止转载,谢谢合作