我正在将Coldbox添加到我们的遗留应用程序中,并且遇到了一个问题,即在使用Coldbox时我们无法从视图中访问某些变量。在onRequestStart方法中Application.cfc中的现有遗留代码中,我们设置了几个变量,如下所示:
VARIABLES.screenID = 0;
VARIABLES.DSN = 'datasourcemain';
VARIABLES.DSNRO = 'datasourcereadonly';
VARIABLES.DSNADMIN = 'datasourceadmin';
VARIABLES.pagetitle = "Default Page Title for web application";
这只是变量集的一小部分。问题是在遗留代码中,这些代码在页眉和页脚中被广泛使用。浏览遗留页面时仍可访问这些页面,但在通过冷箱发送请求时,变量将无法访问。我的问题是,有没有一种推荐的方法让Coldbox了解这些变量并将它们传递给视图,这样我就不必修改数百个文件了?
答案 0 :(得分:2)
这取决于,有一些地方可以定义这些变量。根据给出的有限信息,我建议您将数据源信息添加到Coldbox.cfc> datasources struct(#1)并将默认的pageTitle添加到全局请求处理程序(#2)。至于screenID,谁知道 - 祝你好运!
config / Coldbox.cfc有一个settings
和datasources
结构,可以通过wirebox注入处理程序/控制器。
// Dependency Injection using WireBox
property name='settings' inject='coldbox:settings';
使用全局请求处理程序并将所有全局变量添加到控制器和视图可见的prc
(私有请求上下文)中。
//config/Coldbox.cfc
...
coldbox = {
requestStartHandler: 'Main.onRequestStart'
};
...
// handlers/Main.cfc
component extends='coldbox.system.EventHandler' {
function onRequestStart( event, rc, prc) {
prc.screenID = 0;
prc.DSN = 'datasourcemain';
prc.DSNRO = 'datasourcereadonly';
prc.DSNADMIN = 'datasourceadmin';
prc.pagetitle = "Default Page Title for web application";
}
}
使用请求拦截器并将数据添加到prc
。
//config/Coldbox.cfc
...
interceptors = [
{ class="interceptors.Globals" }
];
...
//interceptor/Globals.cfc
component {
property name='legacyGlobals' inject='LegacyGlobals';
function preProcess(event, interceptData) {
event.setPrivateValue('someLegacyGlobalVar', legacyGlobals.getSomeLegacyGlobalVar() );
}
}