Magento 2 Após plugin com parâmetro

8

Estou tentando implementar após o plug-in para o seguinte método.

public function getCategoryUrl($category)
{
    if ($category instanceof ModelCategory) {
        return $category->getUrl();
    }
    return $this->_categoryFactory->create()->setData($category->getData())->getUrl();
}

Observe o $categoryparâmetro passado para o método acima.

Como resolução, eu implementei o código abaixo.

public function afterGetCategoryUrl(\Magento\Catalog\Helper\Category $subject, $result)
{
    return $result;
} 

Agora, minha pergunta é: Como obtenho o $categoryparâmetro passado no método pai para meu plug-in? Eu só quero modificar o resultado com base no valor determinado no $categoryobjeto.

Codrain Technolabs Pvt Ltd
fonte

Respostas:

13

Se você precisar de parâmetros de entrada e também alterar a saída, use um plug - in around , não um plug-in posterior :

public function aroundGetCategoryUrl(
    \Magento\Catalog\Helper\Category $subject,
    \Closure $proceed,
    $category
) {
   ...
   // Do your stuffs here, now you have $category
   // If you need you can call the original method with:
   // $proceed($category);
   ...
   return $something;
} 

No seu caso, poderia ser algo como isto:

public function aroundGetCategoryUrl(
    \Magento\Catalog\Helper\Category $subject,
    \Closure $proceed,
    $category
) {
   $originalResult = $proceed($category);

   if (...) {
      ...
      return $otherResult;
   }

   return $originalResult;
} 

Apenas uma nota:

Observe que, se você deseja alterar um comportamento interno, uma preferência pode ser uma opção melhor que um plug - in . Depende do que você vai fazer.

Phoenix128_RiccardoT
fonte
Eu só quero modificar o resultado.
Codrain Technolabs Pvt Ltd
Veja minha postagem atualizada.
Phoenix128_RiccardoT
Sim, que (AroundPlugin) funciona, mas seria ótimo se conseguirmos isso usando (AfterPlugin).
Codrain Technolabs Pvt Ltd
Não há como os plugins "depois", uma vez que não se destina a funcionar dessa maneira, o que você precisa só pode ser feito com os plugins "around".
Phoenix128_RiccardoT
Obrigado pela sua resposta rápida. estou bem com "ao redor" também
Codrain Technolabs Pvt Ltd
13

Desde o Magento 2.2, é possível ter parâmetros de entrada após o plugin

namespace My\Module\Plugin;

class AuthLogger
{
    private $logger;

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

    /**
     * @param \Magento\Backend\Model\Auth $authModel
     * @param null $result
     * @param string $username
     * @return void
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function afterLogin(\Magento\Backend\Model\Auth $authModel, $result, $username)
    {
        $this->logger->debug('User ' . $username . ' signed in.');
    }
}

Consulte a documentação do Magento para obter detalhes https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Alex
fonte