CI(CodeIgniter )封装自定义Restful控制器

RestfulApi的官方定义这里不再赘述,我个人给他定义就是,把一个表的增删改查接口封装起来,提供统一的接口给调用者。

如果是写API接口,表的增删改查何其之多,基本也都一样,我一开始也是每个表的模型里面都去写增删改查,后来写多了就想偷懒了。于是便有了下面的这个封装,只是个人的一个思路,不一定完美,欢迎大家指正。

模型(model)

首先是模型先上代码:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');


class MY_model extends CI_Model{

    //表名
    public $TAB_NAME;
    //主键
    public $key = "id";

    //操作规则
    /**

    [
        "caid"=>[
            "type"=>"int",
            "AddAllowNull"=>true,
            "editAllowNull"=>false
        ],
        "name"=>[
            "type"=>"string",
            "AddAllowNull"=>false,
            "editAllowNull"=>false
        ]
    ]

     */
    public $modelRule = [];

    public function __construct(){
        parent::__construct();

    }

    //所有商品列表
    public function all($offset = 0,$limit = 0){
        return $this->db->get($this->TAB_NAME,$limit,$offset)->result_array();
    }

    //查询
    public function select($where = [],$offset = 0,$limit = 0){
        return $this->db->get_where($this->TAB_NAME, $where, $limit, $offset)->result_array();
    }

    //全部数量
    public function count(){
        $this->db->select('count(*) count');
        return $this->db->get($this->TAB_NAME)->row_array();
    }

    //添加
    public function add($data){
        $this->db->insert($this->TAB_NAME,$data);
        return $this->db->insert_id();
    }

    //编辑
    public function edit($idName,$id,$date){
        $condition[$idName] = $id;
        $this->db->where($condition)->update($this->TAB_NAME,$date);
        return $this->db->affected_rows();
    }

    //删除
    public function del($idName,$id){
        $condition[$idName] = $id;
        $this->db->where($condition)->delete($this->TAB_NAME);
        return $this->db->affected_rows();
    }

}

这里面封装了增删改查和总数量的方法。表名(TAB_NAME)和主键(key)由继承者提供,这个不需要多做说明。

这里需要说明的是modelRule,这样封装我想了很久作用在于:因为每个表他的字段不一样,每个字段类型也不一样,并且是否修改时允许为空也不一样,于是便想到用数组来做配置,如果看不太懂,可以看完下面的控制器结合着看或许就明白了。

控制器(Controller)

控制器是提供给外面调用的入口,依次去调用模型里面的方法就好。

//Restful控制器
class RestfulController extends CI_Controller{

    //数据库model
    protected $model;

    //列表
    public function all(){
        $list = $this->model->all();
        rJson($list);
    }

    //添加
    public function add(){
        //临时数组
        $data = [];
        foreach ($this->model->modelRule as $key=>$value){
            $inputValue = $this->input->post($key);
            $rul = $this->model->modelRule[$key];
            //判断是否允许为空
            if ($inputValue == null) {
                if (!$rul['AddAllowNull']) {
                    rParameterError();
                }
            }
            $data[$key] = $inputValue;
        }
        $r = $this->model->add($data);
        if ($r>0){
            rJson($r,"添加成功",true);
        }else{
            rJson(null,"添加失败",false);
        }
    }

    //编辑
    public function edit(){

        //临时数组
        $data = [];
        $mKey = $this->input->post($this->model->key);
        if ($mKey == null){
            rParameterError();
        }
        foreach ($this->model->modelRule as $key=>$value){
            $inputValue = $this->input->post($key);
            $rul = $this->model->modelRule[$key];
            //判断是否允许为空
            if ($inputValue == null) {
                if (!$rul['editAllowNull']) {
                    rParameterError();
                }
            }
            $data[$key] = $inputValue;
        }

        $r = $this->model->edit($this->model->key,$mKey,$data);
        if ($r>0){
            rJson(null,"修改成功",true);
        }else{
            rJson(null,"修改失败",false);
        }

    }

    //删除
    public function del()
    {

        $mKey = $this->input->post($this->model->key);
        if ($mKey == null) {
            rParameterError();
        }
        $r = $this->model->del($this->model->key,$mKey);
        if ($r>0){
            rJson(null,"删除成功",true);
        }else{
            rJson(null,"删除失败",false);
        }

    }

}

到这里两个基类就写完了。

子模型继承

这里我以分类表为例吧,直接上代码

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Category_model extends MY_model
{
    public function __construct()
    {
        parent::__construct();
        //表名
        $this->TAB_NAME = "category";
        //主键
        $this->key = "caid";
        //字段操作类型 可以扩展
        $this->modelRule = [
            "caid"=>[
                //数据类型,左右可以做安全过滤,我的范例里面没做
                "type"=>"int",
                //调用添加接口是否为空
                "AddAllowNull"=>true,
                 //调用编辑接口是否为空
                "editAllowNull"=>false
            ],
            "name"=>[
                "type"=>"string",
                "AddAllowNull"=>false,
                "editAllowNull"=>false
            ]
        ];

    }
}

子控制器继承

控制器的基础就很简单了,什么都不用写,在构造函数里面初始化下model就可以了。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Category extends RestfulController
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model("Category_model");
        $this->model = $this->Category_model;

    }
}

以后再添加表什么的,就不用再每个都去写增删改查了。

[获取授权]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351