在使用CF application.cfc时 - 需要创建一些vars(在本范围内) - 例如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块中时 它工作正常 - 如果我把那个脚本块放在它自己的文件中并在application.cfc中包含它
然而 - 在尝试细分我的代码时 - 我想将我的所有应用程序设置放在settings.cfc中......(这里的想法是因为某些设置必须改变 - 我不必担心关于'在哪里'看,我真的不想在我的app.cfc和settings.cfc中的其他应用程序或会话设置上拆分这些东西
所以我在settings.cfc中创建了一个名为getTHIS的方法,然后我将脚本块放在那里......然后使用
<cfinvoke component="settings"
method="getTHIS"
returnvariable="THIS"
/>
哪些工作 - 除了(似乎)映射...
this.name等,似乎都可以工作并设置 - 事实上,如果我这样做,那么this.mappings也会设置好(所以看起来好像)
<cfdump var="#THIS#" label="THIS" />
当我在app.cfc页面上设置'字面'时,转储与此转储相同..
但是 - 任何通过映射调用模板的尝试都会产生一个标准“如果你想使用绝对路径来创建映射等等......”
MY BIGGER的目标是(在应用程序启动时)扫描目录中的子目录,并根据某些子目录创建映射..但是如果我不能将该功能抽象到它自己的功能中 - 我会被迫直接在app.cfc中编写它(这不会杀了我,但是再一次,我试图在逻辑上划分我的代码......似乎有时间和地点可以设置这些映射的限制..真的吗?
所以我想最大的问题是 - 我可以通过外部方法设置this.mappings吗? 我想我可以使用cfc调用恢复'我想要的设置',然后只需执行'set this.whatever = return form cfc' - (这可能是我的答案......)
由于
答案 0 :(得分:0)
映射只能在'伪构造函数'中设置,而不能在Application.cfc中的任何方法内设置 - http://adobe.ly/QN2oX1
您可以尝试将this.mappings设置为CFC调用的结果(我无法想到为什么这不起作用),但如果它依赖于映射来执行此操作,则可能无效。
答案 1 :(得分: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();
...
}