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 教程。