在会话中序列化对象时不完整的 PHP 类 [英] Incomplete PHP class when serializing object in sessions
问题描述
我正在研究购物车(购物车模型).它的受保护属性之一是_items",它包含一组 Product 对象.它们(产品)都存储在 DB 中以填充会话(使用 ZF、Zend_Session_SaveHandler_DbTable() 等).
I'm working on a shopping cart (Cart model). One of its protected properties is "_items", which holds an array of Product objects. They (Products) all get stored in DB for populating the session (using ZF, Zend_Session_SaveHandler_DbTable() etc.).
public function addItem(Model_Product $product, $qty)
{
$qty = (int) $qty;
$pId = $product->getId();
if ($qty > 0) {
$this->_items[$pId] = array('product' => $product, 'qty' => $qty);
} else {
// if the quantity is zero (or less), remove item from stack
unset($this->_items[$pId]);
}
// add new info to session
$this->persist();
}
在控制器中,我使用 ProductMapper 从 DB 中获取一个 Product obj 并将其提供给addItem()":
In the controller, I grab a Product obj from DB with the ProductMapper and provide it to "addItem()":
$product1 = $prodMapper->getProductByName('cap');
$this->_cart->addItem($product1, 2);
getProductByName()
返回一个新填充的 Model_Product 对象.
getProductByName()
returns a new populated Model_Product object.
我通常得到
请确保您尝试操作的对象的类定义Model_Product"已_before_加载...
错误信息,会话转储明显显示
error message, a session dump obviously shows
['__PHP_Incomplete_Class_Name'] =>'模型_产品'
我知道在序列化之前声明类".我的问题是:如果首先注入(第一个参数),我如何在 addItem()
中声明 Product 类?新声明(如 new Model_Product()
)不会覆盖 addItem()
中的参数(原始对象)吗?我必须再次在 Cart 模型中声明它吗?
I know about the "declaring the class before serializing it". My problem is this: how can I declare the Product class in addItem()
, if it's injected (first param) in the first place? Wouldn't a new declaration (like new Model_Product()
) overwrite the param (original object) in addItem()
? Must I declare it in the Cart model again?
此外,如果我...在购物车中重新声明它,我肯定会得到一个Cannot redeclare class Model_Product
.
Besides, I'll surely get a Cannot redeclare class Model_Product
if I... redeclare it in Cart.
推荐答案
在 ZF 的引导程序中,会话在自动加载之前开始.
In ZF's bootstrap, the session was started before autoloading.
/**
* Make XXX_* classes available
*/
protected function _initAutoloaders()
{
$loader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'XXX',
'basePath' => APPLICATION_PATH
));
}
public function _initSession()
{
$config = $this->_config->custom->session;
/**
* For other settings, see the link below:
* http://framework.zend.com/manual/en/zend.session.global_session_management.html
*/
$sessionOptions = array(
'name' => $config->name,
'gc_maxlifetime' => $config->ttl,
'use_only_cookies' => $config->onlyCookies,
// 'strict' => true,
// 'path' => '/',
);
// store session info in DB
$sessDbConfig = array(
'name' => 'xxx_session',
'primary' => 'id',
'modifiedColumn' => 'modified',
'dataColumn' => 'data',
'lifetimeColumn' => 'lifetime'
);
Zend_Session::setOptions($sessionOptions);
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($sessDbConfig));
Zend_Session::start();
}
当我遇到我正在谈论的错误时,方法声明是相反的:_initSession()
是第一个,然后是 _initAutoloaders()
- 而这个是采埃孚处理它们的确切顺序.
When I was getting the errors I was talking about, the method declaration was the other way around: _initSession()
was first, then _initAutoloaders()
- and this was the exact order ZF was processing them.
我会再测试一些,但这似乎有效(并且合乎逻辑).感谢您的所有建议.
I'll test some more, but this seems to work (and logical). Thanks for all your suggestions.
这篇关于在会话中序列化对象时不完整的 PHP 类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!