如何在Symfony 3中使用Flash消息(在控制器和Twig视图内)

本文概述

  • 1.如何创建即时消息
  • 2.如何删除即时消息
  • 3.显示即时消息
一个没有注意到用户所做的事情的系统, 简直糟透了。这就是为什么你总是应该在项目上实现某种通知系统的主要原因, 无论它是采用JavaScript还是以你喜欢的服务器语言在文档中添加一些额外的标记。在Symfony中, 你可以使用有用的Flash系统, 该系统允许你在访问者会话中使用自定义类别设置自定义消息。
在你的Symfony控制器中, 它们非常有用, 用于存储应在用户访问视图后显示的特殊消息。之所以称为Flash消息, 是因为它存储在会话中(它不在乎是否登录), 并且一旦用户访问(或重定向到)项目的另一条路线, 你就可以对其进行处理(显示在视图), 然后它将消失。简而言之, 一旦你检索它们, 它们就会自动从会话中消失。此功能使” 刷新” 消息特别适合存储用户通知。在本文中, 我们将向你展示如何在Symfony 3应用程序中使用和轻松显示Flash消息。
1.如何创建即时消息要将Flash消息从控制器添加到会话中, 你将需要使用$ this-> addFlash方法。如果该方法扩展了symfony的Controller类, 则该方法已在你的类中可用。 flash方法的工作方式如下:
注意请记住, 如果禁用了会话, 则不能使用addFlash方法。
/** * Adds a flash message to the current session for type. * * @param string $typeThe type * @param string $message The message * * @throws \LogicException */protected function addFlash($type, $message)

在旧版本的Symfony < 2.7中, 有必要访问容器, 然后检索会话, 从会话中检索flashBag, 最后使用add方法(它期望与addFlash相同的参数, 因为$ this-> addFlash只是一个在Symfony < 2.7中需要执行的过程的快捷方式):
// Retrieve flashbag from the controller$flashbag = $this-> get('session')-> getFlashBag(); // Add flash message$flashbag-> add($type, $message);

【如何在Symfony 3中使用Flash消息(在控制器和Twig视图内)】尽管你可以使用控制器中的addFlash方法, 但也可以在最近的项目中使用Symfony 2.7方法。
以下示例显示了如何在控制器内以不同类型添加多个即显消息:
< ?phpnamespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller{/*** @Route("/", name="homepage")*/public function indexAction(){// 1. Using the shortcut method of the controller// Adding a success type message$this-> addFlash("success", "This is a success message"); // Adding a warning type message$this-> addFlash("warning", "This is a warning message"); // Adding an error type message$this-> addFlash("error", "This is an error message"); // Adding a custom type message, remember the type is totally up to you !$this-> addFlash("bat-alarm", "Gotham needs Batman"); // 2. Retrieve manually the flashbag// Retrieve flashbag from the controller$flashbag = $this-> get('session')-> getFlashBag(); // Set a flash message$flashbag-> add("other", "This is another flash message with other type"); // Render some twig viewreturn $this-> render("default/index.html.twig"); }}

请注意, 给定的type参数是私有数组的键, 这意味着你可以将多个闪存消息添加到单个类别, 例如, 多个成功消息和错误消息:
< ?phpnamespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller{/*** @Route("/", name="homepage")*/public function indexAction(){// 1. Using the shortcut method of the controller// Adding 2 success type messages$this-> addFlash("success", "This is the first success message"); $this-> addFlash("success", "This is the second success message"); // Adding 2 error type messages$this-> addFlash("error", "This is the first error message"); $this-> addFlash("error", "This is the second error message"); // Render some twig viewreturn $this-> render("default/index.html.twig"); }}

如果要立即学习如何显示它们, 请跳至步骤3。
2.如何删除即时消息如果你已经在该会话中添加了即时消息, 但由于某种原因不想再显示它, 则需要将其删除。如前所述, Flash消息一旦检索就消失了, 因此, 要删除它们, 你只需要使用Flash消息类型作为第一个参数的无指针访问get方法(不要将其值存储到变量中) :
< ?phpnamespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller{/*** @Route("/", name="homepage")*/public function indexAction(){// Retrieve flashbag from the controller$flashbag = $this-> get('session')-> getFlashBag(); // Set a flash message$flashbag-> add("bat-alarm", "Gotham needs Batman"); // Retrieves the value (that isn't being assigned to a variable)// and therefore is "deleted" from the flashbag$flashbag-> get("bat-alarm"); // Render some twig viewreturn $this-> render("default/index.html.twig"); }}

现在在视图中, 蝙蝠警报类型将不再在视图中呈现, 因为先前已检索(删除)了它。
3.显示即时消息根据添加消息的方式, 有两种显示即时消息的方法:
Symfony版本3.3中的新增功能在Symfony 3.3中引入了app.flashes()Twig函数。
按类型显示
在Symfony> 3.3中, 你可以在应用程序的Flashes功能中提供要在视图中显示的Flash类型作为第一个参数:
{% for message in app.flashes('success') %}< div class="flash-notice"> {{ message }}< /div> {% endfor %}

在Symfony 3.X < 3.3中, 可以通过将其作为会话中flashBag对象的get函数的第一个参数提供, 在视图中显示预定义类型的所有消息:
{% for flash_message in app.session.flashBag.get('success') %}< div class="alert alert-success"> {{ flash_message }}< /div> {% endfor %}

你只需要更改类型即可。
显示所有即时消息
太懒了以至于无法过滤视图中的消息类型?然后通过将div的类别设置为将在视图上显示的Flash消息的类别来使任务自动化, 然后在Twig中遍历所有flashbag消息。此示例与Bootstrap配合使用非常好, 因为它具有alert alert- < type> 类, 该类在页面上显示具有自定义颜色的Alert div:
{% for label, messages in app.flashes %}{% for message in messages %}< div class="alert alert-{{ label }}"> {{ message }}< /div> {% endfor %}{% endfor %}

如果你使用的是Symfony 3.X < 3.3, 则还可以遍历app.session.flashbag.all对象:
{% for label, flashes in app.session.flashbag.all %}{% for flash in flashes %}< div class="alert alert-{{ label }}"> {{ flash }}< /div> {% endfor %}{% endfor %}

编码愉快!

    推荐阅读