我在routes
文件中定义了300个条目,如下所示:
GET /url001 MyClass.myMethod
适用于http://localhost:9000/url001
现在,我需要为这300个链接定义两个环境,用于生产和测试。链接就像:
http://localhost:9000/prod/url001
用于生产(参见路径中的prod
)
和
http://localhost:9000/test/url001
进行测试(参见路径中的test
)。
我希望routes
中有一组链接,如何在Play中实现?我知道我可以在路径中定义变量,例如path/:var
,但我需要的是设置相对URL。
注意:有些用户可能正在使用prod
,有些用户可能同时使用test
答案 0 :(得分:2)
您可以使用SIRD(String Interpolating Routing DSL): https://www.playframework.com/documentation/2.6.x/ScalaSirdRouter#Binding-sird-Router
您需要在scala源中描述这30个条目,然后在路由中执行这两个记录并将它们绑定到scala自定义路由器。
自定义路由器将如下所示:
package my.app
import javax.inject.Inject
import play.api.mvc._
import play.api.routing.Router.Routes
import play.api.routing.SimpleRouter
import play.api.routing.sird._
class MainRouter @Inject()(controller: ApiController)
extends SimpleRouter
{
override def routes: Routes = {
case GET(p"/url001") => MyClass.myMethod001
case GET(p"/url002") => MyClass.myMethod002
}
}
conf/routes
将如下所示:
/prod my.app.MainRouter
/test my.app.MainRouter
仍然,你需要以某种方式了解应用程序内部的内容,我不知道你的想法是什么 - 会话(cookies)或令牌或......
因为测试环境不会用于实际测试系统。这是一个商业智能应用程序,用户将在将它们迁移到生产之前测试它们构建的查询。从系统的角度来看,产品和测试都是生产。从用户的角度来看,prod和test是不同的环境
在这种情况下,我会建议您创建两个不同的分期付款。
答案 1 :(得分:1)
可能最好有一个基于角色的逻辑,而不是像重复路由一样会引入大量的复制/粘贴代码。 假设存在某种会话管理/用户识别机制,则测试用户可以拥有测试凭据,登录时将具有角色/会话属性以指示仅测试功能。 理想情况下,您将拥有不同的专用实例,因为它们看起来已经被用于不同的事物。