版本控制 PHP Lithium API
Posted
技术标签:
【中文标题】版本控制 PHP Lithium API【英文标题】:Versioning a PHP Lithium API 【发布时间】:2017-12-31 15:39:04 【问题描述】:目标
我的任务是对一个相当大的 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 版本控制。有一个简短的提及 here 作为延续路线的一个例子。但是这种方法需要在我的控制器中创建 if 语句来对我的 API 进行版本控制,我个人认为这是一种糟糕的方法。
TLDR
在使用 PHP Lithium 框架时,实现命名空间 API 版本控制的最佳方法是什么?
【问题讨论】:
【参考方案1】:API 版本控制是一个非常广泛的话题,虽然 Li3 为您提供了所有必要的工具来实现您选择的任何方法,但实际实现取决于您。话虽如此,路由层相当复杂,可以让你走得很远。见this gist on routing configuration examples。
将此与Request::get()
结合使用,它允许您匹配任何请求参数,包括标头(您可以将get()
兼容值作为$params
传递到Router::connect()
— see examples here),
和Request::detect()
,它允许您实现自定义匹配逻辑,您可以将任何值配置发送到控制器/调度层。这允许您通过不同命名空间的控制器(回退到默认)、前缀操作或传递不同模型的命名空间/类路径来分割您的版本。
另一种方法,也是我在一般情况下推荐的方法,是为需要版本控制的任何端点实现一组事务管理器/映射器,并将它们用作控制器和模型之间的中介,然后使用路由在它们之间切换。
如果您使用内容类型(即内容类型)来改进您的 API,这种方法会变得更容易,因为您可以根据它选择映射器。这也很好,因为version numbers are strongly discouraged by REST's creator。
无论如何,希望对您有所帮助。
【讨论】:
我之前没有读过这些反对版本控制的建议,所以我会在未来采纳这些建议。 您链接的示例中的 cmets 为我提供了一种很好的方式来满足我所追求的命名空间解决方案。好东西!以上是关于版本控制 PHP Lithium API的主要内容,如果未能解决你的问题,请参考以下文章