全自动化api

<?php

namespace app\controller;

use app\BaseController;
use think\helper\Arr;
use think\helper\Str;
use think\Request;

class Automatic
{
    protected $model;

    public function __construct(request $request)
    {
        $name = $request->param("model");
        $name = ucwords($name);
        $model_name = "\\app\\model\\" . $name;
        $this->model = new $model_name();
    }

    public function index(Request $request)
    {
        $data = $request->param();
        $model = $this->model;
        if (isset($data["choice"])) {
            $model = $this->choice($data);
        }
        if (isset($data["with"])) {
            $model = $model->with(explode(",", $data["with"]));
        }
        if (isset($data["size"])) {
            $model = $model->paginate($data["size"]);
        } else {
            $model = $model->select();
        }

        if (!$model->isEmpty()) {
            return $this->success($model, "获取成功");
        } else {
            return $this->error("没有数据");
        }
    }

    public function choice($data)
    {
        $search = json_decode($data['choice'], true);
        $query = $this->model->when($search, function ($q) use ($search) {
            foreach ($search as $key => $value) {
                if (is_bool($value) || is_numeric($value) || is_string($value)) {
                    $q->where($key, $value);
                } else if (is_array($value)) {
                    if (Str::startsWith(key($value), '$')) {
                        $op = key($value);
                        $val = $value[$op];
                        switch ($op) {
                            case '$eq':
  $q->where($key, $val);
                                break;
                            case '$ne':
  $q->where($key, '<>', $val);
                                break;
                            case '$gt':
  $q->where($key, '>', $val);
                                break;
                            case '$lt':
  $q->where($key, '<', $val);
                                break;
                            case '$gte':
  $q->where($key, '>=', $val);
                                break;
                            case '$lte':
  $q->where($key, '<=', $val);
                                break;
                            case '$starts':
  $q->where($key, 'like', $val . '%');
                                break;
                            case '$ends':
  $q->where($key, 'like', '%' . $val);
                                break;
                            case '$cont':
  $q->where($key, 'like', '%' . $val . '%');
                                break;
                            case '$excl':
  $q->where($key, 'not like', '%' . $val . '%');
                                break;
                            case '$in':
  $q->whereIn($key, $val);
                                break;
                            case '$notin':
  $q->whereNotIn($key, $val);
                                break;
                            case '$isnull':
  $q->whereNull($key);
                                break;
                            case '$notnull':
  $q->whereNotNull($key);
                                break;
                            case '$between':
  $q->whereBetween($key, $val);
                                break;
                            case '$order':
  $q->order($key, $val);
                                break;
                        }
                    }
                }
            }
        });
        return $query;
    }

    public function save(Request $request)
    {
        $data = $request->post();
        try {
            if (empty($data)) {
                return $this->error("数不能为空");
            }
            $data["create_time"] = time();
            $data["ip"] = ip2long(\request()->ip());
            $save = $this->model->strict(false)->insertGetId($data);
            if ($save) {
                return $this->success($save, "添加成功");
            } else {
                return $this->error("添加失败");
            }
        } catch (\Exception $exception) {
            return $this->error($exception->getMessage());
        }
    }

    public function multistage(Request $request)
    {
        $sava_Data = $this->save($request);
        $get_data = $sava_Data->getData();
        if ($get_data["code"] == 0) {
            $array = $request->param("array");
            foreach ($array as $item) {
                $model_name = "\\app\\model\\" . $item["model_name"];
                $model = new $model_name();
                $item["object_id"] = $get_data["data"];
                $item["create_time"] = time();
                $item["ip"] = isset($item["ip"]) ? ip2long($item["ip"]) : ip2long(\request()->ip());
                $save = $model->strict(false)->insertGetId($item);
                if (!$save) {
                    return $this->error("添加失败");
                }
            }
            return $this->success("", "添加成功");
        } else {
            return $this->error($get_data["msg"]);
        }
    }

    public function update($id, Request $request)
    {
        $model = $this->model->find($id);
        if (!$model) {
            return $this->error("数据错误");
        }
        $data = $request->param();
        if (empty($data)) {
            return $this->error("请选择要修改的数据");
        }
        $update = $this->model->where("id", $id)->strict(false)->update($data);
        if ($update) {
            return $this->success("", "修改成功");
        } else {
            return $this->error("修改失败");
        }
    }

    public function edit($id, Request $request)
    {
        $data = $request->param();
        $model = $this->model;
        if (isset($data["with"])) {
            $model = $this->model->with(explode(",", $data["with"]));
        }
        $model = $model->find($id);
        if (!$model) {
            return $this->error("没有数据");
        }
        return $this->success($model, "获取成功");
    }

    public function delete($id)
    {
        $del = $this->model->destroy($id);
        if ($del) {
            return $this->success("", "删除成功");
        } else {
            return $this->error("删除失败");
        }
    }

    protected function success($data, $msg, $code = 0)
    {
        return json(['code' => $code, 'msg' => $msg, 'data' => $data]);
    }

    protected function error($msg, $code = 1)
    {
        return json(['code' => $code, 'msg' => $msg]);
    }

}

laravel和tp6的语法几乎一样,开发完这套自动化接口后,我已经闲一个星期了,并且bug直线下降到没有,我是不是没有用武之地了

本作品采用《CC 协议》,转载必须注明作者和本文链接
手写十万行代码
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 15

你这个传入model 权限很大呀

1个月前 评论
wade (楼主) 1个月前
pndx

Mark

1个月前 评论

我本来没有那条行级数据,我用接口一爆,全出来了,漂亮

1个月前 评论
wade (楼主) 1个月前

金字塔

1个月前 评论

高内聚 低耦合 让你玩成了 低内聚 高耦合

2周前 评论
滚球兽进化 2周前

你这个耦合度也忒高了

2周前 评论
wade (楼主) 2周前
滚球兽进化 2周前

风险挺大

2周前 评论
wade (楼主) 2周前

过度封装了,实际项目中使用这样没啥卵用。

2周前 评论
wade (楼主) 2周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!