使用flash消息
当你使用一个form编辑一个模型时,删除一个模型,或者做其它操作,这是一个好习惯,告诉用户是否工作正常,或者发生了错误。典型情况下,在一些动作之后,例如编辑一个form,一个重定向将会发生,并且我们需要在页面上展示一条信息。但是,我们应该如何将它从当前页面传递到重定向目标,然后清理干净?flash消息将会帮助我们。
准备
按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
如何做…
- 创建一个控制器
@app/controllers/TestController.php
:
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\AccessControl;
class TestController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'actions' => ['user']
],
[
'allow' => true,
'roles' => ['?'],
'actions' => ['index', 'success',
'error']
],
],
'denyCallback' => function ($rule, $action) {
Yii::$app->session->setFlash('error',
'This section is only for registered users.');
$this->redirect(['index']);
},
],
];
}
public function actionUser()
{
return $this->renderContent('user');
}
public function actionSuccess()
{
Yii::$app->session->setFlash('success', 'Everything went fine!');
$this->redirect(['index']);
}
public function actionError()
{
Yii::$app->session->setFlash('error', 'Everything went wrong!');
$this->redirect(['index']);
}
public function actionIndex()
{
return $this->render('index');
}
}
- 此外,创建
@app/views/common/alert.php
视图:
<?php
use yii\bootstrap\Alert;
?>
<?php if (Yii::$app->session->hasFlash('success')):?>
<?= Alert::widget([
'options' => ['class' => 'alert-success'],
'body' => Yii::$app->session->getFlash('success'),
]);?>
<?php endif ?>
<?php if (Yii::$app->session->hasFlash('error')) :?>
<?= Alert::widget([
'options' => ['class' => 'alert-danger'],
'body' => Yii::$app->session->getFlash('error'),
]);?>
<?php endif; ?>
- 创建视图
@app/views/test/index.php
:
<?php
/* @var $this yii\web\View */
?>
<?= $this->render('//common/alert') ?>
<h2>Guest page</h2>
<p>There's a content of guest page</p>
- 创建视图
@app/views/test/user.php
:
<?php
/* @var $this yii\web\View */
?>
<?= $this->render('//common/alert') ?>
<h2>User page</h2>
<p>There's a content of user page</p>
- 现在,如果你访问
http://yii-book.app/index.php?r=test/success
,你将会被重定向到http://yii-book.app/index.php?r=test/index
,并展示了一条成功的消息:
- 此外,如果你访问
http://yii-book.app/index.php?r=test/error
,你将会被重重定向到相同的页面上,但是会得到一条错误消息。刷新index
页面,消息将会隐藏:
- 尝试运行
http://yii-book.app/index.php?r=test/user
。你将会被重定向到http://yii-book.app/index.php?r=test/index
,并会在denyCallback
函数中执行并展示一条错误消息:
工作原理…
我们使用Yii::$app->session->('success', 'Everything went fine!')
设置一条flash消息。本质上,它保存了一条消息到一个session中,所以在最低等级上,我们的消息被保存在$_SESSION
中,直到Yii::$app->session->getFlash('success')
被调用,然后$_SESSION
键会被删除。
这个flash消息将会在请求中访问之后被自动删除。
更多…
getAllFlashes()方法
有时你需要处理所有的flashs。你可以使用一个简单的方式来处理它,如下所示:
$flashes = Yii::$app->session->getAllFlashes();
<?php foreach ($flashes as $key => $message): ?>
<?= Alert::widget([
'options' => ['class' => 'alert-info'],
'body' => $message,
]);
?>
<?php endforeach; ?>
removeAllFlashes()方法
当你需要flush所有的flash时,使用下面的方法:
Yii::$app->session->removeAllFlashes();
removeFlash()方法
当你需要移除指定的键,使用如下方法:
Yii::$app->session->removeFlash('success');
在这个例子中,我们添加一个非常有用的回调函数,它设置一条错误信息,并重定向到test/index
页面上。
参考
欲了解更多信息,参考: