2

您如何在应用程序中管理大 URL(带有大量查询参数)?

例如,从 ebay 上查看这个链接(不要点击链接只是一个大 URL 的示例):

http://www.ebay.com/sch/Cameras-Photo-/625/i.html?LH_ItemCondition=1&LH_Price=15..500%40c&rt=nc&LH_Auction=1&LH_BIN=1&_nkw=nikon&_catref=1&_clu=2&_fcid=12&_fln=1&_localstpos= &_mPrRngCbx=1&_sc=1&_sop=15&_stpos=&_trksid=p3286.c0.m283&gbr=1

您可以看到很多参数,其中许多具有奇怪的短名称,例如“_f”、“_sc”等。

你不能在你的应用程序中使用这些参数,你需要转换成更“可读”的东西:

 $readableName = $_GET['_f'];

但是最后你会得到很多变量,可能你需要在一个函数中使用所有变量,所以,我们可以使用数组来代替每个查询参数的新变量:

$readableParams['readableName'] = $_GET['_f']; 

但是我们以一个具有任意结构的大数组结束,所以我认为最好的办法是为这些参数设置一个 VO (DTO),例如:

$filterVo = new FilterVo();
$filterVo->readableName = $_GET['_f'];

没关系,但是我们把代码放在哪里?我的意思是,从“稀有查询参数”转换为“明确值对象”的最佳位置在哪里?
因为我们还需要逆过程,所以我们可以用数据创建一个 VO,然后从那个 VO 生成一个带有正确查询参数的 URL。

在VO里面?帮助 URL 类?查看模型基类?

您如何使用大量参数管理这些 URL?

4

2 回答 2

1

有趣的是,您提出的输入名称是神秘的。我将对我在我的项目中看到的我认为与该主题相关的内容进行一般意义上的回答(不仅仅是 PHP 细节)。一般方法:

  • 表单变量通常映射到一个对象。它是 PHP 中的 VO 或 Java 中的 Beans。这将是最易读的转换形式(在我看来),因为它为正在转换的 HTML 表单提供了上下文
  • 在许多情况下,我见过某种形式的实用程序助手类,它可以处理往返的转换。然而,这并不是一个特定的硬编码转换,大部分转换都是非常结构化和通用的。例如,它采用所有 getters/setters 方法并将其用作表单名称。例如,我可能getUsername()在我的对象中有,然后 Form Utilities 会将它翻译成<input name="username"/>例如。
  • 或者,您还可以通过映射覆盖覆盖默认映射。这可能是以下形式:
    • 配置文件,例如将实例变量映射到表单变量的 XML 文件。在上面的例子中,这种映射可能是将用户名实例变量映射到一个更神秘的名为 u 的表单变量
    • 语言特性,例如 Java 中的注解或 C# 中的属性。语言功能将允许在没有配置文件的情况下进行映射,但内联在对象源代码本身中
  • 我已经看到有 VO/Bean 基类的项目,这些项目具有fromForm(input)toForm()利用了上面提到的 Form Utilities。它为开发人员提供了便利,因此他们不必处理表单实用程序,而只需从他们的对象调用toForm()和调用fromForm(input)来处理转换

现在给出上面的模式,对于神秘的表单字段,我通常会看到:

  • 创建 VO 对象来表示字段
  • 创建映射配置以将神秘字段映射到具有逻辑名称的实际实例变量
  • 直接使用 Form Utilities 助手类,或者如果在基类中使用 Form Utilities,则使用便捷方法toForm()fromForm(input)
于 2011-09-05T23:43:48.123 回答
0

大多数这些参数都是自动生成的。我在很多 ASP.NET 应用程序中都看到过这种行为。而且我讨厌 .NET 做这样的事情,但我不想再开始这个话题

大多数情况下,这些附加参数是由插件模块生成的。这些以自动化的方式工作,做一些不直接反映在应用程序中的事情(至少是应用程序开发人员正在编写的部分),或者协助其他任务。这是一种跨请求维护状态的方法。

另一方面,您可以实现您描述的这种机制。在 MVC 环境中,此任务将由 Controller 处理。仅当您传递了很多 GET 参数时,这才有意义。你应该从一开始就尽量避免这种做法。

于 2011-09-05T22:25:09.437 回答