在Play中获取模块路由导入路径

时间:2011-03-22 15:16:53

标签: routing module playframework

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

*       /admin                  module:crud

有没有办法让我确定crud模块的基本路径是/admin,而不仅仅是自己解析主路径文件? Router类似乎不保留此信息。

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

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

2 个答案:

答案 0 :(得分:2)

问题是:为什么需要解析文件或者知道'/ 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

这应该足够了。

答案 1 :(得分:1)

刚才,除了自己解析路线外,我什么都看不到。 查看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");
                ...

它提取前缀,这是您要查找的部分。