【问题标题】:Getting module route import paths in Play在 Play 中获取模块路由导入路径
【发布时间】:2011-03-23 22:46:27
【问题描述】:

如果我的路由文件中有一个用于从模块导入路由的典型条目

*       /admin                  module:crud

除了自己解析主路由文件之外,有没有办法让我确定crud 模块的基本路径是/adminRouter 类似乎没有保留此信息。

最终目标是为每个模块创建一个菜单。如果我在/useradmin 处导入了用户管理模块,我想生成一个包含/useradmin/users/useradmin/groups 但不包含/useradmin/users/new 等更深层次的后代的菜单。如果/useradmin 被路由到某个东西,我将使用它作为菜单标签的链接,否则我将只显示一个纯文本标签。

虽然我可能在不知情的情况下伪造它,但似乎知道模块的实际基本 URL 将是确保我能够处理各种特殊情况的最佳方法,例如在 /modules/useradmin 导入的模块或孙子的模块路径但没有子路径(/useradmin/users/new 但没有 /useradmin/users)。

【问题讨论】:

    标签: routing module playframework


    【解决方案1】:

    问题是:为什么需要解析文件或知道'/admin' 是基础? Play 允许您使用reverse routing 获取路径。

    从上面的链接:

    例如,使用这个路由定义:

    GET    /clients/{id}      Clients.show
    

    从您的代码中,您可以生成能够调用 Clients.show 的 URL:

    map.put("id", 1541);
    String url = Router.reverse("Clients.show", map).url;  // GET /clients/1541
    

    应该够了。

    【讨论】:

    • 在大多数情况下你是对的,但我想我有正当理由想知道。我正在开发一个模块,该模块可以生成您去过的地方的菜单栏和面包屑。目前,为模块生成菜单的最佳方法似乎是确定模块在路径中“开始”的位置,然后查找下一层的可路由路径。
    • @Bemace 您能否更详细地解释您想要生成的功能?我不确定我是否理解(将其添加到问题中会有所帮助)
    【解决方案2】:

    刚才,除了自己解析路线,我什么也没看到。 查看 play.mvc.Router 类 IMO 和以下函数:

    static void parse(VirtualFile routeFile, String prefix) {
        String fileAbsolutePath = routeFile.getRealFile().getAbsolutePath();
        int lineNumber = 0;
        String content = routeFile.contentAsString();
        if (content.indexOf("${") > -1 || content.indexOf("#{") > -1 || content.indexOf("%{") > -1) {
            // Mutable map needs to be passed in.
            content = TemplateLoader.load(routeFile).render(new HashMap<String, Object>(16));
        }
        for (String line : content.split("\n")) {
            lineNumber++;
            line = line.trim().replaceAll("\\s+", " ");
            if (line.length() == 0 || line.startsWith("#")) {
                continue;
            }
            Matcher matcher = routePattern.matcher(line);
            if (matcher.matches()) {
                String action = matcher.group("action");
                // module:
                if (action.startsWith("module:")) {
                    String moduleName = action.substring("module:".length());
                    String newPrefix = prefix + matcher.group("path");
                    ...
    

    它会提取您要查找的部分的前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2018-11-08
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多