{% raw %}

# Symfony Flash 消息

> 原文： [http://zetcode.com/symfony/flash/](http://zetcode.com/symfony/flash/)

Symfony Flash 消息教程展示了如何在 Symfony 中创建 Flash 消息。 Flash 消息是用于用户通知的临时消息。 它们存储在一个会话中，并且一旦检索就消失。

## Symfony

Symfony 是一组可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。 Symfony 于 2005 年发布为免费软件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受到 Spring 框架的极大启发。

## Symfony Flash 示例

在下面的示例中，我们有一个简单的表单，其中有一个输入框用于输入用户名。 如果用户输入的名称无效（空或仅包含空格），则应用将在表单上方显示一个闪烁通知。

> **注意**：在我们的应用中，我们有一个 GET 表单。 GET 方法被认为是[安全](https://developer.mozilla.org/en-US/docs/Glossary/safe)，因此我们未实现 CSRF 保护。 [Symfony CSRF 教程](/symfony/csrf/)涵盖了 Symfony 中的 CSRF 保护。

```php
$ composer create-project symfony/skeleton flashmsg

```

使用`composer`，我们创建一个新的 Symfony 骨架项目。

```php
$ cd flashmsg

```

我们转到项目目录。

```php
$ composer require annotations twig

```

我们安装了两个包：`annotations`和`twig`。

```php
$ composer require server maker --dev

```

我们安装了开发 Web 服务器和 Symfony `maker`。

`src/Service/Validate.php`

```php
<?php

namespace App\Service;

class Validate
{
    public function isValid(?string $name): bool
    {
        if (!isset($name) || trim($name) === '') {

            return false;
        } else {

            return true;
        }
    }
}

```

`Validate`服务检查提供的字符串是否为空或仅包含空格。

> **注意**：在生产应用中，我们使用一些验证库，例如 Symfony 的`symfony/validator`或 PHP Rackit 或 Respect。

```php
$ php bin/console make:controller FormController

```

创建了`FormController`。

`src/Controller/FormController.php`

```php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Service\Validate;

class FormController extends AbstractController
{
    /**
     * @Route("/", name="index")
     */
    public function index()
    {
        return $this->render('form/index.html.twig');
    }

    /**
     * @Route("/form", name="form")
     */
    public function doForm(Request $request, Validate $valService)
    {
        $name = $request->query->get("name");

        $validated = $valService->isValid($name);

        if ($validated) {

            $msg = sprintf("Hello %s!", $name);

            return new Response($msg,  Response::HTTP_OK,
               ['content-type' => 'text/plain']);
        } else {

            $this->addFlash(
                'notice', 'Invalid name entered'
            );

            return $this->redirectToRoute("index");
        }
    }    
}

```

`FormController`响应根路径和形式路径。

```php
/**
 * @Route("/", name="index")
 */
public function index()
{
    return $this->render('form/index.html.twig');
}

```

根路径返回 HTML 表单。

```php
/**
 * @Route("/form", name="form")
 */
public function doForm(Request $request, Validate $valService)
{

```

在`doForm()`方法中，我们注入了`Request`对象和`Validate`服务。

```php
$name = $request->get("name");
$validated = $valService->isValid($name);

```

我们检索名称输入并对其进行验证。

```php
$this->addFlash(
    'notice', 'Invalid name entered'
);

return $this->redirectToRoute("index");

```

如果输入无效，我们将添加带有`addFlash()`的 Flash 消息，并在`index`路径上添加确定。

`templates/form/index.html.twig`

```php
{% extends 'base.html.twig' %}

{% block title %}Home page{% endblock %}

{% block stylesheets %}
<style> .flash-notice { color: red } </style>
{% endblock %}

{% block body %}

{% for message in app.flashes('notice') %}
    <div class="flash-notice">
        {{ message }}
    </div>
{% endfor %}

<form action="/form">

    <div>
        <label>Enter your name:</label>
        <input type="text" name="name">
    </div>

    <button type="submit">Send</button>

</form>

{% endblock %}

```

`FormController`返回一个表单页面。 它包含用户名的输入。

```php
{% for message in app.flashes('notice') %}
    <div class="flash-notice">
        {{ message }}
    </div>
{% endfor %}

```

当应用重定向到此页面时，我们浏览 Flash 消息并将其显示在表单上方的`div`标签中。

`templates/base.html.twig`

```php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
    </body>
</html>

```

`base.html.twig`模板包含其他模板文件共享的代码。 它定义了将在子模板中替换的块。

```php
$ php bin/console server:run

```

我们运行该应用。

在本教程中，我们在 Symfony 中处理了 Flash 消息。

您可能也对以下相关教程感兴趣： [Symfony 简介](/symfony/intro/)， [Symfony 验证教程](/symfony/validation/)， [Symfony 服务教程](/symfony/service/)， [Symfony 表单教程](/symfony/form/) ， [PHP 教程](/lang/php/)或列出[所有 Symfony 教程](/all/#symfony)。

{% endraw %}