【问题标题】:CodeIgniter3 - supporting both API & Web requests in Controllers?CodeIgniter 3 - 在控制器中支持 API 和 Web 请求?
【发布时间】:2018-09-02 01:44:21
【问题描述】:

我目前正在使用 CodeIgniter3 应用程序,并且已经为标准的类似博客的系统构建了基础。

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

但是,我希望也可以通过 API 访问此视图。因此,我不会将 $data 数组中的信息填充到 HTML 中,而是将其传递给不同的视图,该视图将输出 JSON 结果。

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

【问题讨论】:

  • 如果你想要一个干净的方法,你应该考虑为 github.com/chriskacerguis/codeigniter-restserver 使用一个 rest 库,但这并不会改变你需要 2 个不同的控制器这一事实
  • 很公平,所以如果我们考虑我为控制器/api/ 设置一个子目录并在其中插入一个用户控制器,我有什么方法可以访问控制器/用户下的方法。 php ?
  • 这背后的目的是什么?如果你有这么多冗余代码显示一个例子 - 也许这是一个问题,因为你的控制器中有属于模型的代码 - 我不确定;)

标签: php codeigniter codeigniter-3


【解决方案1】:

对于 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

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多