【问题标题】:Grails filter controller in package包中的 Grails 过滤器控制器
【发布时间】:2013-04-25 17:05:36
【问题描述】:

我正在处理的项目目前使用过滤器来处理各种片段。过滤器本身工作得很好。我遇到的问题是,在指定应该在哪些控制器上执行过滤器时,我最终得到了一个非常大的列表。从功能上讲,这可以正常工作,但最终会变得丑陋且有些笨拙。

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

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

如果没有开箱即用的东西,我正在考虑将一些东西绑定到引导程序中并以这种方式设置我的列表。

【问题讨论】:

    标签: grails


    【解决方案1】:

    您可以在所有控制器上设置一个过滤器,然后检查它们的包,然后决定您要做什么。有更好、更优雅的编码方式,但只是为了给你一个想法。

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

    【讨论】:

    • 这可能值得探索,因为看起来没有开箱即用的东西。它至少比硬编码一个巨大的列表更优雅,特别是因为忘记向所述列表添加新控制器会导致非常意外的行为。我猜性能不会成为问题,但结果可能会以某种方式缓存。
    • 当然,并且可能有更简单的方法从类字符串中获取类包名称,这样您就不需要像我这样做的方式迭代列表。
    • 由于我认为没有官方的方法可以做到这一点,因此我将接受答案,因为它是一种合理的解决方法。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多