CFWheels - 我应该在本地确定我的车轮动作范围吗?

时间:2013-01-28 17:40:12

标签: coldfusion railo cfwheels cfml

假设我有一个非常简单的控制器:

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset time = Now()>
    </cffunction>
</cfcomponent>

在直接ColdFusion / Railo中,我会在本地范围内查找所有变量......但是我看到的每个轮子都没有。

这可能会让我获得年度奖项最愚蠢的问题,但这是我正在考虑的事情,因为似乎没有人能够正确展示他们的Wheels代码范围正确吗?

我会写如下:

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset local.time = Now()>
    </cffunction>
</cfcomponent>

我只是不确定Wheels是否可以采取措施来解决这个问题,这就是为什么我看到我到处都做的事情......或者只是一个糟糕的编程案例?

谢谢! MIKEY

2 个答案:

答案 0 :(得分:8)

是的,你应该确定它

在你的第一个例子中,在大多数情况下,你是(通过不作用域)设置variables.time,它是组件实例的本地,而不是函数 - 如果这是作为函数局部变量(即local.time)但是在组件的变量范围内,并且该组件是共享/持久化的,这可能会导致问题(尽管可能只会在重负载下显示自己)。

如果将变量置于变量范围内是故意的,那么它仍应明确作用域(如variables.time),否则如果在启用了localmode设置的Railo服务器上使用它可能会导致问题。

由于cfWheels设计决策(请参阅注释中的链接),将变量放在变量范围内需要将变量传递给视图,即使它们在技术上可能是函数/视图的本地变量。 (控制器实例只针对单个请求,避免了通常需要的问题。)如前一段所述,localmode设置(如下所述)意味着当您无法控制所有服务器时,仍建议明确指定范围。代码将部署到。

Railo的本地模式设置

Railo(自v1开始)有一个名为“localmode”的管理设置,它定义了分配一个未操作的变量是否会转到本地范围,而不是组件的变量范围 - 不需要显式的var / local范围(如果你知道的话)您的代码只能在启用了该设置的Railo服务器上运行。

由于默认情况下该设置处于关闭状态,并且ColdFusion没有这样的设置,因此跨引擎兼容的代码应始终包含此类变量分配,以避免出现问题。

答案 1 :(得分:4)

这取决于。如果希望变量显示在视图中,请将其范围限定为变量。如果您希望变量仅在控制器中,请将其范围限定为本地。