在Route with Play Framework中使用对象:反向路由

时间:2011-08-14 17:36:16

标签: binding routing playframework symfony-1.4

是否可以生成由对象映射的网址?
Pojo Object Mapping是PlayFramework(1.2.2)的原生功能,但反向路由呢?

我想这样做:

爪哇:

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

我觉得玩!不支持这个功能,有人可以确认或反驳这个想法吗? 谢谢。

4 个答案:

答案 0 :(得分: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的更多版本!应该允许更简单的语法,类似于你的建议。

答案 1 :(得分:0)

嗯,如果它将起作用,它将需要包声明:

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

答案 2 :(得分: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));
}

提示:玩!允许定义具有超过必要标识符的路由。因此,可以编写一个包含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>

它有效:)

答案 3 :(得分:0)

尝试这种方法。绑定对象的id。适合我 <a href="@{MyControler.myAction().add('o.id', myObject.id)}">Go</a>