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

Php 如何使用大量查询参数管理URL?,php,design-patterns,url,get,param,Php,Design Patterns,Url,Get,Param,您如何管理应用程序中的大URL(带有许多查询参数)? 例如,查看易趣上的此链接(不要单击此链接只是大URL的一个示例): 您可以看到许多参数,其中许多参数都有奇怪的短名称,如“\u f”、“\u sc”等 您不能在应用程序中使用这些参数,您需要转换为更“可读”的参数: 但是,最后会有很多变量,并且可能需要在一个函数中使用所有变量,因此,我们可以使用数组,而不是为每个查询参数使用一个新的变量: $readableParams['readableName'] = $_GET['_f']; 但

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

例如,查看易趣上的此链接(不要单击此链接只是大URL的一个示例):

您可以看到许多参数,其中许多参数都有奇怪的短名称,如“\u f”、“\u sc”等

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

但是,最后会有很多变量,并且可能需要在一个函数中使用所有变量,因此,我们可以使用数组,而不是为每个查询参数使用一个新的变量:

$readableParams['readableName'] = $_GET['_f']; 
但是我们以一个具有任意结构的大数组结束,所以我认为最好的办法是为这些参数设置一个VO(DTO),比如:

$filterVo = new FilterVo();
$filterVo->readableName = $_GET['_f'];
没关系,但我们把代码放在哪里了?我的意思是,从“稀有查询参数”转换为“清除值对象”的最佳位置在哪里?
因为我们还需要反向过程,所以我们可以创建一个包含数据的VO,然后从该VO生成一个包含正确查询参数的URL

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


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

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

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


另一方面,您可以实现您描述的这种机制。在MVC环境中,此任务将由控制器处理。只有在传递了大量GET参数的情况下,这才有意义。您应该从一开始就尽量避免这种做法。

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

  • 表单变量通常映射到对象。它是PHP中的VO或Java中的Beans。在我看来,这将是最可读的转换形式,因为它为正在转换的HTML表单提供了上下文
  • 在许多情况下,我看到了某种表单实用程序帮助类,它将处理到和从的转换。然而,这不是一个特定的硬编码转换,大多数转换都是非常结构化和通用的。例如,它接受所有getter/setter方法并将其用作表单名称。例如,我的对象中可能有
    getUsername()
    ,然后表单实用程序将其转换为
  • 或者,您还可以通过映射覆盖来覆盖默认映射。这可以是以下形式:
    • 配置文件,例如,将实例变量映射到表单变量的XML文件。在上面的例子中,这样的映射可以是将username实例变量映射到一个更神秘的形式变量u
    • 语言功能,如Java中的注释或C#中的属性。语言特性将允许在不使用配置文件的情况下进行映射,而是在对象源代码本身中进行内联
  • 我见过一些项目,它们会为VO/Bean提供基类,这些项目有
    fromForm(input)
    toForm()
    ,它们利用上述表单实用程序。它为开发人员提供了便利,因此他们不必处理表单实用程序,只需从对象中调用
    toForm()
    fromForm(input)
    ,即可处理转换
现在根据上面的模式,对于神秘的表单字段,我通常会看到:

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

是的,我使用的是MVC框架,问题是我有很多GET参数(比如ebay上的链接)。控制器是读取这些参数并因此转换为某些VO/DTO的正确位置,但反向过程放在何处?如何生成链接?这应该是视图(或视图_模型)的一部分,但是我们在两个不同的地方有URL到VO的转换和映射。理论上,这项任务也是控制器的责任,因为控制器负责处理“请求”,无论我们是否准备下一个请求。我认为这是错误的,生成链接是视图的一项任务,如果您正在使用该模式,则视图模型甚至更好。我的控制器不知道如何生成视图,只知道他们需要调用的视图模型,而且链接可以由任何视图生成,因此从您的角度来看,任何控制器都会产生很多问题。现在,我有一个用于生成链接的帮助器类,该类使用参数和路由类,并由我的视图\ U模型使用。我选择使用帮助器类(我的视图/视图\模型使用该类)生成所有链接。它们接受VO并返回链接。逆过程在适当的控制器动作内。无论如何,我不确定这个解决方案,因为将VO转换为RequestParams的代码现在位于两个不同的位置。我不知道如何用POST参数解决这个问题(POST请求不是链接,所以我可能需要一个额外的FormParamsGenerator助手)。也许在VO中使用toParam和fromParam更干净(如果我们使用接口,甚至更干净),我希望这是一种常见的模式:(I ag
$filterVo = new FilterVo();
$filterVo->readableName = $_GET['_f'];