magento2的插件(拦截器)使用介绍

7天成为Magento系统架构师,现在开始学习Magento全栈开发!

《Magento2.X企业级开发实战》

什么是插件,插件的功能

一个插件,或拦截器,是一个类,它通过截取函数调用和在函数调用之前、之后或之后运行代码来修改公共类函数的行为。

插件的局限性

拦截器不能用于下列任何一个:

  • Magento\Framework\Interception 引导对象实例化之前
  • Final methods
  • Final classes
  • 至少包含一个最终公开方法的任何类
  • Non-public methods
  • Static methods
  • __construct
  • 虚拟类型

声明一个拦截器

拦截器类必须声明在 di.xml 文件在你的模块中:

您必须指定这些元素:

  • type name. 一个拦截器观察者类或接口
  • plugin name. 拦截器名称
  • plugin type. 拦截器类型,指定此元素时使用下列命名约定: \Vendor\Module\Plugin\<ModelName>Plugin.

示例代码:

<?PHP

namespace My\Module\Plugin;

class ProductPlugin
{
    public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name)
    {
        return ['(' . $name . ')'];
    }
}
?>

函数之后拦截示例代码:

<?php

namespace My\Module\Plugin;

class ProductPlugin
{
    public function afterGetName(\Magento\Catalog\Model\Product $subject, $result)
    {
        return '|' . $result . '|';
    }
}
?>

Around methods示例代码

<?php

namespace My\Module\Plugin;

class ProductPlugin
{
    public function aroundSave(\Magento\Catalog\Model\Product $subject, callable $proceed)
    {
        $this->doSmthBeforeProductIsSaved();
        $returnValue = $proceed();
        if ($returnValue) {
            $this->postProductToFacebook();
        }
        return $returnValue;
    }
}
?>
<?php

namespace My\Module\Model;

class MyUtility
{
    public function save(SomeType $obj = null)
    {
        //do something
    }
}
<?php

namespace My\Module\Plugin;

class MyUtilityPlugin
{
    public function aroundSave(\My\Module\Model\MyUtility $subject, callable $proceed, SomeType $obj)
    {
      //do something
    }
}
<?php

namespace My\Module\Plugin;

class MyUtilityPlugin
{
    public function aroundSave(\My\Module\Model\MyUtility $subject, callable $proceed, ...$args)
    {
      //do something
      $proceed(...$args);
    }
}
如无特殊说明或标注,任何个人或组织,复制、转载、采集本站内容请注明:
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。