РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
277 of 1361 menu

Класс 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-сообщения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить