3

在使用 CF application.cfc - 需要创建一些变量以开始(在 THIS 范围内) - 例如 this.name 和 this.applicationtimeout() 等。

我遇到了一些我认为奇怪的行为 - 希望有人能解释为什么会发生这种情况以及可能的解决方法。

有相当多的“THIS”变量被接受,可以用来设置应用程序特定的变量(当然你必须在 CFADMIN 中检查“允许应用程序特定的变量”——我做了)

其中之一是 THIS.mappings - 这是一个映射数组 - MINE 看起来像这样:

this.path = GetDirectoryFromPath( GetCurrentTemplatePath() );
this.mappings = {
     '/files' = '#this.path#_my_files\'
     ,'/functions' = '#this.path#_my_functions\'
     ,'/logs' = '#this.path#_my_logs\'
};

它工作正常 - 当它设置在 application.cfc 顶部的 cfscript 块内时,它工作正常 - 如果我将该脚本块放在它自己的文件中并将其 cfinclude 到 application.cfc

但是 - 为了分割我的代码 - 我想将我的所有应用程序设置放在 settings.cfc ...(这里的想法是如果必须更改某些设置 - 我不必担心'在哪里' 看,我真的不想在我的 app.cfc 和 settings.cfc 中的其他应用程序或会话设置上拆分这些东西

所以我在 settings.cfc 中创建了一个名为 getTHIS 的方法,并将脚本块放在那里......然后使用

<cfinvoke component="settings"
          method="getTHIS" 
      returnvariable="THIS" 
    />

哪个 WORKS - 除了(似乎)在映射上......

this.name 等似乎都可以正常工作并被设置 - 事实上,如果我做一个

<cfdump var="#THIS#" label="THIS" />

当我在 app.cfc 页面上“逐字地”设置它时,转储与 THIS 的转储相同。

但是 - 任何通过映射调用模板的尝试 - 都会导致标准“如果你想使用绝对路径,你必须创建一个映射等等等等......”

我更大的目标是(在应用程序启动时)扫描目录中的子目录,并根据某些子目录创建映射。但如果我不能将该功能抽象为它自己的功能 - 我将被迫直接在 app.cfc 中编写它(这不会杀死我,但我再次尝试对我的代码进行逻辑分段......似乎可以设置这些映射的时间和地点有限制......真的吗?

所以我想最大的问题是 - 我可以通过外部方法设置 this.mappings 吗?我想我可以使用 cfc 调用恢复“我想要的设置”,然后执行“设置 this.whatever = return form cfc” - (这可能是我的答案......)

谢谢

4

2 回答 2

0

我没有对此进行测试,但我很确定如果您的 application.cfc 扩展了您的 settings.cfc,它会起作用。

component {
    public any function getMappings() {
        var mappings = {};
        //code to get your directories etc.
        return mappings;
    }
}

component extends="settings" {
    this.name = "xxxx";
    this.mappings = getMappings();
    ...
}
于 2012-08-10T16:43:04.163 回答
0

映射只能在“伪构造函数”中设置,不能在 Application.cfc 中的任何方法中设置 - http://adobe.ly/QN2oX1

您可以尝试将 this.mappings 设置为 CFC 调用的结果(我想不出为什么这不起作用),但如果它依赖于映射来执行此操作,它可能不起作用。

于 2012-08-10T16:32:03.350 回答