使用flash消息

当你使用一个form编辑一个模型时,删除一个模型,或者做其它操作,这是一个好习惯,告诉用户是否工作正常,或者发生了错误。典型情况下,在一些动作之后,例如编辑一个form,一个重定向将会发生,并且我们需要在页面上展示一条信息。但是,我们应该如何将它从当前页面传递到重定向目标,然后清理干净?flash消息将会帮助我们。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。

如何做...

  1. 创建一个控制器@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');
    }
}
  1. 此外,创建@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; ?>
  1. 创建视图@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>
  1. 创建视图@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>
  1. 现在,如果你访问http://yii-book.app/index.php?r=test/success,你将会被重定向到http://yii-book.app/index.php?r=test/index,并展示了一条成功的消息:

  1. 此外,如果你访问http://yii-book.app/index.php?r=test/error,你将会被重重定向到相同的页面上,但是会得到一条错误消息。刷新index页面,消息将会隐藏:

  1. 尝试运行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页面上。

参考

欲了解更多信息,参考:

results matching ""

    No results matching ""