【问题标题】:php session flash messagephp会话闪存消息
【发布时间】:2013-09-11 18:05:32
【问题描述】:

我正在尝试在重定向后创建会话闪存消息。

我有控制器类

class Controller
{
    function __construct()
    {
    if(!empty($_SESSION['FLASH']))
        foreach($_SESSION['FLASH'] as $key => $val)
        $this->$key = $val;
    }
    function __destruct()
    {
        $_SESSION['FLASH']=null;
    }
}

我还有 Controller 子类 Home,其中的函数是通过路由运行的,例如 /Home/Index => public function index()

class Home extends Controller
{
    function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        //where i want to display $this->message only once
        echo $this->message; // but $this->message is undefinded why? 
    }
    public function Post_register(){
        //after post form data
        // validation 

        // this function redirect to /Home/Index  above function index();
        Uri::redirectToAction("Home","Index",array('message' => 'some message'));
    }
}

和我重定向用户的 uri 类函数。

public static function redirectToAction($controller,$method,$arr)
{
    $_SESSION['FLASH'] = $arr;
    header("Location:/".$controller.'/'.$method);
}

$this->message 未定义,为什么?

【问题讨论】:

  • 你在使用任何框架吗?
  • 你在哪里设置$this-message?如果你没有在任何地方设置它,它将是未定义的。
  • 您的代码中是否有 session_start() 函数调用? session_start 上的 php 手册:php.net/manual/en/function.session-start.php
  • 我很想创建自己的框架,在这里:$this->$key = $val;是的,我有 session_start();
  • 你用的是什么版本的php?

标签: php session controller


【解决方案1】:

这是因为你的 __destruct。 执行完成后,调用 __destruct 函数并取消设置您的 $_SESSION['FLASH'] 因此,您的脚本中不再可以访问它。

From the php manuel:

一旦没有对特定对象的其他引用,或在关闭序列期间以任何顺序调用,将立即调用析构函数。

只需删除您的 __destruct 函数。

【讨论】:

  • 哦,谢谢@Nico,它现在可以工作了:) 我想在析构函数中删除会话,但这是错误的。 if(!empty($_SESSION['FLASH'])) foreach($_SESSION['FLASH'] as $key => $val) $this->$key = $val;未设置($_SESSION['FLASH']);现在可以工作了:)
【解决方案2】:

在您提供的代码中,$message 从未定义为Controller 类或其派生类Home 的成员。如果要使用该成员变量,则必须将其声明为类的成员,即 I.E. public $message 然后将其设置在执行中的某个位置,大概是在您的 Uri::redirectToAction 函数中。

【讨论】:

  • 是由此代码定义 if(!empty($_SESSION['FLASH'])) foreach($_SESSION['FLASH'] as $key => $val) $this->$key = $val;如果我删除破坏它的工作,但我只想显示此消息一次,然后删除会话
  • @GiaNebieridze 那么,一旦你重置了类成员而不是使用析构函数,你为什么不只是unset()构造函数中foreach循环中的会话变量?
【解决方案3】:

我为这种类型的项目编写了一个库https://github.com/tamtamchik/simple-flash

一旦你安装了它,你就可以这样做了。

在你的redirectToAction:

public static function redirectToAction($controller,$method,$arr)
{
    flash($arr['message']);
    header("Location:/".$controller.'/'.$method);
}

index:

public function index()
{
    echo flash()->display(); 
}

它将生成Bootstrap 友好的警报消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 2019-10-19
    • 2021-04-23
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多