1

目标

我的任务是对一个相当大的 PHP Lithium API 进行版本控制。

我正在寻找的最终结果是使用命名空间来分隔版本。

例如,通常看起来像这样的锂路线:

Router::connect('/{:controller}/{:action}/{:id:\d+}');

可以有以下 URL,映射到以下 PHP 调用:

http://www.fungames.com/game/view/2
app\controllers\Game::View($gameId)

但我想创建以下映射:

Router::connect('/{:version}/{:controller}/{:action}/{:id:\d+}');

这样可以进行以下两个调用:

http://www.fungames.com/v1/game/view/2
app\controllers\v1\Game::View($gameId)

http://www.fungames.com/v2/game/view/2
app\controllers\v2\Game::View($gameId)

问题

不幸的是,Lithium 文档没有太多提及 API 版本控制。这里有一个简短的提及作为延续路线的一个例子。但是这种方法需要在我的控制器中创建 if 语句来对我的 API 进行版本控制,我个人认为这是一种糟糕的方法。


TLDR

使用 PHP Lithium 框架时,实现命名空间 API 版本控制的最佳方法是什么?

4

1 回答 1

1

API 版本控制是一个非常广泛的主题,虽然 Li3 为您提供了实现您选择的任何方法的所有必要工具,但实际实现取决于您。话虽如此,路由层相当复杂,可以让你走得很远。请参阅此关于路由配置示例的要点

结合Request::get()它允许您匹配任何请求参数,包括标头(您可以传递-get()兼容的值,如$params-Router::connect()参阅此处的示例),并且Request::detect()允许您实现自定义匹配逻辑,您可以将任何值配置发送到控制器/调度层。这允许您通过不同命名空间的控制器(回退到默认值)、前缀操作或传递不同模型的命名空间/类路径来分割您的版本。

另一种方法,也是我在一般情况下推荐的一种方法,是为需要版本化的任何端点实现一组事务管理器/映射器,并将它们用作控制器和模型之间的中介,然后使用路由到在它们之间切换。

如果您使用内容类型来改进您的 API,这种方法会变得更容易,因为您可以根据它选择映射器。这也很好,因为REST 的创建者强烈反对版本号

无论如何,希望这会有所帮助。

于 2017-07-27T15:46:31.830 回答