Magento2 plugin em torno de método diferente entre os parâmetros de chamada e fechamento em param $ continue

12

Eu verifiquei o magento2, existem dois tipos de parâmetros que podem ser enviados para

método around

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

Agora minha pergunta:

  1. O que é diferente entre fechamento e callable?
  2. Por que usar definimos o tipo dois tipos diferentes para o parâmetro $ continue?
  3. Para que servem esses parâmetros de dois tipos?

Alguém pode descrevê-lo detalhes

Amit Bera
fonte
11
Boa pergunta! Amit
Rakesh Jesadiya
alguém poderia explicá-lo novamente em termos simples? ele vai ser muito útil
aravind

Respostas:

9

Você tem uma resposta aqui: https://stackoverflow.com/a/29730810/4629261

A diferença é que um [ Closure] deve ser uma função anônima, onde [ callable] também pode ser uma função normal.

Você pode ver / testar isso com o exemplo abaixo e verá que receberá um erro no primeiro:

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!

Portanto, se você deseja apenas digitar dica, use a função anônima: Closuree se deseja também permitir funções normais, use callablecomo dica.

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

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

No documento do Magento, eles sugerem o uso de [callable]

Antes da lista dos argumentos do método original, os métodos around recebem uma chamada que permitirá uma chamada para o próximo método na cadeia. Quando a chamada é chamada, o próximo plugin ou a função observada é chamada.

Quando você quebra um método que aceita argumentos, seu plug-in também deve aceitar esses argumentos e encaminhá-los quando invocar a continuação que pode ser chamada.

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

Vinz
fonte
bom, então qual é a melhor maneira de usar o método para magento?
Amit Bera
11
I editado acima, Magento sugerem a utilização [exigível]
Vinz