CodeIgniter 中正确的自定义 API 版本控制

问题描述 投票:0回答:3

我已经构建了一个提供 API 的 CodeIgniter 2.0 站点。我现在需要创建另一个版本的 API,该版本不会向后兼容以前的版本。这就是我正在尝试做的事情:

  1. 创建版本化的 API 控制器,例如 {root}/application/controllers/api/v1.0/api.php 和 /v2.0/api.php 等...
  2. 允许更高的 API 版本继承以前的版本,因此我只需重写那些我想要的方法

CodeIgniter 似乎不喜欢这种类型的文件夹结构。而且,如果我的所有 API 控制器都具有相同的类名,我将无法进行子类化(即“类 API 扩展 API”将不起作用)。也就是说,我宁愿不必这样做:“类 API2_0 扩展 API1_0”,但如果有必要我会这样做。

我觉得 URI 路由将是这里的关键(我对此的掌握有限),但如果有人已经完成了这个思考过程,我将非常感谢一些指导。谢谢!!!

-史蒂夫

api codeigniter versioning backwards-compatibility codeigniter-url
3个回答
3
投票

按照您通常的方式构建 API,就控制器和其他什么而言,然后只需:

application/controllers/api_1/foo.php
application/controllers/api_2/foo.php

使用路线你可以做到:

/api/1/foo
/api/2/foo

0
投票

我认为您的逻辑需要改进,请参阅此答案code igniter动态路由,了解如何将自定义路由添加到您的站点,您可以使用它添加自己的路由。当涉及到控制器时,最佳实践是在 application/core/ 文件夹中拥有一个 MY_Controller,它将成为所有应用程序控制器的基本父级。 接下来,在 application/libraries/Apiv1_Controller.php 中创建新的库来扩展 MY_Controller 类,请注意,您将需要 __autoload() 函数来自动从 application/libraries 文件夹加载类。 然后,所有 API 版本 1 控制器都将扩展 Apiv1_Controller,从而获得对其方法的访问权限。对于版本 2,只需创建另一个扩展 Apiv1_Controller 的库 Apiv2_Controller,版本 2 中的控制器将扩展此类。 这样您的逻辑将保留在一个类中,因此您不必创建其他文件夹。此外,通过自定义路线,您可以将路线映射到不同的控制器。 希望这对您有帮助。

//API V1 控制器
类 Someapi 扩展 Apiv1_Controller
{

}

//API V2控制器
类 Otherapi 扩展 Apiv2_Controller
{

}

0
投票

默认情况下 CI 不支持字符“.”作为文件夹名称。但你可以更改文件 system/core/Router.php 并更改函数 set_directory 不替换“.”在文件夹名称中

public function set_directory($dir, $append = FALSE)
{
    if ($append !== TRUE OR empty($this->directory))
    {
        $this->directory = str_replace('.', '', trim($dir, '/')).'/';
    }
    else
    {
        $this->directory .= str_replace('.', '', trim($dir, '/')).'/';
    }
}

到此

public function set_directory($dir, $append = FALSE)
{
    if ($append !== TRUE OR empty($this->directory))
    {
        $this->directory = trim($dir, '/').'/';
    }
    else
    {
        $this->directory .= trim($dir, '/').'/';
    }
}

所以控制器结构将是

controllers/api/2.0/your_controller.php
controllers/api/2.1/your_controller.php
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.