Класс FlashBag
Класс FlashBag управляет одноразовыми сообщениями сессии.
Такие сообщения принято называть flash-сообщениями: они
сохраняются в сессии на время одного запроса, а при первом
чтении удаляются. Чаще всего их используют для показа
уведомлений после редиректа: например, сообщение об успешном
сохранении статьи. Объект FlashBag можно получить
из сессии через метод getFlashBag.
Сообщения хранятся по ключам. Один ключ может содержать
сразу несколько сообщений - массив строк. Метод add
добавляет сообщение по ключу, метод get читает
и удаляет сообщения, метод peek читает без удаления.
Синтаксис
$flashBag = $session->getFlashBag();
$flashBag->add(string $type, mixed $message): void;
$flashBag->get(string $type): array;
$flashBag->all(): array;
$flashBag->set(string $type, array $messages): void;
$flashBag->peek(string $type, array $default = []): array;
$flashBag->peekAll(): array;
$flashBag->keys(): array;
$flashBag->has(string $type): bool;
Пример
Давайте получим объект FlashBag из сессии и добавим
сообщение с ключом 'success':
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(Request $request): Response
{
$session = $request->getSession();
$flashBag = $session->getFlashBag();
$flashBag->add('success', 'article saved');
return new Response('message added');
}
}
?>
Результат выполнения кода:
"message added"
Пример
Давайте прочитаем сообщения по ключу 'success'.
После чтения сообщения удаляются из сессии:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/read', name: 'article_read')]
public function read(Request $request): Response
{
$flashBag = $request->getSession()->getFlashBag();
$res = $flashBag->get('success');
return new Response(implode(', ', $res));
}
}
?>
Результат выполнения кода:
"article saved"
При повторном вызове метода get с тем же ключом
вернётся пустой массив, потому что сообщения уже удалены.
Пример
Давайте прочитаем все сообщения сразу через метод all:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/all', name: 'article_all')]
public function all(Request $request): Response
{
$flashBag = $request->getSession()->getFlashBag();
$flashBag->add('success', 'article saved');
$flashBag->add('error', 'user not found');
$res = $flashBag->all();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
{"success":["article saved"],"error":["user not found"]}
Пример
Давайте прочитаем сообщения без удаления через метод
peek и проверим наличие ключа через метод has:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/peek', name: 'article_peek')]
public function peek(Request $request): Response
{
$flashBag = $request->getSession()->getFlashBag();
$flashBag->add('success', 'article saved');
$res = $flashBag->peek('success');
$has = $flashBag->has('success');
return new Response(implode(', ', $res) . ' | ' . var_export($has, true));
}
}
?>
Результат выполнения кода:
"article saved | true"
Пример
Давайте выведем flash-сообщения в шаблоне Twig. Для этого сначала добавим их в контроллере:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/twig', name: 'article_twig')]
public function twig(Request $request): Response
{
$flashBag = $request->getSession()->getFlashBag();
$flashBag->add('success', 'article saved');
return $this->render('article/index.html.twig');
}
}
?>
Теперь выведем сообщения в шаблоне:
{% for message in app.flashes('success') %}
<p>{{ message }}</p>
{% endfor %}
Результат выполнения кода:
<p>article saved</p>
Смотрите также
-
класс
Session,
который управляет сессией пользователя -
метод
getFlashBag,
который возвращает объект FlashBag -
метод
add,
который добавляет flash-сообщение по ключу -
метод
get,
который читает и удаляет flash-сообщения