为什么会话消息不起作用无脂肪框架?

时间:2014-12-28 07:56:39

标签: session fat-free-framework

我编写了一个示例crud应用程序,并希望在成功或发生错误时显示一些消息。但是当我尝试设置会话消息时,重定向后它不会显示在页面上。它也不存在于$ _SESSION中。

这是我在UsersController中的代码

public function index(){
    $user = new User($this->db);
    $this->f3->set('users',$user->all());
    $this->f3->set('page_head','User List');
    //get session 
    new Session();
    $sess= $this->f3->get('SESSION.test');
    //set it to use in view file
    $this->f3->set('message', $sess);
    $this->f3->set('view','users/list.htm');
}

public function create(){
    if($this->f3->exists('POST.create')){
        $user = new User($this->db);
        $user->add();
        //set session 
        new Session();
        $this->f3->set('SESSION.test',"Success");
        $this->f3->reroute('/users');
    } else{
        $this->f3->set('page_head','Create User');
        $this->f3->set('view','users/create.htm');
    }
}

这是我的视图文件。

      <check if="{{ @message }}">
        <div class="alert alert-success">
            <button type="button" class="close" data-dismiss="alert">&times;</button>
            <strong>{{ @message }}</strong>
        </div>

它不起作用。这有什么不对?代码取自fat free framework

编辑:正如xfra35建议

好的,我用的时候

$f3->set('SESSION.test','Success');

并删除了对

的调用
  

新会话();

这工作正常,但如何直接在布局文件中使用它而不是在控制器中设置消息变量将其传递给布局文件?我的意思是我应该删除这些行

  

$ sess = $ this-&gt; f3-&gt; get(&#39; SESSION.test&#39;);    $ this-&gt; f3-&gt; set(&#39; message&#39;,$ sess);

并可以直接在视图文件中使用此会话消息。我需要像这样设置会话消息

  

$ _ SESSION [&#39; MSG&#39;] [&#39;成功&#39;] =&#34;已更新&#34 ;;

     

或$ _SESSION [&#39; msg&#39;] [&#39;错误&#39;] =&#34;错误&#34 ;;

我需要遍历会话消息并查看其错误消息或成功消息。有没有办法在会话变量显示后将其变为空白?

2 个答案:

答案 0 :(得分:6)

您正在使用的Session类是基于缓存的会话处理程序。

如果在您的服务器上找不到内存缓存后端(APC,Memcache,Redis,XCache等),该框架将使用自己的基于文件系统的缓存系统。在这种情况下,文件存储在cache/文件夹中名为TEMP的子文件夹中。 (有关F3缓存引擎的更多详细信息,请参阅here

所以回答你的问题:TEMP文件夹有可能不可写

无论如何,如果您不明确需要在缓存中存储会话,只需删除对Session类的调用并继续使用$f3->set('SESSION.test'):会话将通过PHP存储在文件系统上(经典行为)。

以下是在F3中存储会话的各种方法:

默认PHP会话(文件系统):

$f3->set('SESSION.test','Success');

缓存存储:

new Session();
$f3->set('SESSION.test','Success');

SQL存储:

$db=new DB\SQL($dsn,$user,$pw);
new DB\SQL\Session($db);
$f3->set('SESSION.test','Success');

MongoDB存储:

$db=new DB\Mongo($dsn,$dbname);
new DB\Mongo\Session($db);
$f3->set('SESSION.test','Success');

JigDB存储:

$db=new DB\Jig($dir);
new DB\Jig\Session($db);
$f3->set('SESSION.test','Success');

答案 1 :(得分:0)

我遇到的一个场景是我们存储在session中的对象是否不可序列化。例如扩展pdo的模型类。遗憾的是,如果留给默认处理,则不会显示任何错误消息。在代码中放置一个显式的session_commit()将显示这样的错误。

其他原因是:运行Web服务器的用户无法写入session_save_path(),或者有时重定向可能会阻止设置Cookie。