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.

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.