Создание динамического маршрута в cfwheels?

Из небольшого знания о chwheels, которое у меня есть, я знаю, что маршруты хранятся в области приложения, то есть в application.wheels.routes, если быть точным. Он также поддерживает позицию маршрута в application.wheels.namedroutepositions.

Теперь я добавил маршрут, то есть контроллер, действие, шаблон, имя в application.wheels.routes, а также добавил в структуру namedRoutePositions. следующее:

<cfset myRoute.controller = 'pages' >
<cfset myRoute.action = 'about' >
<cfset myRoute.pattern = 'about_my_project' >
<cfset myRoute.name = 'about' >

<cfset structAppend(application.wheels.routes[3],myRoute) />
<cfset structInsert(application.wheels.namedroutepositions,'about','3',true)/>

приведенный выше код добавляется в settings.cfc, который я вызывал при запуске приложения. Если я сбросил application.wheels.routes и application.wheels.namedroutepositions в settings.cfc после добавления приведенного выше кода, это отразится в этих соответствующих структурах, но когда я попытался получить доступ к новому маршруту, который я только что добавил, это не так. Работа. Кроме того, когда я сбросил application.wheels.routes и application.wheels.namedroutepositions в другой cfc, он не показал недавно добавленный маршрут, т.е. недавно добавленный маршрут не сохранился. как сделать так, чтобы вновь добавленный маршрут сохранялся во всем приложении? Я не уверен, что пошло не так. Есть ли какая-либо другая переменная/структура, где мне нужно обновить информацию о маршруте? Есть ли что-нибудь еще, что мне нужно сделать, чтобы сделать эту работу?

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

Спасибо за всю помощь заранее.


person Tushar Bhaware    schedule 13.01.2014    source источник


Ответы (2)


Я считаю, что в режимах design и development маршруты генерируются повторно при каждом запросе, поэтому вы теряете значение в области application.

Тем не менее, область application не будет хорошим местом для сохранения ваших маршрутов, потому что область application обновляется при перезагрузке вашего приложения. (Впрочем, вы, наверное, уже это знали.)

Один из способов создания полностью динамического маршрута выглядит следующим образом (хотя я признаю, что он немного уродлив):

<cfset addRoute(name="page", pattern="[folder1]/[folder2]/[folder3]/[folder4]/[folder5]", controller="pages", action="show")>
<cfset addRoute(name="page", pattern="[folder1]/[folder2]/[folder3]/[folder4]", controller="pages", action="show")>
<cfset addRoute(name="page", pattern="[folder1]/[folder2]/[folder3]", controller="pages", action="show")>
<cfset addRoute(name="page", pattern="[folder1]/[folder2]", controller="pages", action="show")>
<cfset addRoute(name="page", pattern="[folder1]", controller="pages", action="show")>
<cfset addRoute(name="root", pattern="", controller="someController", action="someAction")>

Затем, если маршрутизацию необходимо контролировать динамически через базу данных, вы можете выполнить соответствующий запрос в controllers/Pages.show() с params.folder1 по params.folder5.

Обратите внимание, что эти динамические маршруты должны идти после любого другого маршрута, который вам нужно указать, но непосредственно перед пустым маршрутом root.

Вы также захотите посмотреть и посмотреть, делает ли плагин ColdRoute, о котором Том упоминает в своем ответе, что-либо с маршрутами с подстановочными знаками.

Что-то вроде этого является наиболее подходящим, потому что маршруты должны быть жестко запрограммированы в config/routes.cfm. Не боритесь с этим.

person Chris Peters    schedule 13.01.2014
comment
Перевод среды разработки в производственный режим решил мою проблему. Тем не менее, вы упомянули, что размещение маршрутов в области приложения может быть плохой идеей, но сами колеса помещают маршруты в массив структуры application.wheels.routes. И да, нам нужно динамически контролировать маршруты через базу данных. Я рассмотрю ваш альтернативный метод. - person Tushar Bhaware; 14.01.2014

Рискуя констатировать очевидное, почему вы здесь идете против соглашения о колесах?

Почему бы не добавить что-то в config/routes.cfm, используя соглашения, изложенные в http://cfwheels.org/docs/1-1/chapter/using-routes ?

Вы можете делать всевозможные «динамические» маршруты, т.е.

addRoute(name="product", pattern="products/[categorySlug]/[productSlug]", controller="products", action="product");

Я, возможно, неправильно понял, чего вы пытаетесь достичь. Если вы действительно хотите повозиться с внутренними колесами, взгляните на плагин coldroute: http://cfwheels.org/plugins/listing/67

person Neokoenig    schedule 13.01.2014