3

我似乎无法弄清楚如何CFWheels使用包含“文件”扩展名的干净 URL 创建页面。

我希望能够做到以下几点:

与此相反:

我已经阅读了这些文档,但仍然不清楚实际的实现。

假设我有一个控制器 ( /controllers/Product.cfc),它看起来像下面这样:

<cfcomponent extends="Controller">

    <cffunction name="init">
        <cfset provides("html,json,xml")>
    </cffunction>

    <cffunction name="index">
        <cfset products = model("product").findAll(order="title")>
        <cfset renderWith(products)>
    </cffunction>

</cfcomponent>

如何实现视图?应该是views/products/index.xml.cfm吗?

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product><!-- product data goes here --></product>
</products>

我该如何实施routes.cfm

我应该注意,我也在使用默认的web.config<cfset set(URLRewriting="On")>config/setting.cfm.

4

1 回答 1

4

关于路线的假设是正确的。但是你必须确保重写工作正常,而不是部分地。您可以访问类似的网址/controller/action,对吧?不是/rewrite.cfm/controller/action

所以路由定义可以是这样的:

<cfset addRoute(name="indexProducts", pattern="products.[format]", controller="product", action="index") />

在该index方法中,您将params.format填充实际值,您想要验证(ListFind应该工作)。

此页面的视图模板应具有其操作的名称:/views/product/index.cfm。除非您想有条件地加载视图,否则这里不需要什么特别的东西,例如每种格式的单独视图。在这种情况下,您要查看renderPage函数。它可用于覆盖默认视图。

更新

好的,我已经测试了这个解决方案,它不会工作。除了斜杠作为分隔符之外,路由不支持任何内容。所以这种路线只能这样工作:

<cfset addRoute(name="indexProducts", pattern="products/[format]", controller="product", action="index") />

我想我们不想修改 CFWheels 代码(如果没有进一步的拉取请求,这是个坏主意),所以我建议使用网络服务器重写。例如,在 Apache 中它可能看起来像这样:

RewriteRule ^products\.(xml|json|html)$ product/index?format=$1 [NS,L]

您正在使用 IIS,因此它应该类似于此(未测试):

<rule name="Products listing" enabled="true">
    <match url="^products\.(xml|json|html)$" ignoreCase="true" />
    <action type="Rewrite" url="product/index?format={R:1}" />
</rule>

认为这比尝试创建名为 like 等的控制器ProductsXml更好ProductsJson

于 2012-02-02T12:08:00.757 回答