我想添加一个可以被插件中的所有函数访问的变量,但是我得到一个变量未定义的错误。这是我的插件:
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);
}
}
当我在插件中转储this.secretKey
时,我得到一个变量未定义的错误。该错误告诉我 Sessions.cfc 控制器中没有this.secretKey
。但是我不是从Sessions.cfc转储,我正在从插件的CFC中转储,正如你所看到的那样。为什么呢?
如何在插件中定位this.secretKey
以便setCookie()可以访问它?到目前为止variables
和this
都失败了,我是否在函数,伪构造函数或init()中添加了定义。为了更好的衡量,我投入了variables.wheels.class.rememberME
,但没有用。
这是错误:
Component [controllers.Sessions] has no acessible Member with name [secretKey]
答案 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);
}
}