插件(拦截器)
概述
一个插件,或拦截器,是一个类,它通过截取函数调用和在函数调用之前、之后或之后运行代码来修改公共类函数的行为。
局限性
拦截器不能用于下列任何一个:
-
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(观察者)