如何覆蓋 magento 2 原生的程式
專案開發中難免會遇到需要改寫原生程式的狀況,但考量到減少程式相依性,我們不會直接去修改 magento 程式,而是用我們的 extension 覆蓋 magento 程式,以下分享幾個覆蓋的方法:
假設我們要更改的程式路徑為 /vendor/magento/module-catalog/Block/Product/View.php ,其 namespace 為Magento\Catalog\Block\Product,在我們的 extension 內加入 di.xml 檔,檔案路徑 AstralWeb/ExtensionName/etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Catalog\Block\Product\View" type="AstralWeb\ExtensionName\PluginName\Test" /> </config>
這樣的設定是指 將自訂的 Test class 完全取代 View class,只需將 View.php 的內容複製到 Test.php 並修改 namespace 與 class name 即可使用,這是相當簡當的作法,但實際上常常會遇到只需要覆蓋 View.php 內的一個 function,若將整個 class 覆蓋未免有些多餘,此時將 di.xml 檔修改如下:AstralWeb/ExtensionName/etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Catalog\Block\Product\View"> <plugin name="exit_data" type="AstralWeb\ExtensionName\PluginName\Test" /> </type> </config>
Test.php 的內容
namespace AstralWeb\CategoryContentImageUrlIssue\Plugin; use Magento\Catalog\Block\Product\View; class Test extends View { public function beforeGetProduct(View $subject) { echo 'call plugin function beforeGetProduct()<br/>'; } public function afterGetProduct(View $subject,$result) { echo 'call plugin function afterGetProduct()<br/>'; return $result; } public function aroundGetProduct(View $subject , \Closure $closure) { echo 'call plugin function aroundGetProduct()<br/>'; return $closure(); } }
覆蓋後的結果會在商品頁看到,可以看到執行順序是 beforeGetProduct() -> aroundGetProduct() -> afterGetProduct(),其中 aroundGetProduct 會將 getProduct 內容覆蓋,以上可以看出命名規則的規律性。
以上就是這次關於如何覆蓋Magento 2 原生程式的分享,更多電商知識,別忘訂閱歐斯瑞電子報,以及追蹤我們的粉絲專頁喔!
更多Magento相關文章請看: Magento教學導覽
我要留言