2016-10-10 87 views
0

我是ZF2的新手,我正在學習服務和ServiceManager。我想通過API(http://127.0.0.1/api/login)進行「身份驗證」,我需要同時與數據庫進行交互。登錄後我會從API獲得一些數據,另外還有一些數據,我會從數據庫中獲取一些其他數據。zf2 LoginServiceInterface與模型的交互

我有一個的LoginController誰具有帶有登錄方法

$測試= $這個 - > loginService->登錄($用戶名,密碼$);

我創建與另一個登錄方法登錄服務:

$ apiService =新ApiService(); $ userApi = $ apiService-> postRequest('login /',['email'=> $ username,'password'=> $ password]);}};}};}}};

對API的調用我把它放在另一個服務(ApiService)中。

第一個問題是我怎麼做才能不依賴於ApiService?我有一個服務取決於另一個 第二個問題是如何在此LoginService中將api數據與db數據混合?在Factory中注入模型並在服務中調用該模型是一種最佳實踐?在我的腦海中,流程應該是這樣的: LoginController - > LoginService - > API調用 - > LoginService - > DB - > LoginService - > LoginController - >視圖或其他。

我知道通過API登錄並不是一個最佳實踐,因爲我沒有在授權框架中這樣做,但目前很容易調用端點並獲得完整的json。

謝謝你的回答。

回答

0

您可以通過創建任意數量的實現新接口的服務來封裝登錄功能,可能是LoginServiceInterface。該接口將定義認證所需的實際方法,具體的類將實現它們。

界面可能看起來像這樣。

interface LoginServiceInteface 
{ 
    public function login($username, $password);  
} 

然後具體實現可以定義登錄方法。

class ApiLoginService implements LoginServiceInterface 
{ 
    protected $dbAdapter; 
    protected $apiService; 

    public function __construct(ApiServiceInterface $apiService, Adapter $dbAdapter) 
    { 
     $this->dbAdapter = $dbAdapter; 
     $this->apiService = $apiService; 
    } 

    public function login($username, $password) 
    { 
     // do some queries. 
     //$this->dbAdapter->query('')... 

     $response = $this->apiService->makeSomeCallToApi([$username, $password]); 

     if ($response) { 
      return true; 
     } 
     return false; 
    } 
} 

您還需要向服務管理器註冊該類,並創建一個服務工廠以注入依賴關係。