2013-04-25 89 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