ThinkPHP

完美搞定ThinkPHP5.1的前后端公共交互

2018-10-02  本文已影响417人  7e300625f089

首先:

那么写标题,完全是看了标题党怎么玩标题才故意那么写一次标题,测试一下标题党到底有多大的诱惑

这里所指的公共模板,不是嵌套进来的那种模板
而是公用的整张页面提供给不同的模块或者模型使用
基本的样式是固定的比如地图一类的模板

方法:

首先我们知道调用别的控制器下面的模板的方法是

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
        ]);
}

知识点

  1. 引用公用控制器渲染页面方法的控制器方法必须使用return
  2. 编辑公用控制器渲染方法时必须输入完整模板路径,跨模块时必须连同模块名一起,就算模板中当前控制器下也要输入完整

拓展知识

如果这种类型的应用方式需要渲染的同时还要接收数据
这里需要注意的是,接收只能在当前渲染的方法中接收数据
如果加上了判断条件,就不能很方便的直接使用调用方法的路径进行发送数据
打个比方:
我现在有个需求是发送一个改变更新数据表的请求
然后这个页面负责渲染的同时也负责请求
可以直接使用应用方法的路径
但是一旦加入如判断条件或者启用了该引入方法的第二个参数
并且第二个参数是必须传递的参数的时候就无法正常调用该方法
那么在页面渲染的路径的时候就需要用到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控制不了终端的任何东西只能进行传参的规范和增强安全校验

上一篇下一篇

猜你喜欢

热点阅读