2013-04-25 43 views
3

我正在处理的项目目前使用各种过滤器。过滤器本身效果很好。我遇到的问题是,当指定哪个控制器应该执行过滤器时,我会得到一个非常大的列表。在功能上,这工作正常,但它最终变得丑陋,有些笨拙。包装中的Grails过滤器控制器

def filters = 
{ 
     filterSomething(controller:'one|two|three|...|xyz', action:'*') 
     { 
      //before filter here, not important. 
     } 
    } 

有没有办法指定过滤器只适用于给定包或软件包列表中的控制器?

如果没有任何东西可以使用,我正在考虑将某些东西绑定到bootstrap中,然后设置我的列表。

回答

2

你可以在所有的控制器上都有一个过滤器,然后检查他们的软件包,然后决定你想要做什么。有更好,更优雅的方式来编码,但只是给你一个想法。

class MyFilters { 
def grailsApplication 


def filters = { 
    all(controller:'*', action:'*') { 
     before = { 
      if (checkController(['com.package.name'],controllerName)){ 
      } 
     } 
    } 
} 


def searchInList(list,packageName){ 
    for (keyword in list) { 
     if (packageName.contains(keyword)) return true 
    } 
    return false 
} 

Boolean checkController(def includePackageList,cname) { 
    def dlist = grailsApplication.getArtefacts("Controller") 
    def filteredList= dlist.findAll{ searchInList(includePackageList,it.getPackageName()) } 
    return filteredList.contains(cname) 
} 
} 
+1

这可能是值得探讨的,因为它看起来没有什么开箱即可。它至少比硬编码巨型列表更优雅,尤其是因为忘记将新控制器添加到所述列表导致非常意外的行为。我猜测性能不会是一个问题,但结果可能会以某种方式缓存。 – Joseph 2013-04-25 18:50:04

+0

当然,并且可能有更简单的方法从类字符串中获取类包名称,这样您就不需要按照我所做的方式重复列表。 – Alidad 2013-04-25 19:16:06

+0

由于我不认为有这样做的官方方式,我会接受答案,因为这是一个合理的解决方法。 – Joseph 2013-04-29 14:28:47