完美搞定ThinkPHP5.1的前后端公共交互
首先:
那么写标题,完全是看了标题党怎么玩标题才故意那么写一次标题,测试一下标题党到底有多大的诱惑
这里所指的公共模板,不是嵌套进来的那种模板
而是公用的整张页面提供给不同的模块或者模型使用
基本的样式是固定的比如地图一类的模板
方法:
首先我们知道调用别的控制器下面的模板的方法是
return $this->fetch('控制器名/模板名');
return $this->fetch('模块名@控制器名/模板名')
但是如果我们调用的是一个已经设定好渲染方法的控制器呢?
其实也差不多
但是这里是有区别的如果 在同一模块下如下代码
说明一下:
控制器1是直接输出的方法 ,控制器2是已经固定的模板样式
在控制器2中 不使用 “控制器名/模板名” 的格式的话
在控制器1中调用控制器2的方法就会出现找不到模板
还有一点需要注意的是这两个控制器中的方法
必须都使用return
返回数据
这里很容易在控制器1中不记得return
记住这里是调用方法
掉用方法并不会让方法里面的方法直接渲染出页面
必须要做本方法中来返回渲染页面的数据才能正常的页面渲染出来,否则就是空页面
//控制器1 实际要输出的页面
public function getfabricmap(){
return $this->getCoord($this->table_fabric);
}
//控制器2 已经渲染好的页面和方法
public function getCoord($table){
$res = Db::name($table)->find(input('get.id'));
return $this->fetch('basemap/getcoord',[
'data'=>$res
]);
}
补充
如果是跨模块使用的的话就需要使用到@
符号来设置已经确定的渲染方式
//map是模块 basemap是公用控制器 getcoord是公用的模板
public function getCoord($table){
$res = Db::name($table)->find(input('get.id'));
return $this->fetch('map@basemap/getcoord',[
'data'=>$res
]);
}
知识点
- 引用公用控制器渲染页面方法的
控制器方法
必须使用return - 编辑公用控制器渲染方法时必须输入完整模板路径,跨模块时必须连同模块名一起,就算模板中当前控制器下也要输入完整
拓展知识
如果这种类型的应用方式需要渲染的同时还要接收数据
这里需要注意的是,接收只能在当前渲染的方法中接收数据
如果加上了判断条件,就不能很方便的直接使用调用方法的路径进行发送数据
打个比方:
我现在有个需求是发送一个改变更新数据表的请求
然后这个页面负责渲染的同时也负责请求
可以直接使用应用方法的路径
但是一旦加入如判断条件或者启用了该引入方法的第二个参数
并且第二个参数是必须传递的参数的时候就无法正常调用该方法
那么在页面渲染的路径的时候就需要用到TP5
的查询控制器操作名的方法来定义即将
传递数据的路径,就是传递给它本身即可,这些公共渲染的页面不可能写死,必须让其动态调整自己的上传数据路径本身
这里主要思路是的前后端相互的配合,才能弄出复用性很多的方法
当然这样的方法约束也是非常大的比如字段必须统一等等
// 公共控制器的方法 $sql是数据表名
public function getCoord($table,$edit = false){
$res = Db::name($table)->find(input('get.id'));
if($edit){
$this->assign('edit',$edit);
if(request()->isPost()){
$ras = Db::name($table)
->where('id',input('post.id'))
->update(['longitude'=>input('post.longitude'),'latitude'=>input('post.latitude')]);
if($ras){
$this->success('更新成功!');
}
$this->error('更新失败!');
}
}
return $this->fetch('basemap/getcoord',[
'data'=>$res
]);
}
//调用控制器方法
public function getfabricmap(){
return $this->getCoord($this->table_fabric,true);
}
//公共模板方法
{if isset($edit)}
//先判断是否需要编辑功能 也就是上方的调用方法第二个参数设置为true
//下面是一个腾讯地图监听的方法
var listener = qq.maps.event.addListener(
map,
'click',
function(event) {
$.post(
'{:url(request()->action())}', //路径这里设置为动态获取操作名 在这种情况下如果直接路径指向公共方法的话 ,就会丢失第二参数,方案就变成不可行
{'id':{$data.id},'longitude':event.latLng.getLng(),'latitude':event.latLng.getLat()}, //数据
function (r) { //成功后的处理
$.msg.success(r.msg);
var ret = new qq.maps.LatLng(event.latLng.getLat(),event.latLng.getLng());
marker.setPosition(ret);
},
'json'
);
}
);
{/if}
再拓展一下
如果将方法转换成API接口的化
其实思路一样
需要将数据表的名称传入在接口处加以判断处理即可
尽可能设置为一条入口,太多接口终端会形成一些困扰
如果前后端协议好路径、参数需要直接上传的写入路径问题
基于API控制不了终端的任何东西只能进行传参的规范和增强安全校验