使用use关键字传递给匿名函数时,对象丢失数据

时间:2014-06-15 05:56:32

标签: php smarty slim

今天遇到一个奇怪的问题。当传递给具有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}显示变量值为空。但是,它显示有一个名为errorsuccess的变量,其值为空。

任何人都知道为什么会这样?

更新

将以下代码块添加到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) {
     }

}

0 个答案:

没有答案