Сообщения и сессии
Сессия — хранилище данных одного посетителя, которое живёт между запросами: сервер узнаёт браузер по cookie и достаёт его данные. Flash-сообщение — короткий текст вроде «Статья сохранена», который кладут в сессию и показывают один раз на следующей странице.
Где это настроено
Компонент Flash подключён в src/Controller/AppController.php строкой $this->loadComponent('Flash'), поэтому доступен во всех контроллерах. Сессия работает сразу, запускать её не нужно.
Сообщение
// src/Controller/ArticlesController.php
if ($this->Articles->save($article)) {
$this->Flash->success('Статья сохранена.');
return $this->redirect(['action' => 'index']);
}
$this->Flash->error('Проверьте данные формы.');success() и error() записывают сообщение в сессию. После перенаправления оно появится на странице списка и исчезнет при следующем переходе.
Вывод
Сообщения выводит макет templates/layout/default.php:
<main>
<?= $this->Flash->render() ?>
<?= $this->fetch('content') ?>
</main>Сохраните статью — над списком появится «Статья сохранена.».
Виды сообщений
| Вызов | Шаблон сообщения |
|---|---|
$this->Flash->success('…') | templates/element/flash/success.php |
$this->Flash->error('…') | templates/element/flash/error.php |
$this->Flash->warning('…') | templates/element/flash/warning.php |
$this->Flash->info('…') | templates/element/flash/info.php |
Каждому виду соответствует элемент в папке templates/element/flash. Чтобы изменить вид сообщений, правят эти файлы. Свой вид создают так же: файл flash/note.php и вызов $this->Flash->note('…').
Запись в сессию
public function view(int $id): void
{
$session = $this->request->getSession();
$session->write('lastArticle', $id);
$this->set('article', $this->Articles->get($id));
}getSession() возвращает объект сессии, write() сохраняет значение под именем lastArticle.
Чтение
public function index(): void
{
$lastId = $this->request->getSession()->read('lastArticle');
$this->set('lastId', $lastId);
$this->set('articles', $this->Articles->find()->all());
}Откройте любую статью, вернитесь к списку — в $lastId будет её номер. Если значения нет, read() вернёт null.
Методы сессии
| Метод | Что делает |
|---|---|
write('key', $value) | Сохраняет значение |
read('key') | Читает значение или null |
check('key') | Проверяет, есть ли значение |
delete('key') | Удаляет значение |
consume('key') | Читает и сразу удаляет |
destroy() | Очищает сессию целиком |
Точка в имени создаёт вложенность: write('Cart.items', []).
Частая ошибка
Сообщение записано, а на странице его нет. Причина — в макете нет строки $this->Flash->render(): её легко потерять, заменяя стандартный макет своим. Проверьте макет прежде, чем искать ошибку в контроллере.