从我对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中。 如果我在添加上面的代码后转储了settings.cfc中的application.wheels.routes和application.wheels.namedroutepositions,它会反映在那些相应的结构中,但当我试图访问我刚刚添加的新路由时,它并没有&#39工作。 此外,当我将application.wheels.routes和application.wheels.namedroutepositions转储到另一个cfc时,它没有显示新添加的路由,即新添加的路由没有持续。如何让新添加的路由在整个应用程序中持续存在? 我不确定出了什么问题。我还需要更新路线信息的其他变量/结构吗?还有什么我需要做的才能使这项工作?
注意:暂时,我已手动添加此路线。当此实验成功时,我将使此代码动态添加路由。
提前感谢您的所有帮助。
答案 0 :(得分: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
路线之前。
你还需要查看Tom在他的回答中提到的ColdRoute插件是否对通配符路由做了什么。
这样的事情是最合适的,因为路线应该在config/routes.cfm
中进行硬编码。不要打这个。
答案 1 :(得分:1)
冒着明显的风险,你为什么要反对车轮惯例?
为什么不使用http://cfwheels.org/docs/1-1/chapter/using-routes中列出的约定在config / routes.cfm中添加内容?
你可以做各种“动态”路线,即
addRoute(name="product", pattern="products/[categorySlug]/[productSlug]", controller="products", action="product");
我可能误解了你想要达到的目标。如果你真的想要使用内部轮子,请查看coldroute插件:http://cfwheels.org/plugins/listing/67