Magento2 開發 – 使用 Plugin 改變原生行為 (三)
好久不見的Magento2開發-使用Plugin改變原生行為系列又來啦!這次Plugin的使用來到尾聲囉!最後一個,也就是置入點放在最末的 after Plugin,其使用也是最簡單的,我們繼續以先前的範例往下看吧!
這次沿用第一回最單純的範例來覆寫:
未改寫前執行如下測試
$summaryAmount = \Magento\Framework\App\ObjectManager::getInstance()->get(“Magento\Example\Model\SummaryAmount");
echo “</br>[" . $summaryAmount->calculate(100, 700, 1) . “]";
會得到結果 100 * 700 * 1 = 70000
假設目前calculate˙結果是基礎金額,我們希望這個基礎金額滿一萬時打九折,因為不需要用到傳入參數($qty, $price, $rate),因此很適合使用只傳遞結果的after Plugin。
範例在套件Custom_ExampleF實現需求,照慣例,先定義覆寫的主客體
Custom/ExampleF/etc/di.xml
再來就是實作Plugin的覆寫行為,這次是在方法前加上after,而傳遞的參數,第一個依舊是被覆寫的物件,第二個則是承接的計算結果。
Custom\ExampleF\Plugin\Magento\Example\Model\SummaryAmount.php
再次執行測試,就會得到折扣後的金額
100 * 700 * 1 * 0.9 = 63000
接著是順序控制,跟前兩種一樣,di.xml裡的plugin sortOrder可以控制執行順序,假設另一個需求是當折扣後金額大於5萬,要加上20%內含税,那麼這個after plugin的順序就必須在example-f-discout-amount(sortOrder=99)之後,即100以上,概念上是很好理解的,在此,就不贅述實作細節。
到此,Plugin三種實作方式與細節差異都已完整呈現給大家,接下來有個小測試,諸位開發者不妨花點時間檢視是否融會貫通Plugin的運作流程。
名稱 | 方式 | sortOrder | Plugin程式 |
---|---|---|---|
A | before | 20 | $price = $price/2; return [$qty, $price, $rate]; |
B | around | 10 | $result = $proceed($qty, $price, $rate); return $result - 600; |
C | around | 30 | $qty = $qty + 30; return $proceed($qty, $price, $rate); |
D | after | 40 | return $result * 3 / 4; |
假設我們傳入參數
$qty = 10
$price = 100
$rate = 1.2
覆寫前是 $qty(10) * $price(100) * $rate(1.2) = 1200
那覆寫後的金額是多少呢?
先讓大家思考一下,下面還有些關於Plugin˙的使用提醒。
官網上雖然對Plugin˙範例說明較為簡略,但列出了Plugin的使用限制,像是private、protected、 static的方法無法被覆寫,性質特殊的方法例如final、 __construct也不在覆寫範圍。大家若實作時碰壁無效,可以到官網確認限制條件
https://devdocs.magento.com/guides/v2.4/extension-dev-guide/plugins.html
另外需要跟開發者補充說明,我們範例中所有的需求與實作,是為了讓諸位容易理解Plugin,所以使用最簡化的方式。而實務上,類似的需求會有其他更合適的方式實現,屆時還請謹慎評估實作途徑。
最後回來剛剛的測試,想好答案了嗎?
.
.
.
.
答案正是 1200
繞了一圈,覆寫後的答案一模一樣!懷疑這個結果的話不妨實作看看,那麼我們下回見囉!
如果有您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,您想知道什麼嗎?歡迎在下方留言給我們。或追蹤我們的粉絲專頁、IG及電子報,就不錯過最新文章喔!
想學習更多Magento設定嗎?請見:Magento教學導覽
我要留言