2012-04-12 21 views
6

w grze 1.2.x mogliśmy zrobićProgramowo dodając trasy w Play2.0

Router.addRoute("GET", "/somePath", "controller.methodName"); 

Piszę moduł, który dodaje „trasy”, które będą obsługiwane przez sterownik w module. Jest to program obsługi OAuth, który ma ułatwić użytkownikom unikanie uzgadniania OAuth.

Jak mogę to zrobić w wersji Play 2.0?

Odpowiedz

-9

* play2.0 * * Dodaj tę linię w pliku Twoje trasy * GET/somePath controller.methodName()

+0

chce to zrobić programowo, nie poprzez konfigurację – Codemwnci

3

Nie jestem pewien, można.

Koncepcja gry Play 2.0 koncentrowała się na bezpieczeństwie typu, w tym pliku tras. Plik tras jest teraz kompilowany, a nie interpretowany w czasie wykonywania. Jeśli spojrzysz na kod pliku tras, generuje on klasę scala z samego pliku tras. Dlatego manipulowanie w czasie wykonywania byłoby po prostu ignorowane.

Niestety wygląda na to, że twoje trasy muszą być zdefiniowane w pliku tras, chyba że chcesz przechwycić żądania http, aby samemu sprawdzić konkretne trasy. Tak właśnie wyglądają linki dokumentacji/@ w scala ApplicationProvider klasa.

zobaczyć również ten błąd zakładać https://play.lighthouseapp.com/projects/82401/tickets/12-support-multiple-routes-file-and-inclusion

+0

Witaj, możesz wskazać mi kod dla pliku tras. Próbuję odkryć projekt gry bez wtyczki sbt. Mam trudny czas, aby dowiedzieć się, jak tworzony jest ten plik scala. Używam gry 2.3 – amrk7

8

Nie można dodawać programowo na trasach obiekt, ale można przechwycić żądania internetowych i obsługiwać je samodzielnie nadrzędnymi GlobalSettings.onRouteRequest. Na przykład:

override def onRouteRequest(request: RequestHeader): Option[Handler] = { 
    //do our own path matching first - otherwise pass it onto play. 
    request.path match { 
    case "/injectedRoute" => Some(controllers.Application.customRoute) 
    case _ => Play.maybeApplication.flatMap(_.routes.flatMap { 
     router => 
     router.handlerFor(request) 
    }) 
    } 
} 

Nie mam pojęcia, czy jest to zalecane podejście, ale działa dla mnie. Oto próbka na github: https://github.com/edeustace/play-injected-routes-example

+0

Działa bardzo ładnie (brakuje testów wydajności, których teraz nie ścigałem) z 2.3.7. Miły zamiennik dla ograniczeń pliku tras .... – matanster

3

Możesz dodać rodzajowe trasy w pliku trasy (na końcu pliku, jego priorytetem będzie oceniana na podstawie jego lokalizacji deklaracji)

GET  /:page controllers.Application.showPage(page) 

Sprzedaży logika które chcesz wykonać na starcie w klasie kontrolera

public static Result showPage(String page){ 

    if(page.contains("abc"){ 
     ..... 
    } else { 
     //return 404 
    } 
} 

nie jestem pewien, czy to pasuje do wymogu, ale w większości scenariuszy to wystarczy.