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