对 PHP 锂 API 进行版本控制
Versioning a PHP Lithium API
目标
我的任务是对相当大的 PHP 锂 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 版本控制。有一个简短的提及 here 作为延续路线的例子。但是这种方法需要在我的控制器中使用 if 语句来对我的 API 进行版本控制,我个人认为这是一种糟糕的方法。
TLDR
使用 PHP Lithium 框架时实现命名空间 API 版本控制的最佳方法是什么?
API 版本控制是一个非常广泛的话题,虽然 Li3 为您提供了所有必要的工具来实现您选择的任何方法,但实际的实现取决于您。话虽如此,路由层相当复杂,会让你走得很远。参见 this gist on routing configuration examples。
将此与 Request::get()
which allows you to match on any request parameters including headers (you can pass get()
-compatible values as $params
in Router::connect()
— see examples here 结合),
和 Request::detect()
,它允许您实现自定义匹配逻辑,您可以将值的任何配置向下发送到 controller/dispatch 层。这允许您通过不同命名空间的控制器(回退到默认值)、前缀操作或为不同模型传递 namespace/class 路径来分割您的版本。
另一种方法,也是我在一般情况下推荐的一种方法,是为需要版本控制的任何端点实施一组事务 managers/mappers,并将它们用作控制器和控制器之间的中介您的模型,然后使用路由在它们之间切换。
如果您使用内容类型来改进 API,则此方法会变得更容易,因为您可以基于此选择映射器。这也很好,因为 version numbers are strongly discouraged by REST's creator.
无论如何,希望对您有所帮助。
目标
我的任务是对相当大的 PHP 锂 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 版本控制。有一个简短的提及 here 作为延续路线的例子。但是这种方法需要在我的控制器中使用 if 语句来对我的 API 进行版本控制,我个人认为这是一种糟糕的方法。
TLDR
使用 PHP Lithium 框架时实现命名空间 API 版本控制的最佳方法是什么?
API 版本控制是一个非常广泛的话题,虽然 Li3 为您提供了所有必要的工具来实现您选择的任何方法,但实际的实现取决于您。话虽如此,路由层相当复杂,会让你走得很远。参见 this gist on routing configuration examples。
将此与 Request::get()
which allows you to match on any request parameters including headers (you can pass get()
-compatible values as $params
in Router::connect()
— see examples here 结合),
和 Request::detect()
,它允许您实现自定义匹配逻辑,您可以将值的任何配置向下发送到 controller/dispatch 层。这允许您通过不同命名空间的控制器(回退到默认值)、前缀操作或为不同模型传递 namespace/class 路径来分割您的版本。
另一种方法,也是我在一般情况下推荐的一种方法,是为需要版本控制的任何端点实施一组事务 managers/mappers,并将它们用作控制器和控制器之间的中介您的模型,然后使用路由在它们之间切换。
如果您使用内容类型来改进 API,则此方法会变得更容易,因为您可以基于此选择映射器。这也很好,因为 version numbers are strongly discouraged by REST's creator.
无论如何,希望对您有所帮助。