2015-09-07 25 views
1

我的任務是開發一個網站(PHP),其中大部分內容來源於私有Web API(JSON)。這是一個陡峭的學習曲線,我在應用設計方面,但到目前爲止,我有:如何在使用靜態方法時使用資源的特定實例(PHP)

  1. 創建一個PHP SDK /包裝庫爲我提供了獲取和保存數據,並從API方法。我已經看過一些例子,例如Google Client SDK的靈感。它在內部使用GuzzleHttp來完成繁重的工作。

  2. 爲我希望從API獲得的每個數據響應創建一個模型類。現在我可以使用具有可預測和預定義變量的實際類模型。

  3. 使用優秀的JSONMapper包將我的API JSON響應遞歸映射到模型實例中。

現在來回答這個問題。

我認爲這將是一個好主意,提供每個模型的方法,如:

$user->save()

這將使用模型中提供的API SDK實例保存實例化對象的數據。應用程序不需要關心數據存儲的位置,或者如何使用API​​。都好。

因此,我還以爲這是個好主意,該物體應該能夠獲取自己(像Laravel怎麼做,以其富:: find()方法的圖案),所以我創建靜態方法,例如:

$user = User::get_by_id(1);

問題是,由於這是一個靜態方法,我沒有從User模型中訪問我的API SDK的特定實例的方法。我無法輕鬆注入該依賴項,而無需在每個函數調用中傳遞它。

「用戶」,在這個例子擴展「模式」,因此,我用:

Model::$api = new Api;

這是偉大的了,但如果因爲任何原因,我需要用我的API的特定實例在某些型號的SDK上,我將無法使用。

如何在我的對象上仍然提供這些靜態方法的同時使用我的API SDK的特定實例,或者我吠叫錯誤的樹並且這是一種反模式,而應該使用其他某種機制用於創建和提取對象?

我目前正在通過「PHP,對象模式和實踐」,因爲我正在努力與這個東西。

在此先感謝

+0

您所描述的問題是Active Record模式中的一個主要問題。模型類與他們的數據訪問對象緊密耦合,在您的情況下是API客戶端。 –

回答

0

你應該從對象單獨的對象存儲庫。對於用戶,您可以創建:

class UserRepository { 
    public __construct($api) 
    public findById($id); 
    public find(Criteria $criteria); 
    public save (User $user); 
} 

您還可以閱讀有關命令查詢分離的信息。

相關問題