【发布时间】:2014-07-17 10:48:48
【问题描述】:
背景:我正在开发一款需要客户端-服务器通信的回合制游戏。客户端通过 HTTPS 使用 RESTful 请求,服务器使用 JSON 响应。我没有使用 REST 是因为我需要公开 API,而是因为 REST 范式很适合理清客户端/服务器交互。服务器是用PHP编写的。
为了帮助我路由 REST 请求,我一直在寻找有用的路由库。可用的数量惊人,但我很难找到适合我特定需求的。我的问题是:只有在满足某些条件的情况下,才应允许玩家遵循某些路线。显然,我可以检查在路由匹配后调用的方法中是否满足条件,但这似乎是一种容易出错的方法,因为许多路由的条件都是相同的。首先进行部分匹配,然后确定必须满足一些条件才能在部分匹配下遵循更具体的路线会简单得多。
为了说明,游戏中有 4 个级别的“身份验证”:
- 未通过身份验证
- 验证为 {id}(我们知道它是哪个播放器)
- 身份验证为 {id} 并参与会话 {sesid}
- 验证为 {id},参与会话 {sesid},轮到玩家了
现在假设身份验证发生在后台。您可以在每个级别逐步遵循的路线:
1 级:
- 发布\玩家-注册
2 级:
- PUT \Players\{id} - 更改个人资料
- GET \Players\{id}\Sessions - 获取会话列表
- POST \Players\{id}\Sessions - 创建会话
- POST\Players\{id}\Inventory - 购买物品
- PUT \Players\{id}\Invites\{sesid} - 加入会话邀请
- DELETE \Players\{id}\Invites\{sesid} - 拒绝会话邀请
3 级:
- GET \Players\{id}\Sessions\{sesid} - 获取会话状态
- DELETE \Players{id}\Sessions\{sesid} - 取消会话
第 4 级:
- PUT \Players\{id}\Sessions\{sesid}\... - 设置多个会话状态参数
所以我希望在匹配下一组路线之前先检查一些参数。我花了很多时间在 Google 和 Packagist 上寻找合适的路由包(我查看了 Klein、Zend、PHP-Router、Fat_free、Slim、TORO、Aura、FlightPHP、Phalcon、FuelPHP 等文档) 但几乎所有库都要求您预先定义路由并一次性找到一个匹配项 - 有时允许您设置顺序,有时从最具体到最不具体,但大多数情况下只执行一个路由。
如果我可以按定义的顺序进行部分路由匹配,我会有所帮助 - 例如,任何以 player\{id} 开头的路由首先检查身份验证,当它不存在时退出,同时继续检查下一个模式如果身份验证正常,则按定义的顺序。
任何允许我在现场匹配和执行路由的路由库也会有所帮助 - 只要它可以进行部分匹配,以便我可以获取检查身份验证级别要求所需的参数(id、sesid) .显然,为了保持精简,我更喜欢不属于更大框架的库。
从我在 Packagist 阅读的文档页面中,我很难确定是否可以部分匹配某些库中的路由 - 匹配参数,是的,但是路由? - 有时不清楚找到的第一个匹配项是否是唯一匹配项。有什么指点吗?
或者我在这里错过了一个更直接的解决方案?
【问题讨论】:
-
最好的选择是自己编写或找到一个接近您需求的框架,然后进行更改。
-
我有点同意这种观点,但我对 PHP 还很陌生——这就是为什么我希望用一个库来解决它(我将使用几个——PHP 就是这样一个时代那些庞大的软件包库的胜利者),而不是自己编写;更不用说钻研其他开发人员的代码库了。我对过滤掉部分 URI、将模式作为值匹配、对结果进行一些验证然后将它们作为参数传递给方法的字符串例程并不完全满意。
-
我确信使用 Slim,您可以使用 RegEx 来匹配 URL,因此虽然它并不理想并且可能最终看起来有点难看,但它可能会对您有所帮助。
-
谢谢,但根据文档,Slim 只对第一个匹配项起作用。我首先需要检查部分匹配以验证身份验证级别,然后按此顺序继续进行更具体的匹配。