簡體   English   中英

Symfony遺留會話問題,緩慢地移植一個大型項目

[英]Symfony legacy session issues, porting a massive project slowly

好的,我們有這個MASSIVE裸機php項目,我們想慢慢轉換成Symfony3

這是一個不斷變化和更新的項目,所以我們需要透明,以確保不會破壞使用它的人。 他們根本不應該注意到差異。

所以我們決定嘗試的解決方案是這樣的:

  1. 將整個應用程序粘貼到/ web中
  2. 將身份驗證器腳本保留在遺留應用程序中(它太復雜,無法移植到新應用程序,然后更新舊腳本以使用新的會話系統),因為它所做的只是設置幾個$ _SESSION鍵
  3. 應用程序中沒有其他地方設置任何會話變量,只是驗證器。

問題在於Legacy Bridge的配置帶來的痛苦,以及一些選擇 堆棧 溢出的答案並沒有讓我們處於任何地方。

  1. 使用橋梁
    如此doc所說的那樣配置橋接器並沒有影響任何東西,除了它正在讀取的會話沒有添加到$_SESSION['_sf2_attributes'] assoc或其他任何地方。

  2. 使用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"
}
  1. 使用監聽器
    對於這個問題,最流行的“解決方案” 之一是來自這個SO答案

但是當在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循環並將該數據應用到新的包。

第一個問題是沒有什么可設置的。 在偵聽器必須使用的會話關聯中找到的遺留應用程序中沒有密鑰集

第二個問題是,由於某種原因,我被阻止注冊一個新的包......

  1. “F-it”方法

因為當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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM