如何使用大量查询参数管理URL?

时间:2011-09-05 21:43:34

标签: php design-patterns url get param

您如何在应用中管理大型网址(包含大量查询参数)?
例如,从易趣看这个链接(不要点击链接只是一个大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'];

但是你结束了很多变量,并且你可能需要在函数中使用它们,所以,对于每个查询参数,我们可以使用数组而不是新的var:

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

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

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

那没关系,但我们把代码放在哪里?我的意思是,从“罕见的quer params”转换为“clear value objects”的最佳位置在哪里? 因为我们还需要逆过程,所以我们可以使用数据创建一个VO,然后使用来自该VO的正确查询参数生成一个URL。

在VO内? 帮助程序URL类? 查看模型基类?

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 创建VO对象以表示字段
  • 创建映射配置以将隐秘字段映射到具有逻辑名称
  • 的实际实例变量
  • 直接使用Form Utilities帮助程序类,或者如果在基类中使用Form Utilities,请使用便捷方法toForm()fromForm(input)

答案 1 :(得分:0)

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

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

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