【问题标题】:Routing in RESTful API in PHPPHP中RESTful API中的路由
【发布时间】:2015-12-28 13:11:55
【问题描述】:

我对 PHP MVC 有点熟悉。说,我有一个这样的控制器:

class Customers{

    public function method1( param1, param2, param3, ..., param_n ){

    }
}

在我的引导页面中,我可以像这样获取浏览器 URL:

$url = explode('/', filter_var(rtrim( $_GET['url'], '/' ), FILTER_SANITIZE_URL));

我喜欢$controller = $url[0]$method = $url[1]。在第二个索引之后$url 中的任何其他元素都是参数,可以收集到数组变量中,比如$params。然后我像这样路由到相关的控制器方法和参数:

call_user_func_array([$controller, $method], $params);

请注意:以上代码仅用于说明目的。我总是在现实生活中进行检查。此处未显示这些检查,因此请勿将上述示例用于严肃的项目。

现在,我想使用 MVC 模式实现一个 RESTful API。我已经知道的:

  1. 不涉及浏览器,因此$_GET['url'] 不在其中。
  2. 端点从$_SERVER['REQUEST_URI']获取
  3. 方法从$_SERVER['REQUEST_METHOD']获取

我如何路由到端点,例如customers/{12345}/orders 以获取 ID 为 12345 的特定客户的订单?

我该怎么做?

【问题讨论】:

  • 将使用$_GET 变量的想法替换为发送$_SERVER http 标头。此外,需要明确的是,您仍然可以在不涉及浏览器的情况下使用$_GET 查询字符串,因此这不是您的限制因素。您仍然可以使用$_POST。您是否尝试过为此使用诸如 CodeIgniter 或 Zend 之类的 MVC 框架,因为路由问题已经得到解决,或者您更倾向于自己手动创建 MVC 模型的想法?
  • @LionelRitchietheManatee 1. 我知道我仍然可以使用$_GET,我不知道的是$_GET['url'] 2. 是的,我更倾向于自己手动创建 MVC 模型的想法。事实上,这正是我问这个问题的原因。我想学习怎么做。
  • 我完全理解。当您提到使用 $_GET['url'] 时,您是指像 ?url=www.something.com 这样的命名查询参数,还是像 $_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI] 这样引用 URL 本身?
  • @LionelRitchietheManatee,我指的是后者。

标签: php url-routing restful-url


【解决方案1】:

实现您想要的最快的方法是使用FastRoute
但那有什么好玩的:)

也就是说,我对你的前提感到困惑。它是一个 REST API,将被其他代码(例如在手机或 3rd 方网络应用程序中)使用,还是一个合适的网站,您只想在其中获取漂亮的 URL?

因为如果是前一种情况,那么做花哨的URL解析是完全没有意义的。您应该阅读this article,而不是乱搞URL。 真正的 REST API 不需要花哨的 URL 解析。

我会假设您实际制作的是一个合适的网站,但具有漂亮的 URL。

首先,您必须实现一个路由机制,该机制采用正则表达式模式列表,将它们与您提供的 URL 进行匹配(您可以从 $_GET['url'] $_SERVER[REQUEST_URI] 中提取(您的代码实际上并不关心从那里收集 URL ...您不应该在函数/类中访问超全局变量。

this answer 对此进行了简单的解释。我懒得重写了=P

第二个(也是高度可选的)部分是创建代码,它将采用人类可读的路线表示法(例如:/users/{id|[0-9]+} 作为示例)并将其转换为正则表达式,可以使用 由你的路由机制决定。

如果您决定使用人类可读的符号,那么有两个主要方向:

  • 内联符号(参见上面的示例或 FastRoute)
  • 带有符号的配置文件(可能是 JSON 或 YAML)

至于“最终结果可能是什么样子”,您可能可以查看代码示例here。这将说明路由器公共接口的可用选项之一。

TL;DR

您的问题含糊不清,很难理解究竟什么对您有帮助。

【讨论】:

  • 如果我的问题听起来不清楚,我很抱歉。在“现在我想使用 MBC 模式实现一个 RESTful API”之前,我认为所有内容都暗示我在谈论普通网站,并且从那里开始的所有内容都在谈论类似 MVC 结构的 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2017-06-30
  • 2015-01-03
  • 2013-04-18
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多