2010-11-20 81 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