Magento中的Plugin机制-拦截器

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

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

Plugin机制说明

插件或拦截器是一个类,它通过截取函数调用并在该函数调用之前、之后或周围运行代码来修改公共类函数的行为。这允许您为任何类或接口替换或扩展原始公共方法的行为。

希望拦截和更改公共方法行为的扩展可以创建插件类。

这种拦截方法减少了更改同一类或方法行为的扩展之间的冲突。插件类实现会更改类函数的行为,但不会更改类本身。Magento根据配置的排序顺序顺序调用这些拦截器,因此它们不会相互冲突。


拦截器通常只对public的类进行修改。
我们可以把拦截器当成一个观察者,被修改的对象当作被观察者。


Plugin声明方式:
在自定义的module的di.xml中声明一个Plugin类

<config>
    <type name="{ObservedType}">
      <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="false" />
    </type>
</config>

代码说明:

  • type name. Plugin类要观察的class 或者interface
  • plugin name 给Plugin类起的名字
  • plugin type 实际的Plugin类
  • sortOrder(可选) 调用相同方法的插件使用以下顺序运行它们。
  • disabled(可选,默认为false) 设置为true则禁用Plugin

插件类的写法 Before methods

Magento在调用观察到的方法之前运行所有before方法。这些方法必须与观察到的方法同名,前缀为“before”。

您可以使用before方法通过返回修改的参数来更改观察到的方法的参数。如果有任何参数,该方法应返回这些参数的数组。如果该方法未更改所观察方法的参数,则应返回空值。
Before代码示例:

<?php
namespace My\Module\Plugin;

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

插件类的写法 After methods

After方法不需要声明其观察到的方法的所有参数,方法使用的参数和观察到的方法中位于这些使用的参数之前的任何参数除外。
After代码示例 :
下面的示例为updateWebsite添加after方法
\Magento\Catalog\Model\Product\Action::updateWebsites($productIds, $websiteIds, $type):

class WebsitesLogger
{
    private $logger;

    public function __construct(\Psr\Log\LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function afterUpdateWebsites(\Magento\Catalog\Model\Product\Action $subject, $result, $productIds, $websiteIds)
    {
        $this->logger->log('Updated websites: ' . implode(', ',  $websiteIds));
    }
}

原方法有$productIds, $websiteIds, $type三个参数
在after方法中不必列出所有参数,但是如果你要使用原方法的第二个参数$websiteIds,则必须把它之前的参数$productIds也列出来。

如无特殊说明或标注,任何个人或组织,复制、转载、采集本站内容请注明:
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。