Magento2 開發 – 使用 Plugin 改變原生行為 (一)
Magento 提供多種覆寫方法便於開發者進行客製,今天我們要介紹的方式- Plugin,是屬於較小範圍的改寫。
這種覆寫方式,會針對某個特定的類別,改變其所屬方法(method)的實際行為,而置入客製程式的方式,則依置入點細分三種: 方法之前(before),與方法當中(around) ,方法之後(after)。每種方式概念相仿,細節有異,今天要實際帶大家先了解的是 before Plugin的實作。
我們知道一個function會有輸入參數跟輸出值,before就是針對輸入的的參數去包覆客製行為,也就是說,可以在參數傳遞進方法被執行前,對其值進行調整。
舉例來說,假設有個用來計算金額的類別
現在有一個套件 ExampleA,需要針對這個計算金額中的價格參數(price)固定增加10,由於其他所有使用這個了類別計算的地方,都必須套用這個客製,比起去改寫所有使用到這個類別的程式區塊,直接用 before 的 Plugin覆寫它會更為有效率且避免程式碼的重複。
首先,我們需要在該套件 Custom/ExampleA/etc/di.xml 裡定義覆寫的主客體。這裡我們使用類別 Custom\ExampleA\Plugin\Magento\Example\Model\SummaryAmount 去複寫 Magento\ExampleA\Model\SummaryAmount
接著實作覆寫類別
在該類別中,實作要覆寫的那個方法,並在方法名稱加上before前綴,注意需用駝峰式大小寫。
該方法的第一個參數固定為原類別的物件,第二個開始依序為原方法的傳入參數值。
而方法的輸出是以一維陣列形式,依序放入調整後的參數值。
完成後執行測試
$summaryAmount = \Magento\Framework\App\ObjectManager::getInstance()->get(‘Magento\Example\Model\SummaryAmount’)
echo ‘</br>[’ . $summaryAmount->calculate(2, 20, 1) .’]’;
就會得到 2 * (20 + 10) * 1 = 60
[60]
不過實務上並不會這麼單純,假設又有另一個套件ExampleB想要調整這個計算參數,希望價格參數乘上兩倍,這時就有順序問題。這裡我們期望在ExampleA加10前先由ExampleB乘二。
這個順序可以在Custom/ExampleB/etc/di.xml裡指定排在ExampleA前,將sortOrder數值設為5,小於ExampleA Plugin的10。
實作覆寫類別
再次執行測試
這回得到就是ExampleA與ExampleB的客製結果囉!
2 * (20 * 2[ExampleB] + 10[ExampleA]) * 1 = 100
[100]
依照以上實作規則,就可以讓多個套件依照其客製性質,去調整原生或者第三方套件所屬類別下的方法參數。下回我們會繼續手把手,帶大家實作around的Plugin,覺得官方文件簡潔不易理解的開發者,千萬不要錯過我們的分享喔!
如果您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,您想知道什麼嗎?歡迎在下方留言給我們。或追蹤我們的粉絲專頁及ig,也別忘了訂閱我們的電子報,就不錯過最新文章喔!
想學習更多Magento設定嗎?請見:Magento教學導覽
我要留言