我已经构建了一个提供 API 的 CodeIgniter 2.0 站点。我现在需要创建另一个版本的 API,该版本不会向后兼容以前的版本。这就是我正在尝试做的事情:
CodeIgniter 似乎不喜欢这种类型的文件夹结构。而且,如果我的所有 API 控制器都具有相同的类名,我将无法进行子类化(即“类 API 扩展 API”将不起作用)。也就是说,我宁愿不必这样做:“类 API2_0 扩展 API1_0”,但如果有必要我会这样做。
我觉得 URI 路由将是这里的关键(我对此的掌握有限),但如果有人已经完成了这个思考过程,我将非常感谢一些指导。谢谢!!!
-史蒂夫
按照您通常的方式构建 API,就控制器和其他什么而言,然后只需:
application/controllers/api_1/foo.php
application/controllers/api_2/foo.php
使用路线你可以做到:
/api/1/foo
/api/2/foo
我认为您的逻辑需要改进,请参阅此答案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 { }
默认情况下 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