如果我的路线文件中有一个典型的条目用于从模块导入路径
* /admin module:crud
有没有办法让我确定crud
模块的基本路径是/admin
,而不仅仅是自己解析主路径文件? Router
类似乎不保留此信息。
最终目标是为每个模块创建一个菜单。如果我在/useradmin
导入了用户管理模块,我想要生成一个包含/useradmin/users
和/useradmin/groups
但不包含更深层后代的菜单,例如/useradmin/users/new
。如果将/useradmin
路由到某个内容,我会将其用作菜单标签的链接,否则我只会显示纯文本标签。
虽然我可能在不知情的情况下伪造它,但似乎知道模块的实际基本URL是确保我可以处理各种特殊情况的最佳方式,例如在/modules/useradmin
导入的模块或模块孙子路径但没有子路径(/useradmin/users/new
但没有/useradmin/users
)。
答案 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");
...
它提取前缀,这是您要查找的部分。