【问题标题】:how to set flash messages in my custom MVC framework?如何在我的自定义 MVC 框架中设置 Flash 消息?
【发布时间】:2021-10-31 05:31:13
【问题描述】:

这是 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>

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

【问题讨论】:

    标签: php session model-view-controller


    【解决方案1】:

    两个可能的嫌疑人:

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

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

    【讨论】:

    • 非常感谢,我的兄弟,这是我从你那里学到的新信息,再次感谢
    • @abdallahquapeel 随时欢迎您投票和/或接受解决您问题的答案。
    • 好的,非常感谢我的兄弟@ArSeN 默认会话数据存储在会话存储中,但通常服务器存储会话数据的文件被锁定,我们使用 session_write_close() 解锁文件我之前使用过 session 并且不需要我在 PHP 文档说明 [php.net/manual/en/function.session-write-close.php#122035] 中阅读过的这个函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2016-01-02
    • 2018-12-25
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多