2010-11-20 11 views
11

Wie kann ich dynamisch eine Liste der Zuordnungen bauen - statt:Dynamische Grails URL Mapping Config

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") 
} 
} 

so etwas wie dieses Pseudo-Code:

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}") 
    } 
} 
} 

(Ich verstehe nicht, was die statische Zuordnungen sind - eine Hash-Karte? freie Variablen?)

Was ich versuche zu erreichen, sind Zuordnungen basierend auf dem Controller-Typ - z Helpdesk-, Admin- oder Benutzer-Controller. Sobald ich die Zuordnungen eingerichtet habe ich Sicherheit auf URLs basierend hinzufügen möchten, aber ich möchte nicht jeden Controller einzeln zur Karte:

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

Antwort

11

ich nur die folgende in meiner Anwendung getan habe:

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() 
     } 
     } 
    } 
    } 
} 

Ich würde nicht eigentlich zum ersten Mal, Ihre Frage mich dazu veranlasste, dies zu beheben mein app ist. Es war eines dieser Dinge, die ich seit einiger Zeit versuchte.

+0

Das funktioniert, danke. – DavidC

+0

Außer jetzt und ich denke, Controller Redirect gibt nicht die richtige URL zurück. – DavidC

+0

mmm..it sollte Dashboard in meiner App rendert/Admin/Dashboard mit dem gleichen Code wie oben. –

0

Sie die $controller Variable einbetten können, die documentation sehen.

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

BTW, die Zuordnungen zu controller s und, optional, ihre view s werden von normalen Klammern (), nicht lockig diejenigen {}.

Solche Groovy Scripts (als UrlMappings.groovy) durch eine Instanz ConfigSlurper geparst, die schließlich wandelt sie in eine ConfigObject dass implements Map. Zugegebenermaßen bin ich mir entweder nicht sicher, wie dieses Parsing im Detail durchgeführt wird.

EDIT:

Here ‚s ein UrlMappings.groovy, die etwas in der Nähe kommt zu dem, was Sie wollen. (Suche nach "/ $ _ ctrl/$ _ action/$ id?".) Der Code, BTW, wird zur Laufzeit ausgewertet. Trotzdem konnte ich die nicht zum Laufen bringen.

Eine weitere Idee bestand darin, der Webanwendung ein javax.servlet.Filter hinzuzufügen, d. H. Durch Unterklassenbildung von Grails 'UrlMappingsFilter.

+0

Sorry - ich soll klarer sein - ich mag es in dem Controller-Namen oder Paket in Abhängigkeit zur Karte usw. zB: class urlMappings { statische Zuordnungen = { application.controllerClasses. jeweils { if (it.name.startsWith ("help")) "/helpdesk/${it.name}/$action?/$id?" (controller = "$ {it.name}") \t sonst if (it.name.startsWith ("admin")) { "/admin/${it.name}/$action?/$id?" (controller = "$ {it.name}") } \t } } } – DavidC

+0

Modifizierte Frage mit besserer Formatierung als oben Kommentar. – DavidC

+0

Danke für den Link - sehr flexibel – DavidC

2

Ich wollte etwas ähnliches für meine Anwendung erreichen und fand einen netten Weg durch die Grails. Es geht so

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

Vorsicht, dies nicht, wenn Sie $controller vs. $cName verwenden funktioniert (oder was auch immer Sie es haben) und wird stattdessen ein Nullpointer werfen.

Als Bonus erhalten Sie dann die Zuordnung Namen wie

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

können einen Link zu/admin/backend/login zu bekommen - Hoffe, das hilft!

Bleiben Sie frisch!

5

Die Bean grailsUrlMappingsHolder ist in Diensten und Controllern verfügbar. Obwohl es sich bei der konkreten Implementierung von UrlMappingsHolder nicht um eine Add-Methode handelt, tut dies ihre Oberklasse. So einfach den in Grails 2.3.4

def grailsUrlMappingsHolder 

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

Dieser ist seit 2.3 [source] (https://github.com/grails/grails-core/blob/e1c225882e59d18814f0b6b03ef2586731ce20ad/grails-web-url-mappings/src/main/groovy/grails/web/mapping/UrlMappings. Java) –

+0

Hallo. Kann ich fragen, wie kann ich dies auf meinem 'Bootstrap.groovy' aufrufen, ich habe ein kleines Problem [http://stackoverflow.com/q/42480608/4043409] und ich denke ein wenig daran zu optimieren Antwort kann mein Problem lösen. – Gideon