Magento 2 Nach dem Plugin mit Parameter

8

Ich versuche nach dem Plugin die folgende Methode zu implementieren.

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

Bitte beachten Sie den $categoryParameter, der an die obige Methode übergeben wurde.

Als Auflösung habe ich unten Code implementiert.

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

Meine Frage lautet nun: Wie kann ich den $categoryParameter, der in der übergeordneten Methode übergeben wurde, an mein Plugin übergeben? Ich möchte nur das Ergebnis basierend auf dem bestimmten Wert im $categoryObjekt ändern .

Codrain Technolabs Pvt Ltd.
quelle

Antworten:

12

Wenn Sie Eingabeparameter benötigen und auch die Ausgabe ändern müssen, sollten Sie ein Around- Plugin verwenden, kein After- Plugin:

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

In Ihrem Fall könnte es so etwas sein:

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

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

   return $originalResult;
} 

Nur eine Notiz:

Bitte beachten Sie, dass eine Voreinstellung eine bessere Option sein kann als ein Plugin , wenn Sie ein internes Verhalten ändern möchten . Es hängt davon ab, was Sie tun werden.

Phoenix128_RiccardoT
quelle
Ich möchte nur das Ergebnis ändern.
Codrain Technolabs Pvt Ltd
Siehe meinen aktualisierten Beitrag.
Phoenix128_RiccardoT
Ja, dass (AroundPlugin) funktioniert, aber es wäre großartig, wenn wir dies mit (AfterPlugin) erreichen könnten.
Codrain Technolabs Pvt Ltd
Es gibt keine Möglichkeit mit "After" -Plugins, da dies nicht beabsichtigt ist. Das, was Sie benötigen, kann nur mit "Around" -Plugins ausgeführt werden.
Phoenix128_RiccardoT
Danke für die schnelle Antwort.
Mir
12

Seit Magento 2.2 ist es möglich, Eingabeparameter nach dem Plugin einzugeben

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.');
    }
}

Weitere Informationen finden Sie in der Magento-Dokumentation unter https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Alex
quelle