2012-11-26 45 views
1

假設您的軟件包使用某種RESTful服務,並且可以與兩個不同的PHP HTTP客戶端一起使用:guzzle/guzzle以及kriswallsmith/Buzz。因爲它使用適配器和接口。如何製作具有可選依賴項的Symfony 2包?

如何將此依賴項定義爲可選項?你會做這樣的事情,例如在編譯器通行證?

if(!is_file('/path/to/guzzle') && !is_file('/path/to/buzz')) { 
    throw new \RuntimeException('You need to install guzzle or Buzz browser.'); 
} 

這是爲包定義可選依賴項的正確方法嗎?

回答

2

首先,你不會這樣做,主要是因爲檢查文件是否存在於某個路徑不起作用。如果用戶將它們安裝在其他地方(無論出於何種原因),並設法使命名空間正確?

我的第一個問題將是爲什麼你想讓用戶選擇。有什麼區別嗎?用戶是否能夠決定使用哪個客戶端。例如,當我使用資產時,我當然必須決定要使用哪些過濾器,因爲它們對發生的事情有很大的影響(例如,如果我有scss文件,較少的過濾器是無用的)。

還有其他問題,如用戶必須親自管理依賴關係。有時這是值得的,有時不是。

現在,如果您決定希望用戶選擇,我會去配置選項,其中用戶傳遞字符串guzzle或字符串buzz。也許有一個默認值。

在您的包中,您嘗試根據此配置創建對象。你可以用一個try catch塊來包圍它以捕獲缺失的依賴關係,或者查看某個類是否可用。如上所述,您不會測試某個文件的存在,而是使用php函數class_exists來測試某個類。你的考試應該放在你真正想要使用的課堂上。

+1

我想強調這種選擇的有用性質疑。沒有HTTP客戶端,你的模塊可能無法工作,所以這兩種依賴關係都不是真正的可選項。您至少需要解析一個依賴項。 – Sven

+0

謝謝。正如@Sven所建議的那樣,該包至少需要一個依賴項。如果你在這方面考慮得更好,爲什麼你會強迫用戶安裝 - 比如說大嘴 - 如果他已經發出嗡嗡聲並且該包可以與後者一起工作?無論如何,我會去配置的方式,傳遞服務(瀏覽器),並與instanceof運營商檢查它。 – gremo

+0

你的庫顯然不支持我選擇的HTTP客戶端,所以我必須安裝你的任何一個依賴項。哪一個應該是,爲什麼?我不會擴展您的圖書館來使用我的圖書館,我也不會進入研究模式,以瞭解您建議的哪些客戶更好。我甚至不會爲你的圖書館爲什麼比另一個客戶更喜歡一個客戶的細節而煩惱。但是我仍然可以選擇製作,但它並不適用於開箱即用。底線:我質疑用戶選擇的有用性,但討論它意味着討論你的圖書館設計決策。 – Sven