我已经获得了一个非常有趣的任务,即尝试将Zend框架实例与古老的遗留代码结合,而不需要修改遗留代码。部分内容是一个多页表单,它接收一堆数据,验证它,处理它,然后通过电子邮件将其发送给网站所有者。我的工作是将数据导入ZF,我可以将其自动处理到数据库中。我不能使用POST。我宁愿避免使用自动提交表单,因为我认为我不应该使用Javascript。得到将是痛苦的笨拙。
我希望使用Session从现有的表单处理器和ZF中获取数据。数据已经在表单处理器的Session中。起初,我认为重定向到我的ZF实例(存在于主网站的子目录中)是一件简单的事情。它是同一个域,应该是同一个会话,对吧?
好吧,关于ZF处理其会话的方式会导致旧的会话数据完全被彻底清除。它刚刚消失了。
ZF处理会话的方式是否会消除现有会话或者这是一个侥幸?如果这不是侥幸,我怎么能绕过它呢?如果是的话,可能导致它/我该如何解决?
修改
我正在使用Zend_Session_SaveHandler_DbTable进行数据库支持的会话。这是在application.ini
中初始化的。这是初始化代码:
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "Sessions"
resources.session.saveHandler.options.primary = "sessionID"
resources.session.saveHandler.options.modifiedColumn = "lastModifiedTime"
resources.session.saveHandler.options.dataColumn = "data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"
在我使用会话的地方,我尝试过调用session_start()
,但这会产生错误。可能是因为保存处理程序代码已经初始化了会话,或者稍后会这样做。如果我尝试直接访问$_SESSION
变量,我可能会出现错误,指示我尝试访问未设置的变量。如果我首先创建Zend_Session_Namespace
然后尝试访问$_SESSION
,我将面临空会话。
答案 0 :(得分:1)
由于您已将ZF设置为将会话保存到数据库而不是文件系统,因此如果脚本不使用相同的ZF引导代码尝试调用会话将失败。 (即便如此,他们也可以使用两个完全不同的会话cookie名称......)
因为你暗示ZF位是 new ,所以解决方案很简单:现在停止使用ZF的会话位。这意味着没有数据库表保存,没有命名空间处理程序。使用原始$_SESSION
超全局,并使用与旧代码相同的会话设置。这是确保两个应用程序都可以访问相同会话数据而无需修改遗留代码的唯一方法。