Magento 2 After plugin avec paramètre

8

J'essaye d'implémenter après plugin la méthode suivante.

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

Veuillez noter le $categoryparamètre transmis à la méthode ci-dessus.

En tant que résolution, j'ai implémenté le code ci-dessous.

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

Maintenant, ma question est: comment puis-je faire passer le $categoryparamètre dans la méthode parent à mon plugin? Je veux juste modifier le résultat en fonction de la certaine valeur de l' $categoryobjet.

Codrain Technolabs Pvt Ltd
la source

Réponses:

13

Si vous avez besoin de paramètres d'entrée et que vous devez également modifier la sortie, vous devez utiliser un plugin around , pas un plugin after :

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;
} 

Dans votre cas, cela pourrait être quelque chose comme ceci:

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

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

   return $originalResult;
} 

Juste une note:

Veuillez noter que si vous allez changer un comportement interne, une préférence pourrait être une meilleure option qu'un plugin . Cela dépend de ce que vous allez faire.

Phoenix128_RiccardoT
la source
Je veux juste modifier le résultat.
Codrain Technolabs Pvt Ltd
Voir mon article mis à jour.
Phoenix128_RiccardoT
Oui, (AroundPlugin) fonctionne, mais ce serait formidable si nous pouvions y arriver en utilisant (AfterPlugin).
Codrain Technolabs Pvt Ltd
Il n'y a aucun moyen avec les plugins "après" car il n'est pas destiné à fonctionner de cette façon, ce dont vous avez besoin ne peut être fait qu'avec des plugins "autour".
Phoenix128_RiccardoT
Merci pour votre réponse rapide. je suis bien avec "autour" aussi
Codrain Technolabs Pvt Ltd
13

Depuis Magento 2.2, il est possible d'avoir des paramètres d'entrée après le 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.');
    }
}

Voir la documentation de Magento pour plus de détails https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Alex
la source