Magento2 觀察者模式 之 插件

 

  1. etc/di.xml 定義以下:
      <type name="Magento\Quote\Model\Quote\Item\ToOrderItem">
            <plugin name="McSize_to_order_item" type="Mc\Size\Model\Plugin\Quote\McSizeToOrderItem" sortOrder="1" disabled="false"/>
        </type>
    

     

    • type name:輸入須要遵循的類或接口的名稱。
    • plugin name:標識插件的任意插件名稱。還用於合併插件的配置。
    • plugin type:填寫插件類或其虛擬類型的名稱。您能夠爲此字段引用如下命名約定:\Vendor\Module\Plugin\<ModelName>Plugin
      
  2. 插件中的3種方法:

    • before - before【 Dispatch Class Method Name 】() 在方法之前執行的方法;
    • around - around【 Dispatch Class Method Name 】() 在方法運行時;
    • after - after【 Dispatch Class Method Name 】()   在方法運行後執行方法;


  3. 以下實例,將自定義購物車字段 quote_item 表數據,保存到 sales_order_item 的自定義字段; 
    <?php
    /**
     * Created by .
     * User: jerryxu
     * Date: 2019/5/5
     * Time: 3:48 PM
     */
    
    namespace Mc\Size\Model\Plugin\Quote;
    
    
    use Mc\Size\Traits\Common;
    
    /**
     * Fixme Plugin Quote_Item_Custom_Field To Sales_Order_Item_Custom_Field
     * Class McSizeToOrderItem
     * @package Mc\Size\Model\Plugin\Quote
     */
    class McSizeToOrderItem
    {
    
        /**
         *
         */
        use Common;
    
        /** Fixme texting Debug
         * @var int
         * @return 0/1
         */
        private $log = 1;
    
        /**Fixme Overrde Method
         * @param \Magento\Quote\Model\Quote\Item\ToOrderItem $subject
         * @param \Closure $proceed
         * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
         * @param array $additional
         * @return Item
         */
        public function aroundConvert(
            \Magento\Quote\Model\Quote\Item\ToOrderItem $subject,
            \Closure $proceed,
            \Magento\Quote\Model\Quote\Item\AbstractItem $item,
            $additional = []
        ) {
            /** @var $orderItem Item */
            $orderItem = $proceed($item, $additional);
            $orderItem->setSizeId($item->getSizeId());//Fixme Quote Item Custom Size_id To Sales Order Item Custom Size_id
            $orderItem->setSizeType($item->setSizeType());//Fixme Quote Item Custom Size_type To Sales Order Item Custom Size_type
            return $orderItem;
        }
    
        /** Fixme texting Debug
         * @param \Magento\Quote\Model\Quote\Item\ToOrderItem $subject
         * @param $data
         * @return array
         */
        public function beforeConvert(\Magento\Quote\Model\Quote\Item\ToOrderItem $subject, $data)
        {
            /**
             * @var \Mc\Size\Helper\Data $helper
             */
            if($this->log){
                $helper = $this->mc_get_obj('Mc\Size\Helper\Data');
                $helper->logger(__(__METHOD__));
            }
    
        }
    }
    

     

參考1  參考2 php

相關文章
相關標籤/搜索