Magento2插件在方法$ proceed上的可调用参数和闭包参数之间的方法不同


12

我检查了magento2,有两种类型的参数可以发送到

周围方法

  • \Closure $proceedaroundSave(\Magento\Catalog\Model\Product $subject, \callable $proceed)
  • \callable $proceedaroundSave(\Magento\Catalog\Model\Product $subject, \Closure $proceed)

现在我的问题是:

  1. 关闭和可调用之间有什么区别?
  2. 为什么要使用$ proceed参数定义两个不同类型的类型?
  3. 这两种类型的参数有什么用?

任何可以描述它的细节吗


1
好问题!阿米特
拉克什·耶萨迪亚

有人可以再简单地解释一下吗?这将非常有帮助
aravind

Answers:


9

您在这里有一个答案:https : //stackoverflow.com/a/29730810/4629261

区别在于,[ Closure]必须是匿名函数,其中[ callable]也可以是普通函数。

您可以使用下面的示例查看/测试它,您将看到第一个错误:

function callFunc1(Closure $closure) {
    $closure();
}

function callFunc2(Callable $callback) {
    $callback();
}

function xy() {
    echo 'Hello, World!';
}

callFunc1("xy"); // Catchable fatal error: Argument 1 passed to callFunc1() must be an instance of Closure, string given
callFunc2("xy"); // Hello, World!

因此,如果您只想键入提示匿名函数,请使用:Closure并且如果您还希望允许普通函数callable用作类型提示。

http://php.net/manual/zh/class.closure.php

http://php.net/manual/en/language.types.callable.php

在Magento文档中,他们建议使用[callable]

在原始方法的参数列表之前,周围的方法会收到一个可调用的对象,该对象将允许调用链中的下一个方法。调用callable时,将调用下一个插件或观察到的函数。

当包装一个接受参数的方法时,您的插件也必须接受这些参数,并且在调用proced可调用时必须转发它们。

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html#defining-a-plugin


好,那么在围绕方法进行magento的最佳用途是什么?
阿米特·贝拉

1
我在上面编辑过,Magento建议使用[callable]
Vinz,2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.