CodeIgniter 3 - 在控制器中支持 API 和 Web 请求?

2024-05-25

我目前正在使用 CodeIgniter3 应用程序,并为标准的类似博客系统奠定了基础。

该结构是标准 CI - 用户请求页面,页面加载控制器方法,控制器方法从其模型调用任何相关的数据库函数,然后加载视图。

不过,我还希望能够通过 API 访问此视图。因此,我不会将 $data 数组填充信息以填充到 HTML 中,而是将其传递到另一个视图,该视图将输出 JSON 结果。

我想编写两个不同的控制器将是一个糟糕的步骤 - 是否有任何我可以做的路由,或者任何标准实践允许控制器识别已命中的 api 端点(例如目录“api”位于访问路径),然后基于此加载不同的视图?


对于 API,我不会使用视图。视图传统上用于 HTML。我建议不要将 $data 传递给视图,而是简单地在控制器末尾回显它,如下所示。

echo json_encode($data);

我创建了这个包装器,以灵活扩展返回数据的方式。这是一个基本示例。

function api_response($data = array()) {
    $data['error'] = false;
    function filter(&$value) {
        if (is_string($value)) {
            $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
            $value = nl2br($value);
        }
    }
    array_walk_recursive($data, "filter");
    return json_encode($data);
}

我用这样的方法来处理 API 错误

function api_error_response($error_code, $error_message) {
    log_message('error', $error_code . ' - ' . $error_message);
    $data['error'] = true;
    $data['error_code'] = $error_code;
    $data['error_message'] = $error_message;
    return json_encode($data);
}

然后我在控制器的末尾这样称呼它。

echo api_response($data);

此外,为了能够对 API 使用与 Web GUI 相同的控制器方法,只需复制路由,并在控制器方法中使用类似的方法。

// Return here for API
if (strpos($_SERVER['REQUEST_URI'], '/api/') !== false) {
    // Unset any data you don't want through the API
    unset($data['user']);
    echo api_response($data);
    return false;
}
// Else, load views here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CodeIgniter 3 - 在控制器中支持 API 和 Web 请求? 的相关文章

随机推荐

  • Android.system.ErrnoException:isConnected失败:ECONNREFUSED(连接被拒绝)

    我使用Java连接MySQL和Json将数据发送到android 当我通过URL地址将数据从Java发送到json时 http 192 168 1 221 9999 rentalcar service category getAllManu
  • 绘图不显示

    我正在使用闪亮的 但无法显示绘图 之前就出现过 不知道怎么变了 MRE global r 或将其放入 server r 中 library shinydashboard library plotly server r shinyServer
  • 获取当前 GPS 时出现 NullPointerException

    我有一个测试屏幕 其中有一个按钮 按下它会调用该服务 我正在尝试实现一种方法来获取当前用户的当前 GPS 位置 但在尝试调用时它崩溃了 谁能告诉我问题是什么吗 package com example whereyouapp import j
  • 有没有办法将所有内容都包含在 dbcontext 中?

    当查询一个DbContext急切加载时 需要Include Navigation 为了填充导航属性 然而 在某些情况下 我想简单地Include all实体的导航属性 有没有办法做到这一点 或者有办法做到这一点 我假设你可以反思 但我宁愿避
  • Android接收短信Intent:获取消息Id或线程Id

    我已经注册了一个广播监听器来接收android provider Telephony SMS DELIVER意向行动 我似乎能够获取这条新消息的正文和发件人电话号码 但是我无法获取此新消息的消息 ID 或线程 ID 我发现的唯一方法是搜索消
  • 接近堆限制的无效标记压缩分配 Angular 8 - JavaScript 堆内存不足

    42 构建 274 275 模块 1 个活动模块 src index js 提取 D Clients app node modules sass loader lib loader js ref 15 3 D src styles scss
  • 将模板添加为innerHTML 时,Angular 2 绑定/事件不起作用

    我正在尝试创建一个可配置的可重用表 单元格可以配置为具有 html 模板 我正在配置列 Review 拥有带有带有点击事件的锚标记的 html 模板 审核 行 到目前为止 我尝试将此模板作为innerHTML 插入 但所有角度绑定都不起作用
  • 如何在嵌套集中查找特定 level2 节点的特定子节点

    我有一个标准的嵌套集模型 每个节点都有 name lft 和 rgt 属性 我可以使用以下方法找到特定员工的上级 SELECT P2 FROM Personnel AS P1 Personnel AS P2 WHERE P1 lft BET
  • .map() Javascript ES6 地图?

    你会怎么做 本能地 我想做 var myMap new Map thing1 1 thing2 2 thing3 3 wishful ignorant thinking var newMap myMap map key value gt v
  • TopologyTestDriver 在 KTable 聚合上发送错误消息

    我有一个聚合在 KTable 上的拓扑 这是我创建的通用方法 用于根据我拥有的不同主题构建此拓扑 public static
  • 井字游戏代码有助于改进

    这是我必须检查玩家在井字棋游戏中获胜的代码 这是一个很长的 if 语句 可以改进 该板由 9 个图片框组成 我是一名 C 初学者 pBox Image Player players Player playerTurn getImage ch
  • 有没有好的 GLSL 哈希函数?

    所以我对这个问题的古老评论仍然得到了支持 GLSL rand 这一行代码的起源是什么 https stackoverflow com questions 12964279 whats the origin of this glsl rand
  • NodeJS Express 中每个请求的全局范围

    我有一个基本的快速服务器 需要在每个请求处理期间存储一些全局变量 更深入地说 请求处理涉及许多需要存储在变量中的操作 例如global transaction 当然 如果我使用global范围 每个连接都将共享其事务的信息 并且我需要一个全
  • 如何在 Laravel 中将秒转换为天小时分钟[重复]

    这个问题在这里已经有答案了 我想将以秒为单位的时间间隔转换为天小时分钟 我已经尝试过了 value 90060 CarbonInterval seconds value gt forHumans 我得到了输出 90060 seconds 我
  • C++,多语言/本地化支持

    向 C 程序添加多语言支持的最佳方法是什么 如果可能 应该从包含键值对 WelcomeMessage Hello s 之类的纯文本文件中读取语言 我想到了添加一个 localizedString key 函数来返回加载的语言文件的字符串 有
  • Azure 媒体服务播放器

    我觉得这是一个非常愚蠢的问题 但我的研究告诉我我必须创建自己的播放器 真的吗 我有一个来自 Azure 媒体服务的链接 发布 URL 如下所示 http streamvideotest streaming mediaservices win
  • 使用 Bouncy Castle 重建 ED25519 按键 (Java)

    Bouncy Castle 的最新 测试版 版本 bcprov jdk15on 161b20 jar 支持 ED25519 和 ED448 EC 加密以进行签名 我设置了这个完整的工作示例 它按预期工作 我的问题 我是否正确重建了私钥和公钥
  • 桨在移动时留下痕迹(Pygame Pong 游戏)[重复]

    这个问题在这里已经有答案了 我的游戏中的球拍有问题 每次我试图移动它时 桨都会留下一条 痕迹 我想这是因为我的代码没有删除旧位置的前一个桨 如果是的话怎么删除之前的呢 我应该使用blit Code import pygame sys ran
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • CodeIgniter 3 - 在控制器中支持 API 和 Web 请求?

    我目前正在使用 CodeIgniter3 应用程序 并为标准的类似博客系统奠定了基础 该结构是标准 CI 用户请求页面 页面加载控制器方法 控制器方法从其模型调用任何相关的数据库函数 然后加载视图 不过 我还希望能够通过 API 访问此视图