我正在处理的项目目前使用各种过滤器。过滤器本身效果很好。我遇到的问题是,当指定应该在哪些控制器上执行过滤器时,我最终得到一个非常大的列表。从功能上来说,这种方法很好但最终却很丑陋而且有点笨拙。
def filters =
{
filterSomething(controller:'one|two|three|...|xyz', action:'*')
{
//before filter here, not important.
}
}
有没有办法指定过滤器仅适用于给定包或包列表中的控制器?
如果没有任何开箱即用的东西,我正在考虑将某些东西绑在引导程序中并以此方式设置我的列表。
答案 0 :(得分: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)
}
}