Конфигурация динамического отображения Grails Url - PullRequest
11 голосов
/ 20 ноября 2010

Как я могу динамически построить список отображений - вместо:

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'],
]

Ответы [ 4 ]

11 голосов
/ 20 ноября 2010

Я только что сделал в своем приложении следующее:

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

Я бы на самом деле не делал этого раньше, ваш вопрос побудил меня исправить это мое приложение.Это была одна из тех вещей, которые я пытался сделать некоторое время.

5 голосов
/ 03 января 2014

Бин grailsUrlMappingsHolder доступен в сервисах и контроллерах. Хотя это конкретная реализация UrlMappingsHolder не имеет метода add, его суперкласс делает. Просто как в граале 2.3.4

def grailsUrlMappingsHolder

def addMapping() {        
    grailsUrlMappingsHolder.addMappings({
        "/admin"(controller:"admin" action:"index")  
    });        
}
2 голосов
/ 21 марта 2013

Я хотел добиться чего-то похожего для своего приложения и нашел хороший способ, предоставляемый Grails.Это выглядит как

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

Осторожно, это не сработает, если вы используете $controller против $cName (или все, что вам нравится там), и вместо этого выдает исключение NullpointerException.1007 * В качестве бонуса вы можете использовать имя сопоставления, например

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

, чтобы получить ссылку на / admin / backend / login - надеюсь, это поможет!

Будьте в курсе!

0 голосов
/ 20 ноября 2010

Вы можете встроить переменную $controller, см. Документацию .

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

Кстати, сопоставления с controller с и, необязательно, их view сзаключенные в нормальные скобки (), а не в фигурные {}.

Такие скрипты Groovy (как UrlMappings.groovy ) анализируются экземпляром ConfigSlurperчто в конечном итоге преобразует их в ConfigObject, что implements Map.По общему признанию, я или не уверен, как этот разбор выполнен подробно.

РЕДАКТИРОВАТЬ :

Здесь и UrlMappings.groovy что-то вроде того, что вы хотите.(Ищите «/ $ _ ctrl / $ _ action / $ id?».) Код BTW оценивается во время выполнения.Тем не менее, я не смог заставить grailsApplication работать.

Другая идея состояла в том, чтобы добавить javax.servlet.Filter в веб-приложение, т. Е. С помощью подклассов Grails 'UrlMappingsFilter.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...