如果購物車本身就是一個CFC:
<cfset session.cart = CreateObject('component','model.objects.shoppingCart') />
如果它在內部封裝結構的陣列,並將它們存儲在SESSION或變量,它是行不通的。在任何其他情況下,它將爲 - 但在ACF9.0多服務器羣集中實施時不適用。
解決的辦法是重新設計的CFC /類爲您的商店,使他們:
內部(在CFC內),不要使用變量的作用域存儲訪問數組和
在內部(在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>
在這上面的僞代碼,變量例如.userCart是在CFC範圍內可訪問的範圍(並且在CFC生命週期的方法調用中共享)將userCart變量存儲爲結構而不是數組。然後,通過一些技巧,我們根據購物車商品的唯一ID向結構中添加新的關鍵字,並創建一個子結構:一個用於保存實際商店項目(位於「商品」鍵中)和一個用於保存/更新數量(在'數量'鍵中)。
如果您決定在SESSION中實例化/存儲CFC,那麼使用結構作爲您的存儲機制而不是陣列,將允許您構建多服務器羣集支持的CF9應用程序。
因此,要總結:
<cfset SESSION.myCartItemCount = ArrayNew(1) />
支持。
<cfset SESSION.user = CreateObject('component','model.objects.user') />
支持,如果沒有陣列存儲的CFC內部。
<cfset SESSION.cart = CreateObject('component','model.objects.cart') />
不支持,如果有內部讀取/寫入到陣列。
將數組更改爲引擎蓋下的結構,您就可以走了。
非常感謝!非常詳細的答案。 – Seybsen 2011-12-19 05:39:11
你知道爲什麼我們不能使用一個會話作用域CFC的數組嗎?它僅適用於會話複製或正常會話嗎? – LarZuK 2011-12-20 08:25:15