2016-08-09 41 views
0

Ich habe einen Filter, den ich in meiner Play-Anwendung verwende. Ich habe einen einzigen Fall für diesen Filter, um sein Verhalten zu ändern. Ich brauche einen Weg, um zu bestimmen, welche Aktionen mit diesem Fall übereinstimmen.Bestimmen Sie die Framework-Aktion von Router

Meine Gedanken sind derzeit, entweder eine Liste von kommentierten Controller-Aktionen zu erstellen oder nach Aktionen eines bestimmten Typs zu suchen.

Derzeit hat mein Filter die play.api.routing.Router injiziert.

Wie würde ich feststellen, mit welcher Aktion die aktuelle Anfrage bearbeitet würde?

Ist es möglich, die zugrunde liegende Aktion anhand des Umbruchfilters zu bestimmen?

EDIT (Hinzufügen von Testaufbau):

object MyController extends Controller { 
    def test1= Action { 
    Results.Ok 
    } 

    def test2 = Action { 
    Results.Ok 
    } 
} 

, die von

new GuiceApplicationBuilder() 
    .configure(c) 
    .bindings(new RouterTagsTestModule(c)) 
    .overrides(
    bind[Router].to(Router.from { 
     case play.api.routing.sird.GET(p"/test1") => MyController.test1 
     case play.api.routing.sird.GET(p"/test2") => MyController.test2 
    }) 
).build() 
+0

Sie möchten also in Ihrem Filter wissen, welche Methode die aktuelle URL behandelt (zB: "/ login" -> LoginCtrl.processLogin())? – Salem

+0

Ja, so dass ich entweder die Action-Klasse überprüfen kann. Oder prüfen Sie, ob die Methode kommentiert wurde. –

+0

Der Methodenname könnte auch funktionieren. –

Antwort

1

Sie so etwas wie dieses

import play.api.routing.Router.Tags 

// Inside your Filter#apply method 
// reqHeader: RequestHeader 
val ctrl = reqHeader.tags.get(Tags.RouteController) 
val method = reqHeader.tags.get(Tags.RouteActionMethod) 
val verb = reqHeader.tags.get(Tags.RouteVerb) 
, dass diese Variablen Option[String] sind

Hinweis verwenden können, gebunden ist, dann Wenn es keine passende Aktion gibt, erhalten Sie None

+0

Danke, ich werde jetzt einen Test durchführen. –

+0

Mit zahlreichen Versuchen kann ich einen Test, der diese Tags enthält, nicht ganz finden. –

+0

Markieren Sie dies als richtig, weil ich sicher bin, dass es ist. Traurig kann es scheinen, einen Test darum herum zu wickeln. Ich vermute, dass es das Spiel ist, das routed erzeugt wird, das das Tagging tut und überschreibt es diese Eigenschaft. Vielleicht, wenn ich einen Weg finden könnte, einen Test-Controller in den generierten Router zu injizieren ... aber das ist ein anderes Problem. –