inbo/codeigniter-rest

CodeIgniter 3 RESTful API 资源基础控制器

1.0.8 2021-04-20 12:32 UTC

This package is auto-updated.

Last update: 2024-09-20 20:16:11 UTC


README

CodeIgniter RESTful API


CodeIgniter 3 RESTful API 资源基础控制器

Latest Stable Version Latest Unstable Version License

此 RESTful API 扩展已收集到 yidas/codeigniter-pack,这是一个完整的 Codeigniter 框架解决方案。

特性

  • PSR-7 标准化

  • RESTful API 实现

  • Laravel 资源控制器 模式

概要

演示

class ApiController extends yidas\rest\Controller
{
    public function index()
    {
        return $this->response->json(['bar'=>'foo']);
    }
}

状态 200 OK 的输出

{"bar":"foo"}

RESTful 创建回调

public function store($requestData=null) {

    $this->db->insert('mytable', $requestData);
    $id = $this->db->insert_id();
    
    return $this->response->json(['id'=>$id], 201);
}

状态 201 Created 的输出

{"id":1}

打包标准格式

try {
    throw new Exception("API forbidden", 403);
} catch (\Exception $e) {
    // Pack data into a standard format
    $data = $this->pack(['bar'=>'foo'], $e->getCode(), $e->getMessage());
    return $this->response->json($data, $e->getCode());
}

状态 403 Forbidden 的输出

{"code":403,"message":"API forbidden","data":{"bar":"foo"}}

要求

此库需要以下内容

  • PHP 5.4.0+
  • CodeIgniter 3.0.0+

安装

在您的 Codeigniter 项目中的 \application 文件夹下运行 Composer

composer require yidas/codeigniter-rest

检查 Codeigniter application/config/config.php

$config['composer_autoload'] = TRUE;

您可以将供应商路径自定义到 $config['composer_autoload']

配置

  1. 创建一个控制器,以扩展 yidas\rest\Controller,
class Resource extends yidas\rest\Controller {}
  1. 添加并实现通过 构建方法 引用的操作方法。

然后您就可以访问 RESTful API

https://yourname.com/resource/api
https://yourname.com/resource/api/123

如果您喜欢,您也可以使用 /ajax 而不是 /api

https://yourname.com/resource/ajax
https://yourname.com/resource/ajax/123

resource 是控制器名称,如果您不想在 URI 中有 /api/ajax,则可以将路由设置如下。

路由设置

如果您想有标准的 RESTful URI 模式,该模式将控制器定义为 URI 的资源,例如

https://yourname.com/resource
https://yourname.com/resource/123

您可以在 \application\config\routes.php 中为此控制器添加一对路由,以启用 RESTful API URL

$route['resource_name'] = '[Controller]/route';
$route['resource_name/(:num)'] = '[Controller]/route/$1';

资源控制器

基本 RESTful API 控制器是 yidas\rest\Controller,以下表是资源控制器处理的行为,其中 action 指的是 CI_Controller 的动作名称,您可以覆盖

没有路由设置时,URI 如 /photos/api/photos/api/{photo}

构建方法

您可以通过引用 资源控制器模板 创建资源控制器。

以下 RESTful 控制器方法可以根据您的需要添加。每个方法默认引用资源控制器表中的操作,并注入所需参数

public function index() {}
protected function store($requestData=null) {}
protected function show($resourceID) {}
protected function update($resourceID=null, $requestData=null) {}
protected function delete($resourceID=null, $requestData=null) {}

$resourceID (字符串) 是资源从请求中的标识符

$requestData (数组) 是从请求原始体解析的数组输入数据,支持 x-www-form-urlencoded 请求内容类型。(另请参阅 this->request->getRawBody() 以获取原始数据)

自定义路由与方法

默认路由映射资源控制器相同动作方法的如下

protected $routes = [
    'index' => 'index',
    'store' => 'store',
    'show' => 'show',
    'update' => 'update',
    'delete' => 'delete',
];

您可以在创建资源控制器时覆盖它以定义自己的路由

class ApiController extends yidas\rest\Controller {

    protected $routes = [
        'index' => 'find',
        'store' => 'save',
        'show' => 'display',
        'update' => 'edit',
        'delete' => 'destory',
    ];
}

在重置路由后,每个RESTful方法(键)都会进入指定的控制器操作(值)。在上面的示例中,通过使用GET方法访问/resources/api/ URL将进入find()操作。然而,默认路由将进入index()操作。

键指的是资源控制器表中的操作,您必须定义所有需要的方法。

行为

资源控制器支持为每个操作设置行为,例如实现不同权限的认证。

_setBehavior()

在路由之前设置操作的行为

protected boolean _setBehavior(string $action, callable $function)

示例

class BaseRestController extends \yidas\rest\Controller
{
    function __construct() 
    {
        parent::__construct();
    
        // Load your Auth library for verification
        $this->load->library('Auth');
        $this->auth->verify('read');
        
        // Set each action for own permission verification
        $this->_setBehavior('store', function() {
            $this->auth->verify('create');
        });
        $this->_setBehavior('update', function() {
            $this->auth->verify('update');
        });
        $this->_setBehavior('delete', function() {
            $this->auth->verify('delete');
        });
    }
    // ...

用法

pack()

将数组数据打包成主体格式

您可以重写此方法以符合您的应用程序标准。

protected array pack(array|mixed $data, integer $statusCode=200, string $message=null)

示例

$data = $this->pack(['bar'=>'foo'], 403, 'Forbidden');
return $this->response->json($data, 403);

JSON结果

{
    "code": 403,
    "message": "Forbidden",
    "data": {
        "bar": "foo"
    }
}

HTTP请求

PSR-7请求组件yidas\http\request已预加载到yidas\rest\Controller中,它提供了输入处理程序和HTTP认证。您可以在控制器类中使用$this->request来调用它。

用法

getRawBody()

返回原始HTTP请求主体

public string getRawBody()

示例

// Request with `application/json` raw
$data = json_decode($this->request->getRawBody);

getAuthCredentialsWithBasic()

使用HTTP基本认证获取凭据

public array getAuthCredentialsWithBasic()

示例

list($username, $password) = $this->request->getAuthCredentialsWithBasic();

getAuthCredentialsWithBearer()

使用OAuth 2.0授权框架:Bearer令牌使用获取凭据

public string getAuthCredentialsWithBearer()

示例

$b64token = $this->request->getAuthCredentialsWithBearer();

HTTP响应

PSR-7响应组件yidas\http\response已预加载到yidas\rest\Controller中,它提供了输出处理程序和格式化。您可以在控制器类中使用$this->response来调用它。

用法

json()

JSON输出快捷方式

public void json(array|mixed $data, integer $statusCode=null)

示例

$this->response->json(['bar'=>'foo'], 201);

setFormat()

将响应格式设置为CI_Output

public self setFormat(string $format)

示例

$this->response->setFormat(\yidas\http\Response::FORMAT_JSON);

setData()

将响应数据设置为CI_Output

public self setData(mixed $data)

示例

$this->response->setData(['foo'=>'bar']);

send()

向客户端发送响应。

public void send()

示例

$this->response->send();

withAddedHeader()

返回一个具有指定值附加的给定头部的实例。

public self withAddedHeader(string $name, string $value)

示例

return $this->response
    ->withAddedHeader('Access-Control-Allow-Origin', '*')
    ->withAddedHeader('X-Frame-Options', 'deny')
    ->json(['bar'=>'foo']);

参考