> Magento2中文手册 > 插件(拦截器)

插件(拦截器)

概述

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

局限性

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

  • 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);
    }
}
  • 依赖注入
  • Events(事件)和observers(观察者)
上一篇:
下一篇: