SYMFONY 3.3-比在每个函数中具有全局映射数组并对此数组进行检查更为最佳的解决方案



当前功能

你好,

我们正在使用Symfony 3.3构建REST API,并希望能够作为JSON响应输出任何类型的错误信息(既有异常和API特定错误(。

我们已经安装了一个捆绑包来处理API例外处理。(它将捕获正常的内置例外,例如404,并以JSON格式的简短描述返回其状态代码(。

此捆绑包的作用是,例如,如果我们进入不存在的路线,它将传递给类似于以下的JSON对象:

{ "errorCode": 404, "errorMessage": "No route found for /testing" }

需要的新功能

现在,所有正常异常都以JSON格式捕获和显示,我们希望在用户错误地使用我们的API时捕获,然后提醒他们如何通过JSON响应来修复他们的请求,我们发送了它们。<<<<<<<<<<<<<</p>

我们想捕获API使用错误,例如用户是:

  1. 缺少必需的参数。
  2. 传递不正确的参数类型。

我们在控制器中有许多不同的操作,每个操作都接受不同的参数列表,有些人可能根本不接受参数。

我们希望能够在路由本身中捕获两个不正确的参数(例如,路由的第一部分以语言代码开始 - 即http://localhost/en en/someaction之类的东西(,我们也希望要捕获不正确的参数作为查询 - 即,如果它们执行http://localhost/en/someaction?firstName = 123之类的事情。显然,在这种情况下,我们希望将一个字符串传递到第一个名称参数中。

当前提出的解决方案

a。我们想象,我们需要某种全局映射数组,该数组将保留每个控制器操作的正确参数名称的数据(在这一点上将此信息存储在数据库中可能不是一个选项(。例如,我认为我们可以拥有一个类似以下内容的关联数组:

[ "addUserAction" => ["firstName|str|req", "lastName|str|opt"],
"deleteUserAction" => ["userId|int|req"] ]

b。唯一的事情是,我们不仅要在控制器操作级别上执行这些检查,而且我们还希望在每个存储库功能中执行这些检查,以提供额外的安全性。因此,我们实际上必须在上面的数组中添加其他数据,以区分是否正在执行控制器操作还是存储库的函数。也许类似:

[ "ctl.user.addUserAction" => ["firstName|str|req", "lastName|str|opt"],
"repo.user.deleteUser" => ["userId|int|req"] ]

c。然后,此映射数组将需要存储在全球的某个地方,控制器和存储库都可以访问它。

d。一旦我们能够从控制器和存储库中访问映射数组,然后我们就会查找我们在数组中的当前功能,然后我们知道要接受的正确参数是什么JSON异常。

问题

Q1。更好的解决方案?

查看上面提出的计划,即使我能够实施它,似乎大量的开销工作(以及一个非常耦合的设计,涉及每当我们添加新的新型时,都必须不断添加阵列功能(。我认为有一种更聪明的方法不仅可以执行Symfony中的映射,而且可以在适当的时间检查映射,而无需编辑每个功能以检查对抗阵列的原因(这就是为什么我要寻求帮助在我开始编码之前(。我将感谢有关如何使该建议的解决方案变得更好,更维护的任何反馈。

Q2。全局关联阵列

假设出于某种原因,我们确实想与上面提出的全球关联阵列想法相处,出于好奇心,适当的位置将在何处放置这样的数组,以便可以在全球范围内访问它(即通过控制器的操作还是存储库的功能(?(作为来自Codeigniter-background的PHP开发人员,我知道在CodeIgniter中,我们会将要在ststartants.php文件中使用的内容放置在conspland.php文件中。不知道在symfony中将是什么等效功能(。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>

,关于控制器操作参数,似乎您正在尝试重新创建路由部分。已经有一种限制参数及其类型的机制(例如,通过Regex(。

至于方法参数,PHP井是动态键入的语言(如果您使用PHP 7及以上,则可以简单地键入HINT标量类型(integerstring等(。至于可选的参数,您只需默认为null

但是您要使用额外的安全层实现的目标,通常在现实世界中没有用。如果您需要这种防弹代码,则可以考虑使用Java或C#。消毒用户输入((是一回事,应该始终进行(,但是用来消毒方法参数有点偏执。没有犯罪是指,但您应该信任您的开发人员。

相关内容

最新更新