2015-11-03 49 views
0

我正在致力於UserSession服務,代碼如下。isset檢查應該在依賴會話有效的服務中完成嗎?

我的問題是,是否有任何需要在get_id方法內執行isset測試,還是應該由調用代碼(在我的情況下是控制器)來確保會話是活動的?

如果沒有設置會話,失敗會導致註銷,但我不禁想到,檢查用戶會話的有效性不應該在此服務中完成,因爲使用無論如何,這項服務需要有效的用戶會話。

我最終不得不在每次吸氣時都這樣做。

<?php 

namespace \App\Services; 

class UserSession { 

    private $session; 

    public function __construct() 
    { 
     $this->session = (object) $_SESSION; 
    } 

    public function get_id() 
    { 
     if(!isset($this->session->user->id)) 
      return false; 

     return $this->session->user->id; 
    } 
} 

有什麼建議嗎?

我想也許是一種方法is_valid(),返回truefalse也許是需要的。這樣,在調用任何獲取器之前,可以檢查會話的使用。

+0

我沒有看到任何問題。把它放在get_id()中比在誰知道有多少地方更好。許多PHP方法在失敗時返回* something *或false。這並不罕見。以''curl_exec'](http://php.net/manual/en/function.curl-exec.php)爲例,設置'CURLOPT_RETURNTRANSFER'作爲選項。它將返回一個字符串(成功時),如果失敗則返回false。 – Andrew

+0

在我看來,複查總是比較好。但是,如果沒有設置「$ this-> session-> user-> id」,則無法以任何方式調用此腳本。那麼,這是沒有必要的。 –

回答

0

首先,你不應該避免混合返回類型。大多數時候最好的做法是返回預期的結果/類型或拋出異常。

其次,你應該儘快失敗。這意味着,只要你知道你需要一個UserSession繼續,你應該檢查它是否存在。您要麼在類構造函數中,要麼甚至在嘗試實例化UserSession對象之前,例如由工廠或建造模式。

該類雖然可以將超全局的內容注入到UserSession中,以刪除類依賴關係並使其更容易測試。

+0

這就是我最終做的。注入'$ _SESSION'也很好。 – BugHunterUK

0

如果您有50個方法檢查有效會話只發生一次,而其他方法不需要重複代碼,則應該以這種方式在__construct中添加用戶會話檢查。

是的,在嘗試使用它之前,請務必檢查用戶會話是否存在(您永遠不知道會發生什麼導致空用戶會話)。

+0

我很努力地想知道在實例化時我將如何處理錯誤(我使用'Pimple')。如果在施工中失敗,我無法真正處理容器內的錯誤。我可以更精確地在控制器級別處理它,因爲我可能需要記錄導致錯誤的請求,因爲在應用程序中不可能永遠不會設置UserSession。 – BugHunterUK

+0

@BugHunterUK只要條件不滿足,就會拋出錯誤。 – Justinas