2010-11-20 83 views
11

如何动态建立的映射列表 - 而不是:动态Grails的URL映射配置

class UrlMappings { 
static mappings = { 
    "/helpdesk/user/$action?/$id?" (controller="helpdeskuser") 
    "/helpdesk/group/$action?/$id?" (controller="helpdeskgroup") 
    "/helpdesk/company/$action?/$id?" (controller="helpdeskcompany") 
    "/helpdesk/account/$action?/$id?" (controller="helpdeskaccount") 
    "/admin/company/$action?/$id?" (controller="admincompany") 
    "/admin/account/$action?/$id?" (controller="adminaccount") 
} 
} 

这样的伪代码:

class UrlMappings { 
static mappings = { 
    application.controllerClasses.each { 
    if(it.name.startsWith('helpdesk')) 
     "/helpdesk/${it.name}/$action?/$id?" (controller="${it.name}") 
    if(it.name.startsWith('admin')) 
     "/admin/${it.name}/$action?/$id?" (controller="${it.name}") 
    } 
} 
} 

(我不明白什么静态映射是 - 哈希映射?自由变量?)

我想实现的是基于控制器类型的映射 - 例如帮助台,管理员或用户控制器。有一次,我建立了我想增加是基于URL的安全性映射,但是我不希望每个控制器单独映射:

grails.plugins.springsecurity.interceptUrlMap = [ 
    '/helpdesk/**': ['ROLE_HELPDESK','ROLE_ADMIN'], 
] 

回答

11

我刚刚做了以下我的应用程序:

import org.codehaus.groovy.grails.commons.ApplicationHolder 

class UrlMappings { 
    static mappings = {   
    for(controllerClass in ApplicationHolder.application.controllerClasses) { 
     // Admin Controllers first 
     if(controllerClass.name.startsWith("Admin")){ 
     // note... fixes the case so that AdminUserController maps to /admin/user 
     "/admin/${controllerClass.name[5].toLowerCase() + controllerClass.name[6..-1]}/$action?/$id?" { 
      controller = "admin${controllerClass.name[5..-1]}".toString() 
     } 
     } 
    } 
    } 
} 

之前我没有真正做到这一点,你的问题促使我来解决,这是我的应用程序。这一直是我一直试图做的事情之一。

+0

这工作,谢谢。 – DavidC 2010-11-20 16:55:51

+0

除了现在我猜控制器重定向不会返回正确的url。 – DavidC 2010-11-20 18:24:43

+0

mmm..it应Dashboard在我的应用程序呈现/管理/仪表板使用上述相同的代码。 – 2010-11-20 19:08:41

0

可以嵌入$controller变量,看documentation

static mappings = { 
    "/helpdesk/$controller/$action?/$id?"() 
} 

BTW,映射到controller S和,可选的,他们view S被正常括号(),不卷曲的人{}封闭。

这种Groovy脚本(如UrlMappings.groovy)由ConfigSlurper实例,它最终将其转换为ConfigObjectimplements Map解析。无可否认,我不确定这个解析是如何完成的。

编辑

Here的一个UrlMappings.groovy自带有点接近你想要什么。 (搜索“/ $ _ ctrl/$ _ action/$ id?”)。代码BTW在运行时进行评估。尽管如此,我还是无法使grailsApplication正常工作。

另一个想法是向web应用程序添加javax.servlet.Filter,即通过继承Grails的UrlMappingsFilter

+0

对不起 - 我应该是更清楚的 - 我想这取决于在控制器的名称或包映射等如:类UrlMappings { 静态映射= { application.controllerClasses。每个{ 如果(it.name.startsWith( “帮助”)) “/helpdesk/${it.name}/$action?/$id?” (控制器= “$ {} it.name”) \t否则,如果(it.name.startsWith( “管理员”)){ “/admin/${it.name}/$action?/$id?” (控制器=“$ {it.name}”) } \t } } } – DavidC 2010-11-20 14:10:25

+0

修改后的问题的格式比上面的评论更好。 – DavidC 2010-11-20 14:17:53

+0

感谢您的链接 - 非常灵活 – DavidC 2010-11-20 16:59:05

2

我想为我的应用程序实现类似的东西,并找到了一个由grails提供的好方法。它是这样

name admin: "/admin/$cName/$action/$id?" { 
    controller = { 
     "admin" + params.cName.capitalize() 
    } 
} 

当心,这并不工作,如果你使用$controller$cName(或任何你喜欢那里),将抛出NullPointerException代替。

作为奖励,那么你可以使用映射名称,比如

<g:createLink 
    controller="adminBackend" action="login" 
    mapping="admin" params="[cName:'backend']" 
/> 

得到一个链接到/管理/后端/登录 - 希望这有助于!

保持新鲜!

5

的grailsUrlMappingsHolder豆是在服务和控制器可用。虽然UrlMappingsHolder的具体实现没有add方法,但它的超类仍然有。这样简单Grails的2.3.4

def grailsUrlMappingsHolder 

def addMapping() {   
    grailsUrlMappingsHolder.addMappings({ 
     "/admin"(controller:"admin" action:"index") 
    });   
} 
+0

这一个是因为2.3 [源(https://github.com/grails/grails-core/blob/e1c225882e59d18814f0b6b03ef2586731ce20ad/grails-web-url-mappings/src/main/groovy/grails/web/mapping/UrlMappings。 java) – 2014-06-25 15:17:55

+0

嗨。我能问我怎么能调用这个对我的'Bootstrap.groovy',我有一个[问题就在这里]一点点(http://stackoverflow.com/q/42480608/4043409),我认为这有点扭捏回答可以解决我的问题。 – Gideon 2017-03-07 08:50:32