Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сообщения и сессии

Сессия — хранилище данных одного посетителя, которое живёт между запросами: сервер узнаёт браузер по 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(): её легко потерять, заменяя стандартный макет своим. Проверьте макет прежде, чем искать ошибку в контроллере.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.