ショッピング カート自体が 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 に基づいて新しいキーを構造体に追加し、サブ構造体を作成します。 /数量を更新します(「qty」キー内)。
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') />
配列への内部読み取り/書き込みがある場合は、サポートされていません。
内部で配列を構造体に変更すれば、準備完了です。