Memahami Dependency Injection pada Magento 2

Modern architecture pada software development saat ini sangat erat kaitannya dengan dependency injection yaitu sebuah teknik tentang bagaimana sebuah object diinisiasi sebelum dia dapat siap untuk digunakan. Hampir setiap software baik itu Framework, CMS atau Web Application biasanya telah menerapkan teknik tersebut, tak terkecuali Magento.

Magento adalah salah satu e-commerce engine yang berstandar enterprise dan banyak digunakan oleh perusahaan besar. Selain itu, Magento punya arsitektur yang sangat solid sehingga mudah bagi seorang developer untuk mempelajarinya (saya akan dihujat karena mengatakan ini).

Kembali ke dependency Injection, Magento mempunyai dependency injection engine yang disebut ADI (Automatic Dependency Injection) yang semuanya bertumpu pada object manager. Dengan ADI, kamu tidak perlu mendefinisikan kebutuhan sebuah class secara eksplisit pada level konfigurasi.

<?php

namespace MyModule\Util;

use Magento\Catalog\Model\Product;
use Magento\Eav\Api\AttributeRepositoryInterface;
use Magento\Framework\Exception\NoSuchEntityException;

/**
 * @author Muhamad Surya Iksanudin<surya.iksanudin@gmail.com>
 */
class AttributeChecker
{
    private $attributeRepository;

    public function __construct(AttributeRepositoryInterface $attributeRepository)
    {
        $this->attributeRepository = $attributeRepository;
    }

    public function isProductAttributeExists(string $attributeCode): bool
    {
        try {
            $this->attributeRepository->get(Product::ENTITY, $attributeCode);

            return true;
        } catch (NoSuchEntityException $e) {
            return false;
        }
    }
}

Pada code di atas, object AttributeRepositoryInterface otomatis akan diinject ketika object AttributeChecker dibutuhkan atau digunakan pada class lain.

Kemudian akan muncul pertanyaan, bagaimana Magento tau, object dari class mana yang mengimplementasikan AttributeRepositoryInterface yang harus diinisiasi? Jawabannya ada di file di.xml yaitu pada definisi berikut:

<preference for="Magento\Eav\Api\AttributeRepositoryInterface" type="Magento\Eav\Model\AttributeRepository" />

Dengan konfigurasi tersebut, Magento tau object dari class mana yang harus diinisiasi ketika object AttributeRepositoryInterface dibutuhkan.

Dengan konfigurasi yang sama, kita juga dapat melakukan override object sehingga tanpa memanipulasi object aslinya, kita dapat memodifikasi logic dari object tersebut. Perhatikan contoh berikut:

<preference for="Magento\Backend\Controller\Adminhtml\Auth\Login" type="MyModule\Controller\Adminhtml\Auth\Login"/>

Code di atas, kita mengganti object Magento\Backend\Controller\Adminhtml\Auth\Login dengan MyModule\Controller\Adminhtml\Auth\Login sehingga bila ada object yang membutuhkan object Magento\Backend\Controller\Adminhtml\Auth\Login sebagai dependency, maka Magento akan menggantinya dengan MyModule\Controller\Adminhtml\Auth\Login.

Dengan cara ini, artinya semua object dari Magento\Backend\Controller\Adminhtml\Auth\Login akan diganti semuanya tanpa terkecuali, sehingga untuk menggunakan fitur ini, pastikan kamu tau konsekuensinya.

Selamat mencoba

Leave a Reply