Веб-разработка на PHP

Теория: Flash

На Хекслете можно постоянно видеть сообщение о результатах выполнения действия. Например, аутентификация, регистрация или вступление в курс:

Flash Message

В веб-разработке такое сообщение называют 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'
    ]
]

Под капотом у флеш-сообщений используются сессии, которые рассматриваются в курсе чуть позже. Благодаря этому механизму сайт запоминает конкретного пользователя и его сообщение.

Рекомендуемые программы