2010-09-16 40 views
3

當創建Magento擴展以避免與加載到商店的其他擴展衝突時,最佳做法是什麼?我知道如何使用重寫方法,觀察者方法以及如何做這種首選方法的細節進行編碼。這仍然不會阻止你與其他模塊衝突並升級。Magento:避免擴展衝突的最佳方法

Alan Storm,如果你閱讀了這篇文章,我也讀過你最近關於覆蓋和可升級性的文章。這也是考慮這種情況的最佳方式嗎?我還看到人們創建的擴展和文章允許多個類擴展相同的類。

回答

11

避免此問題的最佳方法是儘可能使用內置於Magento中的Observer模式。這還不夠,但是當你有選擇的時候,使用它可以讓你在其他表現不好的情況下也能很好地發揮作用。

接下來,嘗試覆蓋最小數量的類。這聽起來很明顯,但有些時候我認爲有必要重寫每一個航運計算器類(代碼很簡單,但需要重複)。通過一些更多的工作,我可以重寫一個類並保存自己的一些維護頭痛來啓動。

當你這樣做的時候,你可能會遇到與其他擴展衝突的問題,覆蓋你所在的相同類。不幸的是,這在Magento中並不是一個解決的問題,除了聯繫有問題的人並解決問題之外,沒有一種好的解決方法。

最後,針對可升級性問題,我在人們的代碼中看到的一個常見問題是,他們在沒有想到的情況下會覆蓋整個函數,而不是必要的。所以你得到這個:

function doSomethingUseful() { 
    // ...100 lines of parent code... 
    unset($result['badKey']); 
    // ...100 lines of parent code... 

    return $result; 
} 

當你去升級一個站點時,那200多行代碼可能會導致一個bug。艱難時期!取而代之的是,這樣的事情經常工作(和是一個簡單的改進):

function doSomethingUseful() { 
    $result = parent::doSomethingUseful(); 
    unset($result['badKey']); 
    return $result; 
} 

它的速度更快,這是更具可讀性,這是不容易出錯,每個人都是贏家!

希望有幫助!

謝謝, 喬

+0

我不能upvote這個答案夠了。觀察者模式岩石(迄今爲止最強大和最靈活的模式)和'parent ::'可悲的是未被充分利用。偉大的建議,應該在Magento wiki的首頁。 不幸的是,有時Mage核心不允許使用parent ::,因爲有些命令不會將控制權返回給調用對象,但這些都很少見。 – 2010-09-17 00:44:08

+0

非常感謝約瑟夫,我使用觀察者模式,但正如你所說的很多次我沒有使用的事件,似乎很奇怪,因爲有這麼多。你強化了我已經遵循的內容,我相信人們會發現這篇文章非常有用。 – 2010-09-17 01:57:20

+1

不要忘記通用的' _save_before',' _save_after',' _load_after','controller_action_predispatch'等。您可以觀察和過濾以查找更具體的事件(如果需要)。這些填補了很多似乎缺少事件的空白。 – 2010-09-17 13:32:02