2015-04-27 52 views
1

我使用Zend_Auth進行標準會話存儲(Zend \ Authentication \ Storage \ Session)認證。在Zend框架2認證之後保存額外的用戶數據

也許在另一個請求中,在用戶通過身份驗證之後,我必須將一些關於用戶的其他信息保存到會話中。 我不知道這是否是使用AUTH存儲用於保存用戶的附加信息到會話像

$authSession = new Container('Zend_Auth'); 
$storage = $authSession->storage; 
$storage['additionalUserInfo'] = 'top secret; 

最佳實踐或者是更好地爲創造一個完整的新的Zend \會議\集裝箱用戶會話?

回答

0

我有一個特殊的單身類與靜態方法來保存和檢索會話變量。這實際上是ZF2會話類的基本容器。複製並粘貼:

namespace Application\Core; 

use Zend\Session\Container; 

class Session { 

    private static $container; 

    private static function getContainer() { 
     if (!self::$container) { 
      self::$container = new Container('instela'); 
     } 

     return self::$container; 
    } 

    public static function setValue($key, $value) { 
     try { 
      self::getContainer()->$key = $value; 
     } catch (\Zend\Session\Exception\RuntimeException $e) { 

      return false; 
     } catch (\Exception $e) { 
      return false; 
     } 
    } 

    public static function getValue($key) { 
     try { 
      return self::getContainer()->$key; 
     } catch (\Zend\Session\Exception\RuntimeException $e) { 
      return false; 
     } catch (\Exception $e) { 
      return false; 
     } 
    } 

} 

的使用非常簡單,

Session::setValue('variable',$var); 
$var=Session::getValue('variable'); 
1

幾個不錯的做法:

  1. 不要與您的身份驗證服務使用的存儲直接交互。使用服務的規定用法(檢查並獲得您的身份驗證身份,即:$authService->getIdentity())。
  2. 不要陷入將存儲分隔成「會話」,「緩存」,「數據庫」等類型的陷阱。只有「存儲」。
  3. 不要糾纏認證,會話狀態和數據存儲。
    • 認證並不一定意味着有會話(想想REST服務和OAuth應該是無狀態的)。
    • 訪問用戶數據不應該需要初始化會話(假設您有一個系統進程需要遍歷所有的用戶並根據會話數據執行一些操作,有些如何引導會話狀態以獲得你需要的數據 - 恐怖)。

你是在正確的軌道,以創建一個新的容器來存儲額外的數據上。但我不會將其歸類爲「會話」存儲,而是將其歸類爲數據服務,以用於實際存儲的任何內容。我可能會做這樣的事情:

// define an interface for a data service 
interface UserRepositoryInterface { 
    public function setAdditionalInfo($info); 
    public function getAdditionalInfo(); 
} 

// this is still bad because it breaks best practice #3 
// but it is sufficient for the example and is a good start 
class UserContainer implements UserRepositoryInterface { 
    // implement methods using Zend\Session\Container 
} 

// configure service manager to return your data service 
'service_manager' => [ 
    'factory' => [ 
     'user_container' => function($sm){ 
      return new UserContainer(); 
     } 
    ] 
] 

現在,讓你的數據,地方在你的代碼,你可以做:

$data_service = $service_manager->get('user_container'); 
$additional_info = $data_service->getAdditionalInfo(); 

後來,當你需要移動存儲了會議,併爲一些像Redis,MySQL等其他存儲機制(當你開始擴展你的應用程序並且你不再有粘滯的會話和其他原因時,會發生這種事情),你會更容易處理事情。您可以編寫不同的適配器,並交換出由服務管理器提供的適配器。

+0

但我需要在會話中的信息,因爲用戶可以在我的應用程序中做更多的請求。我是否應該將AuthService注入到其他服務中以獲取存儲空間,然後使用'$ storage-> write()'函數?但在我的第一個測試中,此功能覆蓋存儲中的所有數據。或者AuthStorage真的不是在驗證後添加數據嗎? – realkru79

+0

如果您需要在會話中使用Zend \ Session \ Container,您可以簡單地實現上述的UserContainer,如果您需要在會話中「需要」這些信息(沒有,總是有其他選擇),那就好了。不,不要將AuthService添加到其他服務,請將UserContainer添加到其他服務。 UserContainer提供訪問權限並處理數據來自何處的細節(會話明智或其他)。 –