2010-11-20 8 views
11

Come posso dinamicamente costruire una lista di mapping - invece di:dinamica 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") 
} 
} 

qualcosa come questo pseudo codice:

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

(non capisco quello che la statica le mappature sono - una mappa hash? variabili libere?)

Quello che sto cercando di ottenere sono mappature basate sul tipo di controller - ad es. helpdesk, amministratore o controller utente. Una volta che ho impostato le mappature voglio aggiungere sicurezza basata su URL, ma io non voglio di mappare ogni controller singolarmente:

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

risposta

11

Ho appena fatto quanto segue nella mia domanda:

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

io non avevo davvero fatto prima, la sua domanda mi ha spinto a risolvere questo problema è la mia app. È stata una di quelle cose che ho cercato di fare per un po '.

+0

Funziona, grazie. – DavidC

+0

Tranne che ora e suppongo che il reindirizzamento del controller non restituisca l'url corretto. – DavidC

+0

mmm..it dovrebbe Dashboard nella mia app rende rendering/admin/dashboard utilizzando lo stesso codice come sopra. –

0

è possibile incorporare la variabile $controller, vedere la documentation.

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

BTW, le mappature a controller s e, opzionale, i loro view s sono racchiusi da parentesi normali (), non quelli ricci {}.

Tali script Groovy (come UrlMappings.groovy) vengono analizzati da un'istanza ConfigSlurper, che infine li converte in un ConfigObject che implements Map. Certo, non sono sicuro di come questo parsing sia compiuto in dettaglio.

EDIT:

Here 's un UrlMappings.groovy che viene in qualche modo vicino a quello che si vuole. (Cerca "/ $ _ ctrl/$ _ action/$ id?".) Il codice, BTW, viene valutato in fase di esecuzione. Tuttavia, non sono stato in grado di far funzionare lo grailsApplication.

Un'altra idea era aggiungere un javax.servlet.Filter all'applicazione Web, ad esempio sottoclasse di Grails UrlMappingsFilter.

+0

dispiace - Avrei dovuto essere più chiaro - io voglio creare una mappa a seconda del nome del controller o il pacchetto ecc esempio: urlMappings class { mapping statici = { application.controllerClasses. ogni { if (it.name.startsWith ("help")) "/helpdesk/${it.name}/$action?/$id?" (controller = "$ {it.name}") \t else if (it.name.startsWith ("admin")) { "/admin/${it.name}/$action?/$id?" (controller = "$ {it.name}") } \t } } } – DavidC

+0

Domanda modificata con una formattazione migliore rispetto al commento precedente. – DavidC

+0

Grazie per il collegamento - molto flessibile – DavidC

2

Volevo ottenere qualcosa di simile per la mia applicazione e ho trovato un modo carino fornito dai graal. Va come

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

Attenzione, questo non funziona se si utilizza $controller vs. $cName (o qualsiasi altra cosa ti piacerebbe avere lì) e sarà gettare un NullPointerException invece.

Come bonus è quindi possibile utilizzare il nome di mapping come

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

per ottenere un link a/admin/backend/login - Spero che questo aiuti!

Stai fresco!

5

Il bean grailsUrlMappingsHolder è disponibile in servizi e controller. Sebbene la sua implementazione concreta di UrlMappingsHolder non abbia un metodo add, la sua superclasse lo fa. Semplice come questo in Grails 2.3.4

def grailsUrlMappingsHolder 

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

Questo è dal 2.3 [fonte] (https://github.com/grails/grails-core/blob/e1c225882e59d18814f0b6b03ef2586731ce20ad/grails-web-url-mappings/src/main/groovy/grails/web/mapping/UrlMappings. java) –

+0

Ciao. Posso chiederlo come posso richiamarlo sul mio 'Bootstrap.groovy', ho un po 'di [un problema qui] (http://stackoverflow.com/q/42480608/4043409) e penso che un piccolo ritocco di questo la risposta può risolvere il mio problema. – Gideon

Problemi correlati