我在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())存储。
以这种方式使用闪存消息的范围有任何限制吗?
答案 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消息转换为模板。