如果购物车本身是 CFC:
<cfset session.cart = CreateObject('component','model.objects.shoppingCart') />
如果它在内部包装了一个结构数组,并将它们存储在 SESSION 或 VARIABLES 中,它将无法工作。在任何其他情况下都可以——但在 ACF9.0 多服务器集群中实现时不会。
解决方案是为您的商店重新设计 CFC/类,以便它们:
在内部(在 CFC 内),不要使用 VARIABLES 范围来存储对数组的访问,并且
在内部(在 CFC 内),读取/写入数组时不要直接访问 SESSION 范围。
您可以使用结构而不是数组来执行此操作(以下是在您的购物车 CFC 中声明的方法):
<cffunction name="addItemToCart" returntype="void">
<cfargument name="item" type="any" required="true" />
<cfscript>
var id = arguments.item.getID();
if (NOT StructKeyExists(VARIABLES.userCart, 'id')
{
VARIABLES.userCart[id] = StructNew();
VARIABLES.userCart[id].qty = 0;
}
VARIABLES.userCart[id].item = arguments.item;
VARIABLES.userCart[id].qty++;
</cfscript>
在上面的伪代码示例中,VARIABLES.userCart 是在 CFC 范围内可访问的范围(并且在 CFC 的生命周期内在其方法调用中共享)将 userCart 变量存储为结构而不是数组. 然后,通过一些技巧,我们根据购物车项目的唯一 id 向结构中添加新的键,并创建一个子结构:一个用于保存实际商店项目(在“item”键中),一个用于保存/更新数量(在“数量”键中)。
如果您决定在 SESSION 中实例化/存储 CFC,则使用结构而不是数组作为存储机制将允许您构建多服务器集群中支持的 CF9 应用程序。
所以,总结一下:
<cfset SESSION.myCartItemCount = ArrayNew(1) />
支持的。
<cfset SESSION.user = CreateObject('component','model.objects.user') />
支持,如果CFC 内没有 Array 存储。
<cfset SESSION.cart = CreateObject('component','model.objects.cart') />
不支持,如果有对数组的内部读/写。
将数组更改为引擎盖下的结构,您就可以开始了。