跳转到内容

闪存消息


概览

闪存消息用于通知用户其操作的状态,或简单地向用户显示信息。这些类型的消息可以使用此组件生成。

适配器

此组件使用适配器来决定消息如何在视图中显示或发送。有两种适配器可用,但您可以轻松创建自己的适配器。Phalcon\Flash\FlashInterface接口。

适配器 描述
Phalcon\Flash\Direct 直接输出传递给闪存的消息
Phalcon\Flash\Session 暂时将消息存储在会话中,然后可以在下一个请求中打印消息

直接输出

Phalcon\Flash\Direct可以用于直接输出在组件中设置的消息。这在需要在当前请求中向用户显示数据而无需重定向的情况下非常有用。

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

$flash->error('Something went wrong');

会话

Phalcon\Flash\Session可以用于输出在组件中设置的消息。该组件透明地将消息存储在会话中以在重定向后使用。

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Session as FlashSession;
use Phalcon\Session\Adapter\Stream;
use Phalcon\Session\Manager;

$session = new Manager();
$files = new Stream(
    [
        'savePath' => '/tmp',
    ]
);
$session->setHandler($files);

$escaper = new Escaper();
$flash   = new FlashSession($escaper, $session);

$flash->error('Something went wrong');

并在您的视图中

<?php echo $flash->output(); ?>

或者在使用 Volt 时

{{ flash.output() }}

想象一个登录表单,您需要验证用户名和密码并告知用户其凭据是否正确。可以使用Phalcon\Flash\Session来执行此任务如下:- 用户输入凭据并点击Login- 应用程序将数据发布到loginAction我们的控制器 - 应用程序检查数据并且组合不正确 - 应用程序在闪存消息中存储Incorrect Credentials消息 - 应用程序将用户重定向回登录页面 (/login) - 闪存消息仍然持有该消息Incorrect Credentials并将在屏幕上显示它。

下面的示例显示了控制器中的这种行为。如果发生错误,无论是实际的应用程序错误还是由于凭据不正确,代码都会使用$this->flash->error().

<?php

namespace MyApp;

use Phalcon\Flash\Session;
use Phalcon\Http\Request;
use Phalcon\Http\Response;
use Phalcon\Mvc\Controller;
use Phalcon\Mvc\View;
use Vokuro\Auth\Auth; 
use Vokuro\Models\Users;
use Vokuro\Models\ResetPasswords;

/**
 * Controller used to handle non-authenticated session actions like 
 * login/logout, user signup, and forgotten passwords
 *
 * @property Auth     $auth
 * @property Request  $request
 * @property Response $response
 * @property Session  $flashSession
 * @property View     $view
 */
class SessionController extends Controller
{
    /**
     * Starts a session in the admin backend
     */
    public function loginAction()
    {
        $form = new LoginForm();

        try {
            if (true !== $this->request->isPost()) {
                // ....
            } else {
                $postData = $this->request->getPost();
                if (true !== $form->isValid($postData)) {
                    // Flash
                    foreach ($form->getMessages() as $message) {
                        $this->flashSession->error($message);
                    }
                } else {
                    $email    = $this->request->getPost('email');
                    $password = $this->request->getPost('password');
                    $remember = $this->request->getPost('remember');

                    $this->auth->check(
                        [
                            'email'    => $email,
                            'password' => $password,
                            'remember' => $remember,
                        ]
                    );

                    return $this->response->redirect('users');
                }
            }
        } catch (AuthException $e) {
            // Flash
            $this->flashSession->error($e->getMessage());
        }

        $this->view->form = $form;
    }
}

并在您的视图中

<?php echo $flashSession->output(); ?>

或者在使用 Volt 时

{{ flashSession.output() }}

注意

在上面的例子中,将flashSession服务已经在 DI 容器中注册。有关此内容的更多详细信息,请查看下面的相关部分。

样式

该组件(无论适配器如何)提供屏幕上的消息自动样式化。这意味着消息将被包裹在<div>标签中。还有一个消息类型与 CSS 类的映射,您可以根据在应用程序中使用的样式表利用它。默认情况下,该组件使用以下映射:

类型 CSS 类名称
error errorMessage
notice noticeMessage
success successMessage
warning warningMessage

通过使用默认类,您可以在应用程序的样式表中相应地设置errorMessage的样式,使其按您希望的方式显示。例如,常见的是错误消息具有红色背景,以便它们突出显示。

错误消息:

$flash->error('Error message');

将生成:

<div class="errorMessage">Error message</div>

如果您不想使用默认类,可以使用setCssClasses()方法替换消息类型到类名的映射。

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

var_dump(
    $flash->getCssClasses()
);

// [
//     "error"   => "errorMessage",
//     "notice"  => "noticeMessage",
//     "success" => "successMessage",
//     "warning" => "warningMessage",
// ];


$cssClasses = [
    'error'   => 'alert alert-danger',
    'success' => 'alert alert-success',
    'notice'  => 'alert alert-info',
    'warning' => 'alert alert-warning',
];

$flash->setCssClasses($cssClasses);

然后调用

$flash->error('Error message');

将生成:

<div class="alert alert-danger">Error message</div>

注意

The setCssClasses()返回对象本身,因此您可以使用更流畅的接口进行方法链式调用。

该组件还允许您指定不同的模板,以便您可以控制组件生成的 HTML。可以通过setCustomTemplate()getCustomTemplate()暴露此功能。模板需要有两个占位符:

占位符 描述
%cssClass% 在此处注入 CSS 类
%message% 在此处注入消息
<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

$template = '<span class="%cssClass%">%message%</span>';

$flash->setCustomTemplate($template);

然后调用

$flash->error('Error message');

将生成:

<span class="myErrorClass">Error message</span>

注意

The setCustomTemplate()返回对象本身,因此您可以使用更流畅的接口进行方法链式调用。

您还可以通过使用setCssIconClasses()为每个 CSS 类设置图标类。当与 [Bootstrap][bootstrap] 等 CSS 库一起工作时特别有用。

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

$iconClasses = [
    'error'   => 'alert alert-error',
    'success' => 'alert alert-success',
    'notice'  => 'alert alert-notice',
    'warning' => 'alert alert-warning',
];

$flash->setCssIconClasses($iconClasses);

然后调用

$flash->error('Error message');

将生成:

<div class="errorMessage"><i class="alert alert-error"></i>Error message

注意

The setCssIconClasses()返回对象本身,因此您可以使用更流畅的接口进行方法链式调用。

如何使用setCssClasses, setCssIconClassessetCustomTemplate输出可以关闭的闪存消息的一个示例如下:关闭的示例如下:

<?php

use Phalcon\Di\FactoryDefault;
use Phalcon\Flash\Session;

$container = new FactoryDefault();

$container->set(
    'flashSession',
    function () {
        $flash = new Session();

        $flash->setCssClasses(
            [
                'error'   => 'error_message callout alert radius flashSession',
                'success' => 'success_message callout success radius flashSession',
                'warning' => 'warning_message callout warning radius flashSession',
                'notice'  => 'notice_message callout secondary radius flashSession'
            ]
        );

        $flash->setCssIconClasses(
            [
                'error'   => 'fi-alert',
                'success' => 'fi-check',
                'notice'  => 'fi-star',
                'warning' => 'fi-flag',
            ]
        );

        $template = '<div class="%cssClass%">
    <i class="%cssIconClass%"></i> %message%
    <button class="close-button" aria-label="Close" type="button" data-close>
        <span aria-hidden="true">&times;</span>
    </button>
</div>';
        $flash->setCustomTemplate($template);

        $flash->setAutoescape(false);

        return $flash;
    }
);
然后如果您调用:

$this->flashSession->error('An error has occurred. Please contact support.')
将在您的视图中生成以下 HTML 片段(当调用$flashSession->output():
<div class="error_message callout alert radius flashSession">
    <i class="fi-alert"></i> An error has occurred. Please contact support.
    <button class="close-button" aria-label="Close" type="button" data-close>
        <span aria-hidden="true">&times;</span>
    </button>
</div>

消息

如上所述,该组件有不同的消息类型。要向组件添加消息,可以调用message()并传入类型和消息本身。消息类型有:

  • error
  • notice
  • success
  • warning
<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

$flash->message('error', 'Error message');

当调用message()时,虽然可以将类型作为第一个参数传递,也可以使用相关的辅助方法来实现:

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

$flash->error('Error message');
$flash->notice('Notice message');
$flash->success('Success message');
$flash->warning('Warning message');

如果您的应用程序需要,在构建响应的某个时刻可能需要清除消息。为此,可以使用clear()方法设置容器。

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

$flash->error('Error message');

$flash->clear();

注意

clear()仅在隐式刷新被禁用时有效 (setImplicitFlush(false))

隐式刷新

默认情况下,隐式刷新设置为true。但是,您可以使用setImplicitFlush(false)来关闭它。此方法的目的是设置输出是否必须隐式刷新到输出或作为字符串返回。

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

echo $flash->getImplicitFlush(); // true

$flash->error('Error'); // No output

echo $flash
    ->setImplicitFlush(false) 
    ->error('Error Message') // 'Error Message'
;

注意

The setImplicitFlush()返回对象本身,因此您可以使用更流畅的接口进行方法链式调用。

注意

使用Phalcon\Flash\Direct组件时,要直接在页面上显示结果,您必须设置setImplicitFlush()false.

转义

默认情况下,组件将转义消息的内容。然而,有时您可能不希望转义消息的内容。可以使用setAutoescape(false);

<?php

use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$escaper = new Escaper();
$flash   = new Direct($escaper);

echo $flash->getAutoescape(); // true

$flash
    ->setAutoescape(false)
    ->error('<h1>Error</h1>')
;

将生成

<div class="errorMessage">&lt;h1&gt;Error&lt;/h1&gt;</div>

注意

The setAutoescape()返回对象本身,因此您可以使用更流畅的接口进行方法链式调用。

依赖注入

如果您使用Phalcon\Di\FactoryDefault容器,Phalcon\Flash\Direct已经为您以名称flash。此外,Phalcon\Flash\Session已经为您以名称flashSession.

注册。下面是一个注册服务以及访问它的示例:

直接输出

<?php

use Phalcon\Di\Di;
use Phalcon\Html\Escaper;
use Phalcon\Flash\Direct;

$container = new Di();
$escaper   = new Escaper();

$container->set(
    'flash',
    function () use ($escaper) {
        return new Direct($escaper);
    }
);

会话

<?php

use Phalcon\Di\Di;
use Phalcon\Html\Escaper;
use Phalcon\Flash\Session as FlashSession;
use Phalcon\Session\Adapter\Stream;
use Phalcon\Session\Manager;

$container = new Di();
$escaper   = new Escaper();
$session   = new Manager();
$files     = new Stream(
    [
        'savePath' => '/tmp',
    ]
);
$session->setHandler($files);

$container->set(
    'flashSession',
    function () use ($escaper, $session) {
        return new FlashSession($escaper, $session);
    }
);

注意

您不需要在构造函数中传递转义器或会话。如果使用 Di 容器,并且这些服务已经在其中注册,则它们将被内部使用。这是实例化组件的另一种方式。

现在你可以在控制器中使用该组件(或者实现它的组件Phalcon\Di\Injectable)

<?php

namespace MyApp;

use Phalcon\Flash\Direct;
use Phalcon\Mvc\Controller;

/**
 * Invoices controller
 *
 * @property Direct $flash
 */
class InvoicesController extends Controller
{
    public function indexAction()
    {

    }

    public function saveAction()
    {
        $this->flash->success('The post was correctly saved!');
    }
}
无噪 Logo
无噪文档
25 年 6 月翻译
文档源↗