Memahami Interceptor (Plugin) pada Magento 2

Untuk memanipulasi logic atau alur sebuah service pada Magento 2, selain menggunakan Dependency Injection yaitu dengan meng-override service yang dimaksud seperti yang telah dijelaskan sebelumnya. Kita juga dapat memanipulasi logic dari sebuah service menggunakan Plugin (Interceptors). Menurut situs resminya, penjelasan tentang Interceptors adalah sebagai berikut:

A plugin, or interceptor, is a class that modifies the behavior of public class functions by intercepting a function call and running code before, after, or around that function call. This allows you to substitute or extend the behavior of original, public methods for any class or interface

Simpelnya, Plugin atau Interceptors adalah cara merubah behavior atau tingkah laku dari sebuah public method pada semua service di Magento 2 tanpa terkecuali. Namun cara ini bukan tanpa batasan, dan berikut adalah batasa dari interceptors:

  • Final methods
  • Final classes
  • Non-public methods
  • Class methods (such as static methods)
  • __construct
  • Virtual types
  • Objects that are instantiated before Magento\Framework\Interception is bootstrapped

Terdapat 3 macam interceptor pada Magento 2 yaitu before, after dan around. Masing-masing memiliki karakteristik yang berbeda.

  1. Before: Interceptor ini dipanggil sebelum method aslinya dipanggil
  2. After: Kebalikan dari before, interceptor ini dipanggil setelah method aslinya dipanggil
  3. Around: Method ini akan mereplace method asli dan method asli tersebut tidak akan dipanggil

Untuk membuat interceptor, pertama kita mendefinisikannya dulu pada file di.xmlsebagai berikut:

<type name="Magento\Catalog\Model\Product">
    <plugin name="format_url" type="MyModule\Product\Plugin\FormatUrl" />
</type>

Pada file di atas, kita akan melakukan intercept pada service Magento\Catalog\Model\Productmenggunakan service MyModule\Product\Plugin\FormatUrl, dan berikut adalah isi dari file tersebut.

<?php

namespace MyModule\Product\Plugin;

use Magento\Catalog\Model\Product;

/**
 * @author Muhamad Surya Iksanudin<surya.iksanudin@alpabit.com>
 */
class FormatUrl
{
    public function aroundFormatUrlKey(Product $subject, \Closure $processed, ?string $url)
    {
        if (!$url) {
            return $processed($url);
        }

        return $processed(sprintf('%s-%s', $url, date('YmdHis')));
    }
}

Terlihat bahwa pada file di atas kita menggunakan around interceptor untuk me-replace method formatUrlKey. Aturan penulisannya adalah <interceptor><methodToIntercept> dengan huruf pertama dijadikan uppercase sebagaimana contoh di atas kecuali untuk method yang diawali dengan underscore (_) maka tidak perlu di-uppercase huruf pertamanya.

Pada file di atas juga terdapat $processed yang merupakan method asli-nya. Kita tetap dapat memanggil method asli-nya dengan memanggil $processed() sebagaimana di atas.

Bagaimana mana mudah sekali bukan? Selamat mencoba

Leave a Reply