パラメータ$ proceedの呼び出し可能パラメータとクロージャパラメータの間でメソッドが異なるMagento2プラグイン


12

私はmagento2をチェックしました、送信できるパラメータには2つのタイプがあります

アラウンドメソッド

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

今私の質問:

  1. 閉鎖と呼び出し可能の違いは何ですか?
  2. $ proceedパラメーターにタイプ2の異なるタイプを定義するのはなぜですか?
  3. この2つのタイプのパラメーターの用途は何ですか?

詳細を説明できますか


1
いい質問だ!アミット
Rakesh Jesadiya 2017年

簡単な言葉でもう一度説明できますか?それは非常に役立つでしょう
アラビンド

回答:


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/en/class.closure.php

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

Magentoのドキュメントでは、[callable]の使用を提案しています

元のメソッドの引数のリストの前に、aroundメソッドは、チェーン内の次のメソッドの呼び出しを可能にするcallableを受け取ります。呼び出し可能オブジェクトが呼び出されると、次のプラグインまたは監視対象の関数が呼び出されます。

引数を受け入れるメソッドをラップする場合、プラグインはそれらの引数も受け入れる必要があり、proceed呼び出し可能オブジェクトを呼び出すときにそれらを転送する必要があります。

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


良い、それでマゼントの周りのメソッドで何を使うのがベストですか?
アミットベラ

1
私は上記の編集し、Magentoのは、使用することをお勧め[呼び出し可能]
Vinz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.