Использование объекта в Route с PlayFramework: обратная маршрутизация - PullRequest
4 голосов
/ 14 августа 2011

Можно ли сгенерировать URL-адрес, отображаемый объектом?
Pojo Object Mapping является встроенной функцией 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! не поддерживают эту функцию, может ли кто-нибудь подтвердить или опровергнуть эту идею? Спасибо.

Ответы [ 4 ]

3 голосов
/ 15 августа 2011

То, что вы просите, в настоящее время невозможно.

Таким образом, обычное решение заключается в следующем:

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! следует разрешить более простой синтаксис, подобный тому, что вы предложили.

0 голосов
/ 15 августа 2011

Попробуйте этот подход. Связать с идентификатором объекта. Работает для меня <a href="@{MyControler.myAction().add('o.id', myObject.id)}">Go</a>

0 голосов
/ 15 августа 2011

По мнению Жюльена Ричарда-Фоя, решения не существует.

Поэтому я предлагаю обходной путь, немного уродливый, потому что маршрут будет описан дважды. Это быстрое решение ломает модель 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+ переменными, но в действии будет использоваться только идентификатор.

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 голосов
/ 15 августа 2011

Ну, , если будет работать, ему потребуется объявление пакета:

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