3

任何已经使用 Grails 实现过类似功能的人都可以告诉我哪些是创建格式为“ http://www.myservice.com/username ”的用户配置文件 URL 的好做法(如果有的话),就像在 Facebook 中一样,推特,领英?

我正在尝试通过 UrlMappings 来实现它,在我看来,我需要打破代码约定,至少对于控制器而言。

所以,欢迎任何建议,谢谢。

更新 1

当我提到我对打破代码约定的担忧时,我的意思是我想使用此映射显示用户配置文件,但我的应用程序中确实有其他对象,我想使用默认映射访问它们:

"/$controller/$action?/$id?"()

解决方案

感谢我在这里收到的巨大贡献,我想出了这个解决方案,它解决了我的问题

正如所指出的,要进行这种映射,我需要更密切地控制我的请求是如何处理的。这意味着我需要告诉 Grails 我不想将哪些控制器映射到“用户名”规则。

由于这将是一项非常乏味的任务(因为我有几个控制器),所以我这样做是为了使其自动化:

UrlMappings.groovy

static mappings = {
     getGrailsApplication().controllerClasses.each{ controllerClass ->
     "/${controllerClass.logicalPropertyName}/$action?/$id?"(controller: controllerClass.logicalPropertyName)
     }
     "/$username/$action?"(controller: "user", action: "profile")
     }
     ...
 }

当然,我需要在我的用户注册过程中做一些类似的事情,以避免用户名等于某个控制器名称。

就是这样,谢谢大家。

4

2 回答 2

4

假设您有一个 UserController 并且您要将任何 domain.com/username 映射到用户控制器的 show 操作,您的 url 映射可能是这样的:在我的示例中,name 将成为您的参数中的一个参数。有关更多详细信息,请参阅此处

希望这可以帮助。

static mappings = {
    "/$name"(controller: "user", action: "show")

    ...
}
于 2013-04-10T15:25:51.363 回答
1

根据您的要求,http://yourdomain.com/ 之后的所有内容都可以是用户名或您的其他控制器之一,这可能会产生不良影响,具体取决于首先定义的 url 映射(例如用户控制器与非用户控制器)。但很可能非用户控制器列表将是较小的列表,因此您应该首先放置它并对其进行过滤,然后将所有其他 url 映射视为用户映射。

这是一个例子:

static mapping = {
  "/$controller/$action?/$id?" {
    constraints {
      controller inList: ['nonUserController1', 'nonUserController2',...]
    }
  }

  //this should work for /username and /username/whateveraction
  "/$username/$action?"(controller: 'user')
}

这里需要注意的一些事项:

  • 您需要首先放置非用户控制器 url 映射,因为之后的所有其他内容都http://yourdomain.com/可能是用户名 - 对吗?
  • 其次,您需要设置约束以捕获所有非用户控制器,同时忽略用户 url 映射
  • 您还需要防止用户使用与您的非用户控制器之一匹配的用户名进行注册
于 2013-04-10T23:36:57.537 回答