美文网首页ThinkPHP
完美搞定ThinkPHP5.1的前后端公共交互

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

作者: 7e300625f089 | 来源:发表于2018-10-02 17:35 被阅读417次

    首先:

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

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

    方法:

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

    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控制不了终端的任何东西只能进行传参的规范和增强安全校验

    相关文章

      网友评论

        本文标题:完美搞定ThinkPHP5.1的前后端公共交互

        本文链接:https://www.haomeiwen.com/subject/gkraoftx.html