首页 > 解决方案 > 如何在我的自定义 MVC 框架中设置 Flash 消息?

问题描述

这是 Session.php 文件中的 Session 类

<?php 


namespace app\core;

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() && $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>

我不知道为什么它不起作用

标签: phpsessionmodel-view-controller

解决方案


两个可能的嫌疑人:

  1. 'flash'在销毁会话时取消设置索引。这意味着当一个请求结束时(第一个),数据被清除。我建议您在调用时从这个数组中删除一个特定的键getFlash(),这样每条消息只会得到一次。
  2. 当第二个请求已被处理但会话尚未写入存储时(通常由 PHP 异步处理),您可能需要添加对session_write_close(). 这会立即结束会话并将数据直接写入会话存储,使其可用于第二个请求(重定向之后的请求)。在进行重定向之前,您必须调用它。

旁注:您的“自定义 MVC 框架”代码看起来可以存在于 Laravel 中。如果是这样,该redirect()方法可能已经调用了,session_write_close()所以我的第二点将没有实际意义。


推荐阅读