Magento 2 Setelah plugin dengan parameter

8

Saya mencoba menerapkan plugin setelah ke metode berikut.

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

Harap perhatikan $categoryparameter yang diteruskan ke metode di atas.

Sebagai resolusi, saya telah menerapkan kode di bawah ini.

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

Sekarang, pertanyaan saya adalah: Bagaimana cara mendapatkan $categoryparameter yang dikirimkan dalam metode induk ke plugin saya? Saya hanya ingin memodifikasi hasil berdasarkan nilai tertentu dalam $categoryobjek.

Codrain Technolabs Pvt Ltd
sumber

Jawaban:

13

Jika Anda membutuhkan parameter input dan Anda juga perlu mengubah output, Anda harus menggunakan plugin sekitar , bukan plugin setelah :

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

Saya kira Anda bisa jadi seperti ini:

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

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

   return $originalResult;
} 

Hanya sebuah catatan:

Harap perhatikan bahwa jika Anda akan mengubah perilaku internal, preferensi bisa menjadi opsi yang lebih baik daripada plugin . Itu tergantung pada apa yang akan Anda lakukan.

Phoenix128_RiccardoT
sumber
Saya hanya ingin mengubah hasilnya.
Codrain Technolabs Pvt Ltd
Lihat posting saya yang diperbarui.
Phoenix128_RiccardoT
Ya itu (AroundPlugin) Bekerja tetapi akan lebih bagus jika kita dapat mencapai ini menggunakan (AfterPlugin).
Codrain Technolabs Pvt Ltd
Tidak ada cara dengan plugin "setelah" karena tidak dimaksudkan untuk bekerja dengan cara ini, apa yang Anda butuhkan hanya dapat dilakukan dengan plugin "sekitar".
Phoenix128_RiccardoT
Terima kasih atas tanggapan cepat Anda. saya baik-baik saja dengan "sekitar" juga
Codrain Technolabs Pvt Ltd
13

Karena Magento 2.2 dimungkinkan untuk memiliki parameter input setelah 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.');
    }
}

Lihat dokumentasi Magento untuk detail https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Alex
sumber