Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails过滤器语法,或者,如何在Grails外部调用Grails过滤器_Grails_Groovy_Filter - Fatal编程技术网

Grails过滤器语法,或者,如何在Grails外部调用Grails过滤器

Grails过滤器语法,或者,如何在Grails外部调用Grails过滤器,grails,groovy,filter,Grails,Groovy,Filter,Grails提供了在控制器之前运行的。它们在如下类中定义: class SecurityFilters { def filters = { myFilter(controller:'*', action:'*') { // What are those weird colons?? print "I'm filtering!" // Code that does the filtering goes here }

Grails提供了在控制器之前运行的。它们在如下类中定义:

class SecurityFilters {
   def filters = {
       myFilter(controller:'*', action:'*') { // What are those weird colons??
           print "I'm filtering!"
           // Code that does the filtering goes here
       }
   }
}
这些代码非常有用,但我想更好地理解语法,因为它不像我以前见过的任何Groovy代码。特别是,上面以
myFilter
开头的那行看起来非常奇怪。这是名为
myFilter
的方法的方法定义吗?如果是,每个参数后面的“*”是什么意思?我认为它可能是一个默认参数值,但它应该是
='*'
。我以前在方法调用中见过使用冒号的命名参数,但这不可能是方法调用,因为我还没有在其他任何地方定义
myFilter()

我想如果有人能告诉我如何从普通Groovy类执行过滤代码,我会理解得更好。换句话说,如果我有一个包含上述行的文件MyFilters.groovy,我如何完成此groovy代码,使其打印“我正在过滤”


在grails之外很难调用过滤器,因为它们依赖于许多无法设置的管道。行
myFilter(控制器:“”,操作:“”)
是一个方法定义,它包含两个参数,一个控制器和操作模式。*表示将此筛选器应用于任何继续类型的对象。例如,如果我们想确保用户在未经授权的情况下无法创建任何内容,我们将使用以下过滤器
控制器:'*',操作:'create'
这意味着任何时候调用create操作时,都会执行存储在该函数体中的代码,但对于list、show或edit,不会执行任何筛选器。如果您确实需要详细信息,您可以随时下载grails源代码。
编辑:

代码可以编译,因为它是在过滤器中定义的函数。

下面的Groovy代码将打印“我正在过滤!”:

在本例中,filters是一个闭包,它调用名为myFilter的方法,并传递一个映射和闭包。您可以将myFilter想象为:

myFilter([controller:'*', action:'*'], closure)
映射可以包含控制器、操作或uri等键。通配符(*)用于Grails在试图确定调用哪个闭包时尝试匹配HTTP请求中的URI


我对Grails如何处理过滤器的理解是使用了委托加载器类。loader类提供methodMissing方法,并为filters闭包内的每个方法调用创建FilterConfig。当发出HTTP请求时,Grails会查看所有FilterConfig对象,并尝试查找匹配的作用域(在映射中查找控制器、操作或uri,并使用正则表达式匹配通配符)。如果找到匹配项,它将调用传递到Filter类中方法的闭包。

谢谢-我知道过滤器及其控制器和操作模式在Grails中是如何工作的。但是我想知道为什么上面显示的MyFilter代码是合法的Groovy。它可以编译,但我不知道为什么!问得好,松鼠!我一直在与同样的问题作斗争——谢谢你的提问!我需要知道同样的事情…我几乎睡不着,哈哈!
class SecurityFilters {
   def filters = {
       myFilter(controller:'*', action:'*') { // What are those weird colons??
           print "I'm filtering!"
           // Code that does the filtering goes here
       }
   }   
}

class FilterDelegate {
    def methodMissing(String methodName, args) {
        // methodName == myFilter
        // args[0] == [controller:*, action:*]
        // args[1] == {print "I'm filtering!"}
        args[1].call()
    }
}

def sf = new SecurityFilters()
def filtersClosure = sf.filters
filtersClosure.delegate = new FilterDelegate()
filtersClosure.call()
myFilter([controller:'*', action:'*'], closure)