Wie kann ich eine Variable so gründen, dass sie für andere Funktionen im selben CFC (ein CFWheels -Plugin) verfügbar ist?

StackOverflow https://stackoverflow.com/questions/8370109

  •  27-10-2019
  •  | 
  •  

Frage

Ich möchte eine Variable hinzufügen, auf die alle Funktionen in einem Plugin zugegriffen werden können, aber ich erhalte einen undefinierten Fehler mit Variablen. Hier ist mein Plugin:

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

Ich rufe das Plugin von meinen Sitzungen an. CFC Controller:

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. Wenn ich abschrecke this.secretKey Im Plugin erhalte ich einen undefinierten Fehler. Der Fehler sagt mir das this.secretKey ist nicht verfügbar in Sitzungen.CFC Regler. Aber Ich bin nicht Dumping von Sitzungen.CFC, ich entleere mich, wie Sie sehen können. Wieso den?

  2. Wie kann ich umgehen? this.secretKey in meinem Plugin, damit es von setCookie () zugegriffen werden kann? Bis jetzt variables und this Es ist gescheitert, ob ich die Definitionen in einer Funktion, einen Pseudo-Konstruktor oder den Init () hinzufüge. Für ein gutes Maß warf ich herein variables.wheels.class.rememberME, umsonst.

Hier ist der Fehler:

Component [controllers.Sessions] has no acessible Member with name [secretKey]
War es hilfreich?

Lösung

Was du machst init() wird nicht funktionieren, wenn es in ist production Modus. Ein Controller init() wird nur auf der ersten Anfrage für diesen Controller ausgeführt, da er danach zwischengespeichert wird.

So this.secretKey wird auf den ersten Lauf dieses Controllers eingestellt, aber nie auf nachfolgende Läufe.

Sie haben ein paar Möglichkeiten, um diese Arbeit zu machen ...

I. Verwenden Sie den Pseudo-Konstruktor, der auf jeder Controller-Anfrage ausgeführt wird:

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. Verwenden Sie einen Vorfilter, um jede Anfrage anzurufen:

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. Speichern Sie den Schlüssel in einem anhaltenden Bereich, damit es nur einmal vom Controller angerufen wird init() ist in Ordnung.

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top