繁体   English   中英

游戏框架中的长动态路线2

[英]Long dynamic routes in play framework 2

我正在开发一个用于显示汽车不同方面的应用程序。 该应用程序具有如下树状结构:

Country>Manufacturer>Model>Car_subsystem>Part

我希望这个结构能够反映在浏览器的地址栏中:

http://localhost:9000/Germany/BMW/X6/Body/doors

目前,我使用play框架的动态路由,如下所示:

GET /:Country    controllers.Application.controllerFunction(Country : String)
GET /:Country/:Manufacturer     controllers.Application.controllerFunction(Country : String, Manufacturer : String)

等等

这是有效的,但我不喜欢将5或6个参数传递给我的所有控制器功能,只是为了让路径显示得很漂亮! 还有其他方法吗?

只需使用Dynamic parts spanning several /路由文档中所述

路线:

GET   /Cars/*path          controllers.Application.carResolver(path) 

行动(最简单的方法)

public static Result carResolver(String path) {
    Car car = Car.findByPath(path);
    return ok(carView.render(car));
}

因此每辆车的场地path应填充唯一的字符串ID,即: Germany/BMW/X6 ,德国/梅赛德斯/ ASL`等。

当然,如果首先用斜杠分割path arg会更好,这样你就可以使用每个部分来显示不同的视图,'将'字符串'转换为真实的对象ID等等。

public static Result carResolver(String path) {

    String[] parts = path.split("/");
    int partsLength = parts.length;

    String country = (partsLength > 0) ? parts[0] : null;
    String manufacturer = (partsLength > 1) ? parts[1] : null;
    String carModel = (partsLength > 2) ? parts[2] : null;
    // etc

    switch (partsLength){
        case 0: return countrySelect();
        case 1: return allManufacturersIn(country);
        case 2: return allModelsOf(manufacturer);
        case 3: return singleViewFor(carModel);
        // etc
    }

    return notFound("Didn't find anything for required path...");
}

提示:将字符串“转换”为对象需要您在某个字段中搜索数据库,因此有一些建议:

  • 尝试确保每个模型都有一个唯一的搜索字段即。 Country应该有唯一的name因为你可能不想拥有德国1,德国2等。
  • 这种方法需要比通过数字ID搜索更多的时间,因此尝试以某种方式缓存(mem-cache OR至少专用的DB表)解析的结果即:

     Germany/BMW/X6 = Country: 1, Manufacturer: 2, CarModel: 3, action: "singleViewFor" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM