Slim flash消息在try {} catch(){}内部无法正常工作

时间:2017-03-27 17:28:39

标签: php try-catch slim flash-message

我在2.6.1版本中使用PHP Slim Framework(由于升级PHP没有新版本的某些限制),并且当尝试在try / catch块中使用flash消息时,消息是在呈现模板时没有存储在会话中。

例如,下面的代码工作正常(当验证器出现一些错误时,页面被重定向到所需的flash消息):

$objValidation = FormValidator::isValidData($post);

if($objValidation->bolHasError)
{
   $app->flash('objValidation', serialize($objValidation));
   $app->flash('selectedData', $post);
   return $app->redirect('/app/edit/form/components/');
}

但是如果我开始使用try块,如下所示,那么flash消息不会存储在$ _SESSION中(甚至存储在模板中的{{flash}}中):

try {
    $objValidation = FormValidator::isValidData($post);

    if($objValidation->bolHasError)
    {
       $app->flash('objValidation', serialize($objValidation));
       $app->flash('selectedData', $post);
       return $app->redirect('/app/edit/form/components/');
    }

    # some other stuff processed here...
}
catch(Exception $e) {
    # do something
}

P.S。:会话以PHP本地方式(session_start())存储。

以这种方式使用闪存消息的范围有任何限制吗?

1 个答案:

答案 0 :(得分:0)

我发现try块创建了一个“隔离范围”。因此,我尝试在重定向之前放置return false来测试下一页中是否会显示flash消息。最后,flash消息存储在$ _SESSION变量中(当然重定向没有被执行,但至少我发现该问题与try范围有关)。

然后,我发现的解决方案是引发异常并在catch块内进行重定向。像这样:

$objValidation = FormValidator::isValidData($post);

if($objValidation->bolHasError)
{
    throw new Exception('validation_error');
}

然后将错误捕获到catch块中:

catch(Exception $e)
{
    if($e->getMessage() == 'validation_error')
    {
        $app->flash('objValidation', serialize($objValidation));
        $app->flash('formData', $post);

        return $app->redirect('/api/form/change/components/');
    }
}

通过这种方式,我可以将flash消息转换为模板。