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.cc中,我在应用程序启动时调用了它。如果我在添加上述代码后将application.wheels.routes和application.wheels.namedroutepositions转储到settings.cc中,它会反映在这些相应的结构中,但当我试图访问我刚刚添加的新路由时,它不起作用。此外,当我在另一个cfc中转储application.wheels.routes和application.wheels.namedroutepositions时,它没有显示新添加的路由,即新添加的路径没有持续存在。如何使新添加的路由在整个应用程序中保持不变?我不确定出了什么问题。是否有任何其他变量/结构需要更新路线信息?我还有什么需要做的吗?

注意:暂时,我已经手动添加了这条路线。当这个实验成功后,我会制作这个代码来动态添加路由。

感谢您提前提供的帮助。

designdevelopment模式中,我相信每个请求都会重新生成路由,这就是为什么会丢失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.folder1params.folder5controllers/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

最新更新