На Хекслете можно постоянно видеть сообщение о результатах выполнения действия. Например, аутентификация, регистрация или вступление в курс:
В веб-разработке такое сообщение называют Flash. Оно обычно используется после перенаправления для индикации успешности или неудачи предыдущего действия.
Flash-сообщения используют механизм сессий. Этот механизм позволяет хранить информацию между разными запросами одного и того же пользователя. Он работает благодаря кукам и встроен в PHP.
Подробнее о сессиях мы поговорим в соответствующем уроке, а пока используем его без погружения.
Сначала установим необходимый пакет:
composer require slim/flash
Теперь подключим к проекту:
<?php
use DI\Container;
use Slim\Factory\AppFactory;
// Старт PHP сессии
session_start();
$container = new Container();
$container->set('renderer', function () {
return new \Slim\Views\PhpRenderer(__DIR__ . '/../templates');
});
$container->set('flash', function () {
return new \Slim\Flash\Messages();
});
AppFactory::setContainer($container);
$app = AppFactory::create();
$app->get('/foo', function ($req, $res) {
// Добавление флеш-сообщения. Оно станет доступным на следующий HTTP-запрос.
// 'success' — тип флеш-сообщения. Используется при выводе для форматирования.
// Например, можно ввести тип success и отражать его зеленым цветом (на Хекслете такого много)
$this->get('flash')->addMessage('success', 'This is a message');
return $res->withRedirect('/bar');
});
$app->get('/bar', function ($req, $res) {
// Извлечение flash-сообщений, установленных на предыдущем запросе
$messages = $this->get('flash')->getMessages();
print_r($messages); // => ['success' => ['This is a message']]
$params = ['flash' => $messages];
return $this->get('renderer')->render($res, 'bar.phtml', $params);
});
$app->run();
Во многих фреймворках типы флеш-сообщений стандартизированы. В основном используют следующие:
- success — для удачно завершившихся действий
- warning — для предупреждений
- error — в тех ситуациях, когда произошла ошибка
Флеш-сообщения передаются в шаблон и там выводятся. После их извлечения хранилище обнуляется. При следующем запросе getMessages()
вернет пустой массив.
Флеш-сообщения показываются только на один запрос. После обновления страницы или перехода в другое место они пропадают. Это удобно, так как не нужно следить за их жизненным циклом.
Флеш-сообщений можно добавить сразу много, поэтому getMessages()
возвращает вложенный массив такой структуры:
<?php
// $this->get('flash')->addMessage('success', 'first message');
// $this->get('flash')->addMessage('success', 'second message');
// $this->get('flash')->addMessage('error', 'first message');
// $this->get('flash')->addMessage('error', 'another message');
[
'success' => [
'first message',
'second message',
],
'error' => [
'first message',
'another message'
]
]
Под капотом у флеш-сообщений используются сессии, которые рассматриваются в курсе чуть позже. Благодаря этому механизму сайт запоминает конкретного пользователя и его сообщение.
Самостоятельная работа
-
Установите и подключите пакет для вывода флеш, используя примеры из теории
-
Добавьте реализацию вывода флеш-сообщения при создании пользователя
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.