如何调整变量的范围,使其可用于同一个CFC中的其他函数(CFWheels插件)?

时间:2011-12-03 18:56:20

标签: coldfusion cfc cfwheels

我想添加一个可以被插件中的所有函数访问的变量,但是我得到一个变量未定义的错误。这是我的插件:

component
    mixin="Controller"
{
    public any function init() {
        this.version = "1.0";
        return this;
    }

    public void function rememberMe(string secretKey="rm_#application.applicationName#") {
        this.secretKey = arguments.secretKey;
    }

    public void function setCookie(required string identifier) {
        // Create a cookie with the identifier and encrypt it using this.secretKey
        // this.secretKey is not available, though, and an error is thrown
        writeDump(this.secretKey); abort;
    }
}

我从Sessions.cfc控制器调用插件:

component
    extends="Controller"
{
    public void function init() {
        // Call the plugin and provide a secret key
        rememberMe("mySecretKey");
    }

    public void function remember() {
            // Call the plugin function that creates a cookie / I snipped some code
            setCookie(user.id);
        }
}
  1. 当我在插件中转储this.secretKey时,我得到一个变量未定义的错误。该错误告诉我 Sessions.cfc 控制器中没有this.secretKey。但是我不是从Sessions.cfc转储,我正在从插件的CFC中转储,正如你所看到的那样。为什么呢?

  2. 如何在插件中定位this.secretKey以便setCookie()可以访问它?到目前为止variablesthis都失败了,我是否在函数,伪构造函数或init()中添加了定义。为了更好的衡量,我投入了variables.wheels.class.rememberME,但没有用。

  3. 这是错误:

    Component [controllers.Sessions] has no acessible Member with name [secretKey]
    

1 个答案:

答案 0 :(得分:2)

init()模式下,您在production中执行的操作无效。控制器的init()仅在该控制器的第一个请求上运行,因为它在此之后被缓存。

所以this.secretKey将在该控制器的第一次运行时设置,但从不用于后续运行。

你有几个选择让这项工作......

予。使用伪构造函数,它在每个控制器请求上运行:

component
    extends="Controller"
{
    // This is run on every controller request
    rememberMe("mySecretKey");

    // No longer in `init()`
    public void function init() {}

    public void function remember() {
        // Call the plugin function that creates a cookie / I snipped some code
        setCookie(user.id);
    }
}

II。使用before过滤器来调用每个请求:

component
    extends="Controller"
{
    // No longer in `init()`
    public void function init() {
        filters(through="$rememberMe");
    }

    public void function remember() {
        // Call the plugin function that creates a cookie / I snipped some code
        setCookie(user.id);
    }

    // This is run on every request
    private function $rememberMe() {
        rememberMe("mySecretKey");
    }
}

III。将密钥存储在持久范围内,以便只从控制器init()调用一次即可。

component
    mixin="Controller"
{
    public any function init() {
        this.version = "1.0";
        return this;
    }

    public void function rememberMe(string secretKey="rm_#application.applicationName#") {
        application.secretKey = arguments.secretKey;
    }

    public void function setCookie(required string identifier) {
        // This should now work
        writeDump(var=application.secretKey, abort=true);
    }
}