2012-04-12 8 views
6

Nel gioco 1.2.X potremmo fareProgramatically l'aggiunta di un percorso in Play2.0

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

Sto scrivendo un modulo che aggiunge un "percorso" che sarà gestita da un controllore nel modulo. È un gestore OAuth e desidera rendere più semplice per gli utenti non avere a che fare con l'handshake OAuth ecc.

Come posso farlo in Play 2.0?

risposta

-9

* play2.0 * * aggiungere questa riga nel file di tuoi percorsi * GET/somepath controller.methodName()

+0

lui vuole farlo a livello di programmazione, non attraverso la configurazione – Codemwnci

3

io non sono sicuro che si può.

Il concetto di Play 2.0 era di concentrarsi sulla sicurezza del tipo, che include il file di percorsi. Il file di rotte è ora compilato, piuttosto che interpretato in fase di esecuzione. Se si guarda il codice per il file di rotte, genera una classe di scala dal file di rotte stesso. Pertanto, la manipolazione del runtime sarebbe semplicemente ignorata.

Sfortunatamente sembra che le rotte debbano essere definite nel file di rotte, a meno che non si voglia intercettare le richieste http per verificare personalmente percorsi specifici, che è quello che i collegamenti della documentazione/@ sembrano fare nello ApplicationProvider scala classe.

vedere anche questo bug inviare https://play.lighthouseapp.com/projects/82401/tickets/12-support-multiple-routes-file-and-inclusion

+0

Ciao puoi indicarmi il codice per il file di rotte. Sto cercando di mavenize il progetto di gioco senza plugin sbt. Ho difficoltà a cercare di capire come viene creato questo file scala. Sto usando il gioco 2.3 – amrk7

8

Non è possibile aggiungere a livello di codice per l'oggetto delle rotte, ma è possibile intercettare le richieste web e gestire da soli l'override GlobalSettings.onRouteRequest. Ad esempio:

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

Non ho idea se questo è l'approccio consigliato, ma funziona per me. Ecco un esempio su GitHub: https://github.com/edeustace/play-injected-routes-example

+0

Funziona molto bene (a corto di test delle prestazioni non ho perseguito ora) con 2.3.7. Un bel sostituto per i confini del file di rotte .... – matanster

3

È possibile aggiungere una route generica nel file percorsi (alla fine del file come sua priorità sarebbe stata valutata sulla base della sua posizione di dichiarazione)

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

Put la logica che si desidera eseguire il runtime in classe controller

public static Result showPage(String page){ 

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

non sono sicuro se sarebbe adatta alla propria esigenza, ma nella maggior parte degli scenari sarà sufficiente.

Problemi correlati