ZetCode

Symfony Flash 消息

最后修改于 2020 年 7 月 5 日

Symfony Flash 消息教程演示了如何在 Symfony 中创建 Flash 消息。Flash 消息是用于用户通知的临时消息。它们存储在会话中,并在检索后消失。

Symfony

Symfony 是一组可重用的 PHP 组件和用于 Web 项目的 PHP 框架。Symfony 于 2005 年作为免费软件发布。Symfony 在很大程度上受到了 Spring Framework 的启发。

Symfony Flash 示例

在以下示例中,我们有一个简单的表单,其中包含一个用于用户名的输入框。如果用户输入无效名称(为空或仅包含空格),应用程序会在表单上方显示一个 Flash 通知。

注意: 在我们的应用程序中,我们有一个 GET 表单。GET 方法被认为是安全的,因此我们不实现 CSRF 保护。 Symfony CSRF 教程涵盖了 Symfony 中的 CSRF 保护。

$ symfony new symflash

使用 symfony CLI,我们创建一个新的 Symfony 骨架项目。

$ cd symflash

我们进入项目目录。

$ php bin/console --version
Symfony 5.0.8 (env: dev, debug: true)

我们使用 Symfony 5.0.8。

$ composer require annotations twig

我们安装了两个包:annotationstwig

$ composer require maker --dev

我们安装了 Symfony maker。

src/Service/Validate.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 bin/console make:controller FormController

创建了一个 FormController

src/Controller/FormController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
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(): Response
    {
        return $this->render('form/index.html.twig');
    }

    /**
     * @Route("/form", name="do-form")
     * @param Request $request
     * @param Validate $valService
     * @return RedirectResponse|Response
     */
    public function doForm(Request $request, Validate $valService): Response
    {
        $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 响应根路径和表单路径。

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

根路径返回一个 HTML 表单。

/**
 * @Route("/form", name="do-form")
 * @param Request $request
 * @param Validate $valService
 * @return RedirectResponse|Response
 */
public function doForm(Request $request, Validate $valService): Response
{

doForm() 方法中,我们注入了一个 Request 对象和一个 Validate 服务。

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

我们检索用户名输入并进行验证。

if ($validated) {

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

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

如果验证成功,我们会向客户端发送一个纯文本响应。

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

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

如果输入无效,我们会使用 addFlash() 添加一个 Flash 消息,并重定向到 index 路由。

templates/form/index.html.twig
{% 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="{{ path('do-form') }}">

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

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

    </form>

{% endblock %}

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

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

当应用程序重定向到此页面时,我们会遍历 Flash 消息并在表单上方的 div 标签中显示它们。

templates/base.html.twig
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

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

$ symfony serve

我们运行应用程序并访问 localhost:8000

在本教程中,我们学习了如何在 Symfony 中使用 Flash 消息。

列出 所有 Symfony 教程。