Magento 2的插件主要作用:在Magento 1中,为了自定义不同的类和方法,你可以重写一个类。 这是一个非常强大和灵活的定制平台的方式。 这也造成了麻烦,因为两个模块不可以重写同一个类, 重写冲突造成了Magento 1平台的不稳定。 Magento 2创建了一个新的自定义方法来解决这个问题。 它被称为插件。一个插件就是一个定制,允许用户在Magento 2中的类之前(before),之后(after)或全程(around)调用方法,并且插件之间可以有重合,这意味着多个模块可以在Magento 2中为同一个方法创建插件而不会引起冲突。
步骤一:按常规方法创建模组用于添加插件(或者在原有的模组里添加插件)
在app/code/<module dir>/etc的 di.xml 里添加以下代码:
1 <type name="MagentoQuoteModelQuote"> <!-- 要重写的目标类 --> 2 <plugin 3 disabled="false" <!-- 决定是否启用插件 --> 4 name="Bcn_Quote_Model_Plugin_Quote" <!-- 插件名字 --> 5 sortOrder="1" <!-- 插件执行排序,因为可能有好几个插件都重写了同一个方法,这有助于解决插件之间的冲突 --> 6 type="BcnQuoteModelPluginQuote"/> <!-- 本插件类 --> 7 </type>
步骤二:创建插件类
注意:插件类不需要继承目标类的父类和构造方法,但是目标方法的参数要继承。实例代码如下:
1 <?php 2 3 namespace BcnQuoteModelPlugin; 4 5 class Quote 6 { 7 /** 8 * @param MagentoQuoteModelQuote $subject 9 * @param Closure $proceed 10 * @param bool $multishipping 11 * @return bool|mixed 12 */ 13 public function aroundValidateMinimumAmount( 14 MagentoQuoteModelQuote $subject, /* 实例化要重写的目标类 */ 15 Closure $proceed, /* 用around方法时要用的钩子,很重要 */ 16 $multishipping = false /* 目标方法的参数 */ 17 ) 18 { 19 $quote = $subject; 20 $items = $quote->getItemsCollection(); 21 foreach($items as $item){ 22 /* dosomething */26 } 27 return $proceed($multishipping); /* 执行完插件的代码后,返回,继续执行目标类的部分 */ 28 } 29 30 } after和before方法的创建跟上面around方法类似,所不同的是 Closure $proceed 钩子不用添加。 写这篇随笔是为了给自己记个笔记,刚学magento一个月,对很多知识理解还不深,如有错漏,欢迎网友批评指正!