文章彙整

Magento2 開發 – 使用 Plugin 改變原生行為 (三)

Astral WebBy Astral Web 8 months agoNo Comments
首頁  /  Magento  /  Magento-2  /  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的運作流程。

名稱方式sortOrderPlugin程式
Abefore20$price = $price/2;

return [$qty, $price, $rate];
Baround10$result = $proceed($qty, $price, $rate);

return $result - 600;
Caround30$qty = $qty + 30;

return $proceed($qty, $price, $rate);
Dafter40return $result * 3 / 4;

假設我們傳入參數

$qty = 10

$price = 100

$rate = 1.2

覆寫前是 $qty(10) * $price(100) * $rate(1.2) = 1200

那覆寫後的金額是多少呢?

 

先讓大家思考一下,下面還有些關於Plugin˙的使用提醒。

官網上雖然對Plugin˙範例說明較為簡略,但列出了Plugin的使用限制,像是privateprotected static的方法無法被覆寫,性質特殊的方法例如final __construct也不在覆寫範圍。大家若實作時碰壁無效,可以到官網確認限制條件

https://devdocs.magento.com/guides/v2.4/extension-dev-guide/plugins.html

 

另外需要跟開發者補充說明,我們範例中所有的需求與實作,是為了讓諸位容易理解Plugin,所以使用最簡化的方式。而實務上,類似的需求會有其他更合適的方式實現,屆時還請謹慎評估實作途徑。

最後回來剛剛的測試,想好答案了嗎?

.

.

.

.

 

答案正是 1200

繞了一圈,覆寫後的答案一模一樣!懷疑這個結果的話不妨實作看看,那麼我們下回見囉!

 

如果有您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,您想知道什麼嗎?歡迎在下方留言給我們。或追蹤我們的粉絲專頁IG電子報,就不錯過最新文章喔!

想學習更多Magento設定嗎?請見:Magento教學導覽

 000

推薦文章

Categories:
  Magento-2MagentoMagento開發

留下回應

你的電子郵件地址不會被公開.