Magento 2.1.X 插件(Plugin)的创建

  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一个月,对很多知识理解还不深,如有错漏,欢迎网友批评指正!
复制代码


上一篇:Magento2.2 设置产品属性出现“The value of Admin scope can't be empty.”错误 下一篇:如何覆盖Magento2中的.phtml文件
  • 版权声明:内容来自互联网不代表本站观点,2018-05-14发表于 magento教程栏目。
  • 转载请注明: Magento 2.1.X 插件(Plugin)的创建| magento教程 +复制链接