【问题标题】:Php Routing Url with parameters带参数的php路由url
【发布时间】:2017-08-10 02:09:07
【问题描述】:

我尝试将我的 Url 解析为我的路由器类。 首先,一切都很清楚,我将我的 Url 拆分为一个数组,但我目前的问题是我需要先添加我的路由,例如 $router->add("user/show/123");$router->add("article/2584/edit"); 将它们推入一个数组并在其进入​​数组时请求加载页面。但是当我将参数添加到路由时,我没有找到解决这些参数的方法。我怎样才能让它像$route->add("article/WHATEVER/edit"); 这样它加载页面无论数字是多少? 我猜想使用 RegEx,但我并不擅长或理解它。目前不知道该怎么做,我已经用谷歌搜索和搜索了,但我发现的只是完成的课程,我不想使用因为我想至少了解它是如何工作的。

我很乐意提供一些帮助,一些链接和一些代码片段,它们会给我一个新的观点和继续前进的方法。

【问题讨论】:

  • 谁做的代码路由机制?
  • 我尝试了不同的脚本并进行了实验,但后来我意识到我需要一个白名单或其他东西 xD
  • 好吧,article/\d+/edit 可以是中间的任意数字,但 add 有什么作用?这需要正则表达式吗?
  • 不,它只是将参数添加到数组 idk 目前要做什么或更好地说明如何使用它执行下一步。我知道该怎么做,但怎么做。我真的不知道正则表达式模式的东西或如何编写模式,也没有好的教程或其他东西。

标签: php regex url routing


【解决方案1】:

我的做法略有不同。我采用以下形式的 URI:

/controller/action/param1/param2/param3/etc.

我使用 .htaccess 将其路由到 index.php?q=,因此可以通过调用 $_GET['q'] 访问整个字符串。我通过使用explode with / 作为分隔符将字符串分成几部分,第一个和第二个元素始终是控制器和动作。其他所有内容都是一个字符串(无论参数如何),并使用回调转发到相关函数(操作)。在我的函数(例如视图)中,我将 $param 作为参数,而 $param 是一个包含 /param1/param2/param3/etc 的字符串。

在函数中,我进一步将该字符串拆分为单独的参数,根据需要将它们分配给常规命名变量。

$param = explode('/', $param);
$id = $param[0];
$sortBy = $param[1];
$sortOrder = $param[2];
etc.

显然,我检查参数的有效性,如果它们为空,则使用默认值。我看到的唯一缺点是您必须提供所有 2、3、4(无论您有多少)参数,即使您只想更改一个。在我上面的示例中,我有 3 个参数,如果我只想更改 sortOrder,我的 URI 将类似于:

/controller/action/0/0/ASC

使用 PHP,我检测到 0 不是该操作的有效参数,并从我的设置或其他来源为其分配一个默认值。最大的优点是简单,而且每个模块可以使用无限数量的参数。您不必“添加路由”,因为它们是在控制器中处理的,而不是在路由文件中。

PS:我知道这不是最佳做法,而且是一种非常初级的方法,但它确实有效。根据您要采取的程度,此选项可能不适合您。

【讨论】:

  • 感谢您的回答@Chris,您的建议是否需要使用任何框架,或者这可以通过核心 PHP 编码来完成?您能否提供一个工作示例项目。将不胜感激。谢谢
  • 它只使用核心 PHP,但在这个阶段,我建议使用诸如 laravel 或 cakephp 之类的框架。恐怕我切换到 Python,我在其中使用了 flask,所以我没有一个可行的示例,但是在 PHP 中使用框架进行路由有很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2012-09-26
  • 2018-08-31
  • 2015-10-06
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多