我目前正在使用CodeIgniter3应用程序,并为类似博客的标准系统奠定了基础。
结构是标准CI - 用户请求页面,页面加载控制器方法,控制器方法从其模型调用任何相关的DB函数,然后加载视图。
但是,我还希望通过API访问此视图。因此,我不会将$ data数组填充到填充到HTML中的信息,而是将其传递给另一个输出JSON结果的视图。
我想编写两个不同的控制器将是一个不好的步骤 - 是否有我可以做的路由,或任何标准的做法,以允许控制器识别api端点已被命中(如目录'api'在访问路径中),然后基于此加载不同的视图?
答案 0 :(得分:3)
对于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);
此外,为了能够像对Web GUI一样使用相同的API控制器方法,只复制路由,并且在控制器方法中使用类似的东西。
// 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