2009-08-10 6 views
7

Grailsはコントローラの前に実行されるfiltersを提供します。Grailsフィルタの構文、またはGrailsの外で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コードをどのように処理して「フィルタリングしていますか」というメッセージを表示するにはどうすればいいですか?

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

大きな質問リス!私はちょうど同じ問題を争っている - それを求めるおかげで! – alpian

+0

私は何かを知る必要がある....私はほとんど眠ることができない、笑! – Topera

答えて

5

「私はフィルタリングよ!」:

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をという名前のメソッドを呼び出し、マップやクロージャを渡すクロージャです。

myFilter([controller:'*', action:'*'], closure) 

このマップには、コントローラ、アクション、またはURIなどのキーが含まれている可能性があります。ワイルドカード(*)は、どのクロージャを呼び出すかを決定しようとしたときに、GrailsがHTTPリクエストからURIを照合しようとするときに使用されます。

Grailsがどのようにフィルタを処理するかを理解するには、デリゲートローダークラスが使用されている必要があります。ローダークラスはmethodMissingメソッドを提供し、フィルタークロージャー内の各メソッド呼び出しごとにFilterConfigを作成します。 HTTPリクエストが行われると、GrailsはすべてのFilterConfigオブジェクトを調べ、一致するスコープを見つけようとします(コントローラー、アクション、またはuriのマップを検索し、正規表現を使用してワイルドカードと照合します)。一致するものが見つかった場合は、Filterクラスのメソッドに渡されたクロージャを呼び出します。

+0

すばらしい説明 - ありがとう! –

0

フィルタは、セットアップしない多くの配管に依存しているため、簡単には呼び出すことができません。
myFilter(コントローラ: ''、アクション: '')
はコントローラとアクションパターンの2つの引数を取るメソッド定義です。 *は、このフィルタを先行するタイプのオブジェクトに適用することを意味します。たとえば、権限がない限りユーザーが何も作成できないようにしたい場合は、次のフィルタを使用します。
コントローラ: '*'、アクション: '作成'
これは、作成アクションが呼び出されるたびに、その関数本体に格納されたコードが実行されますが、リスト、表示、または編集するフィルタは実行されないことを意味します。本当に詳細が必要な場合は、いつでもgrailsのソースコードをダウンロードできます。
編集:
コードはフィルタに定義された関数なのでコンパイルされます。次のGroovyコードを印刷し

+0

ありがとうございます - Grails内でフィルタとそのコントローラとアクションパターンがどのように機能するかを知っています。しかし、上記のMyFilterコードがなぜGroovyであるのかを知りたいのですが。それはコンパイルされますが、私はその理由を理解できません! –

関連する問題