当前位置: 首页 > 知识库问答 >
问题:

Symfony v2.8-同一动作函数/方法的过载路由器(不同参数集)

卫博
2023-03-14

我看到这个问题有几个答案,有人说可以做到,有人说可以做(但这是一个坏主意),有人说不。

我有以下路由器注释和动作函数/方法:

/**
 * @Route( "/ctlr/manageAccount/{action}/{username}/{loginDateTime}/{code}/{password}",
 *         requirements={ "action"        = "activate|unlock|passwordReset|changePassword|action",
 *                        "username"      = ".*",
 *                        "loginDateTime" = ".*",
 *                        "code"          = "[\d\w]*",
 *                        "password"      = "[^\s]*" } )
 */

public function manageAccountAction( $action, $username,
                                     $loginDateTime='', $code=FALSE,
                                     $password='' ) { ... }

manageAccoungAction函数/方法中大约80%的代码对于所有操作都是相同的,其中参数的用法如下:

    < li>$action -该值指示要执行什么操作, < li>$username -正在操作的用户的名称, < li>$loginDateTime -无论用户是否登录,该值都是数字字符串或“” < li>$code -用户帐户的安全密钥,以确保呼叫是合法的,以及 < li>$password -当用户更改其密码时出现。

最后三个参数不会用于所有$action值,因此这些值被声明为可选的。

如何为$action的每个操作创建路由规则?

(r)=必需;(o)=可选

我如何为上述条件定义路线规则?

请注意,对于上面@Route语句中显示的Route规则,$username包含用户名和一个尾随斜杠 (/), $loginDateTime为",$code为false,$pass为"当用户未登录时。

当用户未登录时,$username将包含用户名、斜杠和应$loginDateTime的数字字符串,$loginDateTime仍为“”,$code为 false,$password为“”。

显然,斜杠不用于分隔和分配 URL 中的值:

/ctlr/manageAccountAction/activate/USERNAME//12345
/ctlr/manageAccountAction/unlock/USERNAME//12345
/ctlr/manageAccountAction/passwordReset/USERNAME//12345/NEWPASSWORD
/ctlr/manageAccountAction/changePassword/USERNAME/76543//NEWPASSWORD

其中USERNAME代表用户的实际用户名,123456\是用户帐户数据的备用密钥,NEWPASSWORD是用户的新密码,76543是登录日期时间。

谢谢你。

共有1个答案

索吕恭
2023-03-14

有两件事需要更改。首先,将用户名的要求从:

*                    "username"      = ".*",

自:

*                    "username"      = "[a-z0-9]*",

似乎URL中的斜线(/)解析不是首先执行的,而是在需求检查的同时或之后执行的,因此用户名和下一个值之间的斜线没有像预期的那样工作,因为斜线和下一个值没有与用户名分开,而是一起运行。

另一件事是从URL和路由规则中提取登录日期和时间密码值。这是因为值和规则,这些值及其函数参数是用户实际登录时使用的唯一值。这意味着,如果它们与其他操作一起保留,则URL将具有两个连续的斜杠,我不认为可以正确解析。最好将使用这些值和函数参数的更改密码操作放在新函数中。

 类似资料:
  • 在我的存储区被调度之后,我调用,它将我发送到正确的视图,但我无法访问查询参数。我的其余代码可以在https://github.com/crh225/hotreactasp/tree/master/src/hotreactasp/content找到,谢谢!

  • 本文向大家介绍JS中使用apply方法通过不同数量的参数调用函数的方法,包括了JS中使用apply方法通过不同数量的参数调用函数的方法的使用技巧和注意事项,需要的朋友参考一下 apply()方法定义 函数的apply()方法和call方法作用相同,区别在于接收的参数的方式不同。 apply()方法接收两个参数,一个是对象,一个是参数数组。 apply()作用 1、用于延长函数的作用域 示例: 这里

  • B类: 如何影响这个界面?

  • Swagger用相同的路径和方法但不同的参数覆盖方法 我有一个带有Spring Boot 2.3.5.RELEASE,webflux和springfox 3.0.0的应用程序。我开发了两个具有相同路径但参数不同的GET方法,一个不接收参数并返回list,另一个返回findAll。 情况是,Swagger只生成其中一种方法的文档,有时是列表,有时是分页。我怎么能告诉swagger他们是不同的方法,并

  • 当我多次调用同一个函数时,每次都传递了不同的参数,我会这样做: 有没有更方便的方法做到这一点呢?

  • 我想为同一个GET路径提供多个函数。 我也希望我的网络服务“找到”这些函数,当且仅当查询参数与URL字符串中的参数匹配时。 例如: 我有 对于该路径,我希望有2个功能: 和 现在我得到一个错误: 严重:在资源和/或提供程序类中检测到以下错误和警告:严重:产生媒体类型冲突。资源方法public javax . ws . RS . core . response 所以首先:有什么方法可以实现我在这里想