今天遇到一个奇怪的问题。当传递给具有use
关键字的匿名函数时,似乎某个对象丢失了以前分配的数据值。
我有一个flash消息处理程序,如下所示。 注意我删除了智能配置行以使样本更清洁。
$smarty = new Smarty();
$error = getErrorMessage();
$smarty->assign('error', $error);
$success = getSuccessMessage();
$smarty->assign('success', $success);
如果执行以下代码,则上述赋值在全局范围内完成,并在赋值后立即完成。
$error = $smarty->getTemplateVars('error');
echo $error; //displays the proper value
我可以看到值已正确设置。但是当应用程序达到微弱的动作时,该值似乎就会丢失。
$app->get("/password", function () use ($app, $smarty) {
$error = $smarty->getTemplateVars('error');
echo $error; //displays empty string
$smarty->display('password.tpl');
});
由于此问题,在全局范围分配的值永远不会到达模板。在模板中执行{debug}显示变量值为空。但是,它显示有一个名为error
和success
的变量,其值为空。
任何人都知道为什么会这样?
更新
将以下代码块添加到flash消息检索功能后。我可以看到,一旦检索到原始flash消息值,就会第二次调用此函数。
function getSessionMessage($key)
{
$msg = "";
syslog(LOG_WARNING, "Access" . microtime() . $key);
if (isset($_SESSION[$key])) {
$msg = $_SESSION[$key];
syslog(LOG_WARNING, "Access" . microtime() . $msg);
unset($_SESSION[$key]);
}
return $msg;
}
但为什么会被叫两次?我的脚本只运行一次,并且没有错误的URL会导致触发另一个细长的执行周期。
更新2
进一步诊断显示闪回检索功能被调用两次。但是,apache访问日志仅显示来自浏览器的一个请求。
Jun 15 13:35:14 beast apache2: Access0.68291800 1402814114 NEW successGET
Jun 15 13:35:14 beast apache2: Access0.68419200 1402814114 NEW successGET
127.0.0.1 - - [15/Jun/2014:13:35:14 +0700] "GET /cunm/cunm/password HTTP/1.1" 200 1651 "http://localhost/cunm/cunm/password" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
似乎某些事情导致该函数被执行两次。
问题
所以我终于找到了问题,看来如果你在slim框架中使用分组,即使URL不匹配,组函数内的代码也会被执行。
$app->group("/admin", function () use ($app, $smarty) {
//any code here runs even with the URL is not match "/admin"
$app->get("/servicearea", function () use ($app, $smarty) {
}
}