1

目前我在我的 FW/1 视图中使用“部分”概念:这些布局块可以被不同的视图重用。它们带有下划线前缀以便于维护,但与 CFWheels 不同,它们仍然可以用作不太好的隐式视图。

例如,有一个目录结构:

/views/member/_user.cfm
/views/member/profile.cfm
/views/member/register.cfm

这样,实际用户表单位于 _user.cfm 中,并且可以使用#view('member/_user')#.

我想要的是阻止访问member._user网站上的页面。

一种解决方案是在控制器中创建_user方法member.cfc并将用户重定向到某处。但是为每个部分创建这样的方法是一种低效的方法。

替代方法是解析rc.actioninbefore并检查前缀中是否有下划线,但我不确定这是干净的解决方案。

如果控制器中没有相应的方法,是否可以禁用该操作(抛出 404)?或者也许有一些框架事件/标志可以让我处理“缺少方法”的情况before

谢谢你。

4

4 回答 4

2

您可以在控制器中创建一个方法来检查 rc.action 以查看项目部分是否以 _ 开头并重定向到其他地方(或引发错误,或任何您想做的事情)。然后在 Application.cfc 中的setupRequest()方法中使用controller()函数调用此方法。

例如,我有一个带有checkItem()方法的controllers/security.cfc控制器,如下所示:

function checkItem( rc ) {
    //check if restricted item hss been requested and redirect to main.default
    if ( left(variables.fw.getItem(), 1) eq "_" ) {
        variables.fw.redirect('main');
    }
}

并在 Application.cfc 的 setupRequest() 中调用它:

function setupRequest() {
    //controller( 'security.authorize' );
    controller( 'security.checkItem' );
}

这样,它会在每个请求上自动调用 - 无需为控制器中的每个 _item 定义单独的方法。

于 2012-05-31T15:11:25.483 回答
2

最简单的方法是将它们放在不在 Web 根目录中的文件夹中。因此,它们无法通过网络访问。然后使用 ColdFusion 映射使它们可用于 ColdFusion。

有道理?

于 2012-06-01T05:17:29.740 回答
1

您可以使用mod_rewrite来检测包含/_并酌情阻止/重定向的 URL。

例如:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/\w+/_
RewriteRule ^.* /error/404 [L]


第一个 RewriteCond 确保该文件不存在 - 因此,如果您有一个真实文件/css/_default.css,则任何对该文件的请求都将失败此条件并且不会重定向。

第二个 RewriteCond 接受第一个段的任何字母数字,然后如果_在第二个段的开头有 a 则继续。(不必匹配整个 URI,只要开头就足够了。)

最后,仅当两个条件都为真时才应用 RewriteRule,但匹配所有 URL,并执行服务器端重定向到/error/404- 您可以根据需要更新该部分。(该[L]标志告诉 mod_rewrite 不要尝试任何进一步的重写。)

于 2012-05-31T15:47:19.857 回答
0

好的,因为没有我期望的答案(这很好),这是我已经用于电子邮件模板的另一种方法。

/views/emails/所有视图中都是电子邮件模板,它们没有操作,但只能像这样调用:

local.body = variables.fw.view("emails/registration_confirmation", local.attrs);
local.template = variables.fw.view("emails/default", {body = local.body});

registration_confirmation.cfm特定电子邮件正文的模板在哪里,并且default.cfm(可以不同地称呼它)是电子邮件模板本身。

为了防止我在问题控制器中描述的问题,emails.cfc如下所示:

component extends="components.helpers.controller" {

    public void function before(required struct rc) {
        variables.fw.redirect("user.forbidden");
    }

}

我想可以再创建一个这样的控制器partials.cfc并将所有视图保留在/views/partials/.

但这是我在现实生活中的第一个 FW/1 项目,我的想法来得太晚了,无法重构这么多视图 (1),而且我认为从维护的角度来看,在同一目录中包含部分内容比将它们放在制作的地方更糟糕对他们有感觉(2)。

这是我问这个问题的两个原因。

于 2012-06-01T06:28:10.277 回答