Magento 2 Dopo il plugin con parametro


8

Sto cercando di implementare dopo il plugin il seguente metodo.

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

Si prega di notare il $categoryparametro passato al metodo sopra.

Come la risoluzione, ho implementato sotto il codice.

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

Ora, la mia domanda è: come faccio a far passare il $categoryparametro nel metodo genitore al mio plugin? Voglio solo modificare il risultato in base al determinato valore $categorynell'oggetto.

Risposte:


13

Se hai bisogno di parametri di input e devi anche modificare l'output, dovresti usare un plugin around , non 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;
} 

Nel tuo caso potrebbe essere qualcosa del genere:

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

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

   return $originalResult;
} 

Solo una nota:

Si noti che se si intende modificare un comportamento interno, una preferenza potrebbe essere un'opzione migliore rispetto a un plug-in . Dipende da cosa hai intenzione di fare.


Voglio solo modificare il risultato.
Codrain Technolabs Pvt Ltd,

Vedi il mio post aggiornato.
Phoenix128_RiccardoT

Sì, (AroundPlugin) funziona ma sarebbe fantastico se riusciamo a ottenere questo risultato utilizzando (AfterPlugin).
Codrain Technolabs Pvt Ltd,

Non è possibile utilizzare plug-in "after" poiché non è progettato per funzionare in questo modo, ciò che è necessario può essere eseguito solo con plug-in "around".
Phoenix128_RiccardoT

Grazie per la sua pronta risposta. sto bene anche con "around"
Codrain Technolabs Pvt Ltd,

13

Da Magento 2.2 è possibile avere i parametri di input dopo il 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.');
    }
}

Consulta la documentazione di Magento per i dettagli https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.