Как настроить переменную так, чтобы она была доступна другим функциям в том же CFC (плагин CFWheels)? - PullRequest
1 голос
/ 03 декабря 2011

Я хочу добавить переменную, к которой могут обращаться все функции в плагине, но я получаю неопределенную ошибку переменной. Вот мой плагин:

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 в плагин, я получаю неопределенную переменную ошибку. Ошибка говорит мне, что this.secretKey недоступен в Sessions.cfc контроллер. Но Я не выкидываю из Sessions.cfc, я выкидываю из CFC плагина, как вы можете видеть. Почему?

  2. Как настроить область действия this.secretKey в моем плагине, чтобы он был доступен для setCookie ()? До сих пор variables и this терпели неудачу, независимо от того, добавляю ли я определения в функцию, псевдо-конструктор или init (). Для хорошей меры я добавил variables.wheels.class.rememberME, но безрезультатно.

Вот ошибка:

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

1 Ответ

2 голосов
/ 05 декабря 2011

То, что вы делаете в 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);
    }
}

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