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
我们安装了两个包:annotations 和 twig。
$ composer require maker --dev
我们安装了 Symfony maker。
<?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。
<?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 路由。
{% 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 标签中显示它们。
<!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 教程。