1

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

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() 可以访问它?到目前为止,无论我在函数、伪构造函数还是 init() 中添加定义,都失败了variablesthis为了更好的衡量,我投入了variables.wheels.class.rememberME,但无济于事。

这是错误:

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

1 回答 1

2

你正在做的事情init()在模式下是行不通的production。控制器init()仅在对该控制器的第一次请求时运行,因为在那之后它会被缓存。

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

你有几个选择来完成这项工作......

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

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);
    }
}

二、使用 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");
    }
}

三、将密钥存储在持久范围中,以便从控制器调用它一次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);
    }
}
于 2011-12-05T03:15:48.420 回答