2012-04-12 35 views
6

Trong tro 1.2.X chúng ta có thể làmProgramatically thêm một tuyến đường trong Play2.0

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

Tôi đang viết một module có thêm một "con đường" mà sẽ được xử lý bởi một bộ điều khiển trong mô-đun. Đó là trình xử lý OAuth và muốn người dùng dễ dàng không phải đối phó với việc bắt tay OAuth, v.v.

Tôi có thể làm điều này trong Play 2.0 như thế nào?

Trả lời

-9

* play2.0 * * Thêm dòng này trong tuyến đường của bạn nộp * GET/somePath controller.methodName()

+0

anh ấy muốn làm điều đó theo chương trình, không phải thông qua config – Codemwnci

3

Tôi không chắc chắn bạn có thể.

Khái niệm về Play 2.0 là tập trung vào an toàn loại, bao gồm tệp tuyến đường. Tệp tuyến đường hiện được biên dịch, thay vì được diễn giải tại thời gian chạy. Nếu bạn nhìn vào mã cho các tập tin tuyến đường, nó tạo ra một lớp scala từ các tập tin tuyến đường chính nó. Do đó, thao tác thời gian chạy đơn giản sẽ bị bỏ qua. Rất tiếc, có vẻ như các tuyến đường của bạn phải được xác định trong tệp tuyến, trừ khi bạn sẵn sàng chặn các yêu cầu http để tự kiểm tra các tuyến đường cụ thể, đó là những gì liên kết tài liệu/@ xuất hiện để thực hiện trong scala ApplicationProvider lớp học.

Cũng thấy lỗi này gửi https://play.lighthouseapp.com/projects/82401/tickets/12-support-multiple-routes-file-and-inclusion

+0

Xin chào, bạn có thể chỉ cho tôi mã cho các tệp tuyến đường không. Tôi đang cố gắng mavenize dự án chơi mà không cần plugin sbt. Tôi gặp khó khăn khi cố gắng tìm ra cách tập tin scala này được tạo ra. Tôi đang sử dụng chơi 2.3 – amrk7

8

Bạn không thể thêm lập trình để phản đối các tuyến đường, nhưng bạn có thể đánh chặn các yêu cầu web và xử lý chúng mình bằng cách ghi đè GlobalSettings.onRouteRequest. Ví dụ:

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

Tôi không biết đây có phải là phương pháp được đề xuất hay không, nhưng nó phù hợp với tôi. Đây là một mẫu trên github: https://github.com/edeustace/play-injected-routes-example

+0

Hoạt động rất độc đáo (thử nghiệm hiệu suất ngắn mà tôi không theo đuổi bây giờ) với 2.3.7. Một thay thế tốt đẹp cho các confinements của các tập tin tuyến đường .... – matanster

3

Bạn có thể thêm một tuyến đường chung trong tập tin tuyến đường của bạn (ở phần cuối của tập tin là ưu tiên của nó sẽ được đánh giá trên cơ sở vị trí của nó kê khai)

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

Đặt logic của bạn mà bạn muốn thực thi trên thời gian chạy trong lớp điều khiển

public static Result showPage(String page){ 

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

Tôi không chắc liệu nó có phù hợp với yêu cầu của bạn hay không trong hầu hết các trường hợp, nó sẽ đủ.

Các vấn đề liên quan