2011-03-22 232 views
1

如果我在我的路线文件从一个模块获取模块路由引入路径

*  /admin     module:crud 

引入路由典型的条目是有我确定为crud模块的基本路径是一种/admin,除了自己解析主要路径文件?看起来Router类没有保存这些信息。

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

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

回答

2

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

从上面的链接:

例如,使用这条路线的定义:

GET /clients/{id}  Clients.show 

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

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

这应该够了。

+0

对于大多数情况你是对的,但我认为我有一个想知道的合法理由。我正在研究一个模块,它可以生成你去过的地方的菜单和面包屑。目前,为模块生成菜单的最佳方法似乎是确定模块在路径中“启动”的位置,然后查找比该路径低一级的可路由路径。 – 2011-03-22 16:32:12

+0

@Bemace您能否更详细地解释您想要生成的功能?我不确定我是否理解它(将此添加到问题中会有所帮助) – 2011-03-23 10:06:07

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"); 
       ... 

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