2009-08-10 15 views
7

Grails aufrufen, die vor Ihren Controllern filters laufen. Sie sind in Klassen definiert, die wie folgt aussehen:Grails Filter-Syntax, oder, wie Sie einen Grails-Filter außerhalb Grails

class SecurityFilters { 
    def filters = { 
     myFilter(controller:'*', action:'*') { // What are those weird colons?? 
      print "I'm filtering!" 
      // Code that does the filtering goes here 
     } 
    } 
} 

Diese arbeiten sehr, aber ich möchte die Syntax besser verstehen, wie es wie jedes Groovy-Code sieht nicht ich vorher gesehen habe. Insbesondere scheint die darüber liegende Zeile mit myFilter sehr merkwürdig zu sein. Ist dies eine Methodendefinition für eine Methode namens myFilter? Wenn ja, was bedeutet :'*' nach jedem Parameter? Ich dachte, es könnte ein Standardparameterwert sein, aber das wäre ='*'. Ich habe benannte Parameter mit Doppelpunkten in der Methode Aufrufe vor gesehen, aber das konnte kein Methodenaufruf sein, weil ich myFilter() woanders nicht definiert habe.

Ich denke, ich würde viel besser verstehen, wenn mir jemand nur sagen könnte, wie man den Filtercode von einer normalen Groovy-Klasse ausführt. Mit anderen Worten, wenn ich eine Datei MyFilters.groovy habe, die die Zeilen oben enthält, wie könnte ich diesen Groovy-Code beenden, so dass er "Ich filtere" druckt?

import MyFilters 
def mf = new MyFilters() 
mf.filters.somethingGoesHere // Help! How do I finish this line so it calls my filtering code? 
+0

Große Frage Eichhörnchen! Ich habe gerade mit dem gleichen Problem gekämpft - danke, dass du es fragst! – alpian

+0

Ich muss das Gleiche wissen .... Ich kann fast nicht schlafen, lol! – Topera

Antwort

5

würde der folgende Groovy-Code drucken „Ich bin Filterung!“:

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

In diesem Beispiel Filter ist ein Verschluss, der ein Verfahren myFilter Namen aufruft und eine Karte und einen Verschluss. Sie können sich myFilter vorstellen als:

Die Karte kann Schlüssel wie Controller, Aktion oder URI enthalten. Der Platzhalter (*) wird verwendet, wenn Grails versucht, den URI von der HTTP-Anforderung abzugleichen, wenn er versucht, den zu rufenden Abschluss zu ermitteln.

Ich verstehe, wie Grails Filter behandelt, ist, dass eine Delegate Loader-Klasse verwendet wird. Die Loader-Klasse stellt eine methodMissing-Methode bereit und erstellt für jeden Methodenaufruf innerhalb der Filterschließung eine FilterConfig. Wenn eine HTTP-Anforderung gestellt wird, durchsucht Grails alle FilterConfig-Objekte und versucht, einen übereinstimmenden Bereich zu finden (sucht in der Map nach einem Controller, einer Aktion oder einem uri und verwendet Regexs für die Suche nach Platzhaltern). Wenn es eine Übereinstimmung findet, ruft es die Closure auf, die an die Methode in der Filter-Klasse übergeben wurde.

+0

Große Erklärung - danke! –

0

Sie können Filter nicht leicht außerhalb von Grails aufrufen, da sie von vielen Rohrleitungen abhängig sind, die nicht eingerichtet werden. Die Zeile
myFilter (Controller: '', Aktion: '')
ist eine Methodendefinition, die zwei Argumente benötigt, einen Controller und ein Aktionsmuster. * bedeutet, dass dieser Filter auf jedes Objekt des fortlaufenden Typs angewendet wird. Wenn wir beispielsweise sicherstellen möchten, dass Benutzer nichts erstellen können, wenn sie nicht autorisiert sind, verwenden wir den folgenden Filter.
controller: '*', action: 'create'
Dies würde bedeuten, dass bei jedem Aufruf einer create action der in diesem Funktionskörper gespeicherte Code ausgeführt würde, aber für list, show oder edit würde kein Filter ausgeführt. Wenn Sie wirklich Details wollen, können Sie immer den Grails-Quellcode herunterladen.
bearbeiten:
Der Code kompiliert, da es eine Funktion ist, die in einem Filter definiert ist.

+0

Danke - Ich weiß, wie Filter und ihre Controller und Aktionsmuster in Grails funktionieren. Aber ich würde gerne wissen, warum der oben gezeigte MyFilter-Code legal Groovy ist.Es kompiliert, aber ich kann nicht herausfinden, warum! –