[英]Symfony legacy session issues, porting a massive project slowly
好的,我們有這個MASSIVE裸機php項目,我們想慢慢轉換成Symfony3
這是一個不斷變化和更新的項目,所以我們需要透明,以確保不會破壞使用它的人。 他們根本不應該注意到差異。
所以我們決定嘗試的解決方案是這樣的:
問題在於Legacy Bridge的配置帶來的痛苦,以及一些選擇 堆棧 溢出的答案並沒有讓我們處於任何地方。
使用橋梁
正如此doc所說的那樣配置橋接器並沒有影響任何東西,除了它正在讀取的會話沒有添加到$_SESSION['_sf2_attributes']
assoc或其他任何地方。
使用Bridge組件
根據描述使用PhpBridgeSessionStorage
組件的本文檔 ,在配置時,將按以下方式輸出:
classes.php第83行中的ContextErrorException:警告:ini_set():會話處於活動狀態。 您目前無法更改會話模塊的ini設置
當我將它與第一種方法結合起來時,它就變成了第一種方法。 它工作正常,但我在我的symfony控制器中看到遺留應用程序中的會話數據集絕對沒有
DefaultController.php on line 16:
array:3 [▼
"_sf2_attributes" => & []
"_sf2_flashes" => & []
"_sf2_meta" => & array:3 [▼
"u" => 1469839893
"c" => 1469836213
"l" => "0"
]
]
DefaultController.php on line 17:
Session {#2519 ▼
#storage: PhpBridgeSessionStorage {#2520 ▼
#bags: array:2 [▼
"attributes" => AttributeBag {#2218 ▼
-name: "attributes"
-storageKey: "_sf2_attributes"
#attributes: & []
}
"flashes" => FlashBag {#2219 ▼
-name: "flashes"
-flashes: & []
-storageKey: "_sf2_flashes"
}
]
#started: true
#closed: false
#saveHandler: SessionHandlerProxy {#2522 ▼
#handler: SessionHandler {#2217}
#wrapper: true
#saveHandlerName: "files"
}
#metadataBag: MetadataBag {#2521 ▼
-name: "__metadata"
-storageKey: "_sf2_meta"
#meta: & array:3 [▼
"u" => 1469839893
"c" => 1469836213
"l" => "0"
]
-lastUsed: 1469839892
-updateThreshold: "0"
}
}
-flashName: "flashes"
-attributeName: "attributes"
}
但是當在app/config/services.yml
設置和設置監聽器時,如下所示: services: session.legacy: class: AppBundle\\Session\\LegacySessionHandler tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
我們得到這樣的錯誤:
NativeSessionStorage.php第240行中的LogicException:在會話已啟動時無法注冊包。
我理解這個解決方案正在嘗試做什么,但它解決了我身邊的兩個問題:
我覺得,當kernel.request
觸發並且我的類方法被調用時,該事件應該仍然可以看到存儲在$_SESSION
超全局中的symfony上下文之外的實際真實數據集。 因為它應該通過$ _SESSION assoc循環並將該數據應用到新的包。
第一個問題是沒有什么可設置的。 在偵聽器必須使用的會話關聯中找到的遺留應用程序中沒有密鑰集
第二個問題是,由於某種原因,我被阻止注冊一個新的包......
因為當var_dump
$_SESSION
超全局時,我可以在遺留應用程序中看到像_sf2_attributes
這樣的鍵,我決定嘿,為什么不讓驗證者將它的密鑰轉儲到_sf2_attributes
鍵而不是根目錄!
這也不起作用。 就像,完全一樣。 沒有一個出現在我的symfony控制器中。
我靠近我的智慧結束了。 這是一個錯誤,這是設計的嗎?
我遇到了同樣的問題並通過在config.yml中添加它來解決它:
session:
storage_id: session.storage.native
handler_id: session.handler.native_file
save_path: ~
為了調試,我在兩個地方使用了以下PHP代碼:1)在遺留腳本中。 2)在symfony控制器中。
$sessPath = ini_get('session.save_path');
$sessCookie = ini_get('session.cookie_path');
$sessName = ini_get('session.name');
echo '<br>sessPath: ' . $sessPath;
echo '<br>sessCookie: ' . $sessCookie;
echo '<br>sessName: ' . $sessName;
我的問題是symfony與遺留應用程序的session.save_path不同。 因此,symfony代碼無法訪問我的舊$ _SESSION變量。
添加,以下行config.yml修復了問題:
save_path:〜
修復此問題后,symfony控制器代碼可以直接看到所有$ _SESSION變量:
echo "<pre>"; print_r($_SESSION); echo "</pre>";
不需要在其他stackoverflow問題中提到的“類LegacySessionHandler實現EventSubscriberInterface”解決方案。 (這個問題的第3部分)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.