在Play框架中如何使用Route中的对象:反向路由

4
能否生成一个由对象映射的URL?
Pojo对象映射是PlayFramework(1.2.2)的本机功能,但反向路由如何呢?

我想这样做:

Java:

class MyControler extends Controller {
    public static function myAction(MyObject o) {}
}

路由:(像这样的东西?如果可能的话,我不知道如何编写语法!)

GET    /folder/{myObject.name}/{myObject.id}      MyController.myAction(myObject)

模板:

<a href="@{MyControler.myAction(myObject)}">Go</a>

预期结果

<a href="/folder/xxNamexx/33">Go</a> 

(我有Symfony背景,现在我正在寻找类似于Object Route Class的东西)

我认为Play!不支持这个功能,有人可以确认或驳斥这个想法吗? 谢谢。


为什么不直接试一下呢? - niels
这段代码不起作用。但可能是我的语法不正确,或者存在未记录的功能。 - Julien Lafont
4个回答

3

您目前提出的请求是不可能实现的。

因此,通常的解决方案是使用以下模式:

GET     /folder/{id}            MyController.myAction

class MyController extends Controller {
    public static void myAction(Long id) {
        MyObject o = MyObject.findById(id);
        // You may probably want to add the following line:
        notFoundIfNull(o);
        // … then your code here
    }
}

解决方案并不是很冗长,但我同意Play!的后续版本应该允许更简单的语法,类似于您提出的建议。


这个方法非常有效(我自己用),但我需要更加符合SEO的URL。请参见我的解决方法。 - Julien Lafont

0

嗯,如果它要工作,就需要包声明:

GET    /folder/{models.myObject.name}/{models.myObject.id}  

不可能的,"."会创建一个异常(Play!尝试读取一个正则表达式) - Julien Lafont

0
根据Julien Richard-Foy的说法,没有解决方案。
因此,我提出了一个变通方法,有点丑陋,因为路由将被描述两次。 这个快速解决方案破坏了MVC模型,但也可以通过向模板发送UrlHelper来实现其他方式。
在您的模型中,添加一个generateUrlDetail()方法:
public String generateUrlDetail() {
    return String.format("/myRoute/%s/%d-%s.html", JavaExtensions.slugify(this.foo.name), this.id, JavaExtensions.slugify(this.bar));
}

提示:Play!允许定义超过必要数量的标识符路由。因此,可以编写包含2个或更多变量的路由,但只有ID将在操作中使用。

GET /myRoute/{foo}/{<[0-9]+>id}-{bar}.html           Foo.detail(id)

在你的模板中:

<a href="${myObject.generateUrlDetail()}">Go</a>
Render : <a href="/myRoute/foo-name/13-bar-description.html">Go</a>

它可以工作 :)


0
尝试这种方法。使用对象的ID进行绑定。对我有效。 <a href="@{MyControler.myAction().add('o.id', myObject.id)}">前往</a>

你对这个语法的结果是什么?我的路由类似于“/myControler/myAction?o.id=X”,这完全不是我期望的结果。 - Julien Lafont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接