从我对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.cc中,我在应用程序启动时调用了它。如果我在添加上述代码后将application.wheels.routes和application.wheels.namedroutepositions转储到settings.cc中,它会反映在这些相应的结构中,但当我试图访问我刚刚添加的新路由时,它不起作用。此外,当我在另一个cfc中转储application.wheels.routes和application.wheels.namedroutepositions时,它没有显示新添加的路由,即新添加的路径没有持续存在。如何使新添加的路由在整个应用程序中保持不变?我不确定出了什么问题。是否有任何其他变量/结构需要更新路线信息?我还有什么需要做的吗?
注意:暂时,我已经手动添加了这条路线。当这个实验成功后,我会制作这个代码来动态添加路由。
感谢您提前提供的帮助。
在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")>
然后,如果需要通过数据库动态控制路由,则可以使用params.folder1
到params.folder5
在controllers/Pages.show()
中进行适当的查询。
请注意,这些动态路由应该在您需要指定的任何其他路由之后,但就在空的root
路由之前。
你还想看看Tom在回答中提到的ColdRoute插件是否对通配符路由有任何作用。
这样的东西是最合适的,因为路线应该在config/routes.cfm
中进行硬编码。不要与此抗争。
冒着陈述显而易见的风险,你为什么要反对这里的车轮惯例?
为什么不使用中列出的约定在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