2016-03-27 70 views
1

我們的項目有一些數據存儲在一個$_SESSION['app']。有一個「主」對象包含大約10個可以在代碼中使用的其他對象的公共實例。實際上,其中只有一個是經常使用的($_SESSION['app']->login->getuserId()),其中兩個總共只用了4-5次。

由於我們已經創建了一個RESTful API,除了我們的項目外,我們還想在API中使用我們的一些項目功能,因此需要擺脫幾乎所有對象中的許多方法中使用的會話,從長遠來看,我們希望完全切換到Client和Server之間的RESTful通信。

由於我們是一個小團隊,我們不能一次重構所有代碼,但需要一步一步完成,而不會在此期間破壞代碼。

我第一次嘗試正在改變會話對象到一個單是這樣的:

class Main { 

    private static $main = null; 

    public static function getInstance() { 
    self::$main = $_SESSION['app'] ?? self::$main ?? new Main(); 
    return self::$main; 
    } 

    public function __construct { 
    // ... 
    } 
} 

這樣一段時間,我們可以離開的$ _SESSION [「應用」],因爲它是和後來的實例在一小步工作中完全刪除會話。我的嘗試迄今還行,但它只改變了我們對Main類的概念性問題。

另外我讀過使用單例模式在大多數情況下是一個壞主意,並理解該觀點的論據。在我們的項目中,我們還沒有使用單元測試,但我希望至少能夠很快使用它。

那麼會是什麼一個更好,更可靠的方式來擺脫我們$_SESSION -variable和的方式,它可以從任何地方訪問處理類似的userID數據,以便最終我們可以有一個RESTful認證而不是一個會話?

+0

難道你只是繼續按原樣使用它 - 但不是從會話中填充數組,而是從經過身份驗證的用戶(即使用jwt)中獲取所需的任何內容( – JimL

回答

1

這是這樣的,我怎麼看到:

如果我們想象第二,你必須與REST的API你的夢想的系統,那麼很可能客戶端和服務器將依託「之間的通信access_token「解決方案,意味着將有一個或多個類將授權用戶並檢查用戶權限。

這種解決方案在引導過程中會以某種方式使用,但應該優選地被隔離和解耦,從而通過依賴注入範例來實現。這會給你開箱即用一個替換一個實現的能力(真棒單元測試獎金,呃!)

然而,第一個實現可以完全建立在當前會話之上。爲了簡單起見,您可以從「普通」開始,用Di::getDefault()->getSession()->get('app')替代$_SESSION['app'],或者可以使用Di::getDefault()->getAuthorizedUser()->getApp(),然後在其上增加功能。

+0

)我還沒完全理解「依賴注入」 。除此之外還有什麼比它更多的:「每個類都應該通過參數訪問它們的依賴關係,並且每個依賴關係都應該通過一個接口來訪問。」 ? – Tekay37