как настроить флэш-сообщения в моей пользовательской среде MVC?

#php #session #model-view-controller

Вопрос:

это класс сеанса в Session.php файл

 <?php 


namespace appcore;

class Session
{
    public function __construct()
    {
        session_start();
    }

    public function setFlash($key='', $message='')
    {
        $_SESSION['flash'][$key] = $message;
    }

    public function getFlash($key='')
    {

        return $_SESSION['flash'][$key] ?? false;
    }

    public function __destruct()
    {
        unset($_SESSION['flash']);
    }
}

 

затем я вызвал session::setFlash() перед перенаправлением пользователя на домашнюю страницу после регистрации
и вызова session::getFlash() в представлении или макете не имеет значения, но я ничего не отобразил

вот код

 public function register(Request $request)
    {
        $registerModel = new RegisterModel;


        if($request->isPost())
        {
            $registerModel->loadData($request->getBody());

            if($registerModel->validate() amp;amp; $registerModel->save())
            {
                Application::$app->session->setFlash('success', 'Thanks for registering');
                $this->redirect('.');
            }

            return $this->render('register', [
                'model' => $registerModel
            ]);
        }

        $this->setLayout('auth');
        return $this->render('register', [
            'model' => $registerModel
        ]);
    }

 

это тот самый взгляд

  <div class="container">

    <?php if(Application::$app->session->getFlash('success')):?>

    <div class="alert alert-success">
      <?php echo Application::$app->session->getFlash('success'); ?>
    </div>

   <?php endif; ?>
      {{content}}
   </div>

 

я не знаю, почему это не работает

Ответ №1:

Два вероятных подозреваемых:

  1. Вы сбрасываете 'flash' индекс при уничтожении сеанса. Это означает, что при завершении ОДНОГО запроса (первого) данные очищаются. Я бы рекомендовал вам при вызове удалить определенный ключ из этого массива getFlash() , чтобы каждое сообщение получалось только один раз.
  2. Когда второй запрос уже обработан, но сеанс еще не был записан в хранилище (которое обычно обрабатывается PHP асинхронно), вы можете добавить вызов в session_write_close() . Это немедленно завершает сеанс и записывает данные непосредственно в хранилище сеанса, делая их доступными для второго запроса (того, который приходит после перенаправления). Вы должны позвонить по этому номеру, прежде чем делать перенаправление.

Примечание: Ваш «пользовательский MVC-фреймворк» выглядит так, как будто он может жить внутри Laravel. Если это произойдет, redirect() метод уже может вызвать session_write_close() , так что мой второй пункт будет спорным.

Комментарии:

1. большое спасибо, это работает, мой брат, это новая информация, которую я узнал от тебя еще раз спасибо

2. @abdallahquapeel Вы всегда можете проголосовать и/или принять ответы, которые решили вашу проблему.

3. ОК, большое спасибо моему бро @Арсен сессии по умолчанию данные хранятся в сессии хранения, но обычно файл, в котором сервер хранит данные сеанса в запертой, и мы будем использовать session_write_close (), чтобы открыть файл, так как я использовал сеанс, перед и не нужна была эта функция, что я прочитал в документации PHP Примечание [ php.net/manual/en/function.session-write-close.php#122035]