2013-11-09 3 views
0

Я разрабатываю приложение для отображения различных аспектов автомобилей. Приложение имеет древовидную структуру, как это:Длинные динамические маршруты в игровом каркасе 2

Country>Manufacturer>Model>Car_subsystem>Part 

Я хочу, чтобы эта структура будет отражена в адресной строке браузера:

http://localhost:9000/Germany/BMW/X6/Body/doors 

В настоящее время я делаю это с динамической маршрутизацией играть фреймворка, как показано ниже:

GET /:Country controllers.Application.controllerFunction(Country : String) 
GET /:Country/:Manufacturer  controllers.Application.controllerFunction(Country : String, Manufacturer : String) 

т.д.

Это работает, но я не люблю огибают 5 или 6 параметры для всех моих функций контроллера только для того, чтобы пути были показаны красиво! Есть ли другой путь?

ответ

4

Просто используйте Dynamic parts spanning several /, как описано в routing doc

маршруту:

GET /Cars/*path   controllers.Application.carResolver(path) 

Action (простейший подход)

public static Result carResolver(String path) { 
    Car car = Car.findByPath(path); 
    return ok(carView.render(car)); 
} 

поэтому каждый автомобиль должен иметь свое поле path заполнены с уникальным идентификатором строки, т.е.: Germany/BMW/X6, Германия/Mercedes/ASL и др.

Конечно, это будет гораздо лучше, если вы разделяете path ARG по косой черты первого, так что вы можете использовать каждую часть для отображения различных представлений, «перевести» строки на реальный объект ID и т.д. и т.п.

public static Result carResolver(String path) { 

    String[] parts = path.split("/"); 
    int partsLength = parts.length; 

    String country = (partsLength > 0) ? parts[0] : null; 
    String manufacturer = (partsLength > 1) ? parts[1] : null; 
    String carModel = (partsLength > 2) ? parts[2] : null; 
    // etc 

    switch (partsLength){ 
     case 0: return countrySelect(); 
     case 1: return allManufacturersIn(country); 
     case 2: return allModelsOf(manufacturer); 
     case 3: return singleViewFor(carModel); 
     // etc 
    } 

    return notFound("Didn't find anything for required path..."); 
} 

СОВЕТ: «перевод» строки для объектов потребует от вас поиска в БД на некотором поле, так что есть некоторые советы:

  • Try, чтобы убедиться, что каждая модель имеет уникальное поле для поиска т.е.. Country должен иметь уникальный name, поскольку, возможно, вы не хотите иметь Германию 1, Германию 2 и т. Д.
  • Этот подход требует, вероятно, больше времени, чем поиск по числовым идентификаторам, поэтому попробуйте каким-то образом кэшировать (mem-cache ИЛИ по крайней мере выделенный DB таблица) результат решения т.е. .:

    Germany/BMW/X6 = Country: 1, Manufacturer: 2, CarModel: 3, action: "singleViewFor" 
    
+0

Спасибо. это должно сработать. В моем приложении каждый уровень представлен таблицей в БД и имеет отношение «один к одному» с верхним уровнем, и каждый уровень имеет различные действия (createNew, редактировать, индексировать). Итак, ваше решение работает, но я должен реализовать логику для разных действий на каждом уровне в carResolver (например, editPart, createNewPart, editBody, createNewCountry и т. Д.). Это намного чище, чем мой собственный подход, но, похоже, это большая работа! Что мне волнует, так это просто показать пользователю, где она стоит на дереве. Но я думаю, это для другого вопроса :) – jrook

Смежные вопросы