Hace un tiempo tuve la necesidad de registrar un evento llamando a una API cada vez que un módulo X es desinstalado.

A partir de Magento 2.3 cambiaron las reglas para registrar los scripts de instalación que se ejecutan en tu módulo, no debés usar más los ahora viejos scripts localizados en la carpeta Setup.

Consultando en el grupo de MugAr, Manuel Canepa me sugirió revisar la función setIsEnabled que se ejecuta en la clase Magento\Framework\Module\Status.

Finalmente, explorando esa posibilidad, pude desarrollar la funcionalidad requerida.

En el archivo di.xml de tu modulo tenés que configurar un plugin para escuchar cada vez que esa función setIsEnabled es ejecutada, el código seria algo como lo siguiente:

<type name="Magento\Framework\Module\Status">     
    <plugin name="vendor_module_status_setisenabled" type="Vendor\Module\Plugin\Framework\Module\Status"/> 
</type>

En donde Vendor\Module es el nombre de tu módulo.

Luego, creás el plugin en Vendor/Module/Plugin/Framework/Module/Status, y el contenido sera algo así:

<?php

namespace Vendor\Module\Plugin\Framework\Module;

use Vendor\Module\Model\Setup;

class Status
{
    /**
     * @var Setup
     */
    protected $setup;

    /**
     * Constructor
     *
     * @param Setup $setup
     */
    public function __construct(
        Setup $setup
    ) {
        $this->setup = $setup;
    }

    /**
     * Execute after setIsEnabled, detect if the module is uninstalled, perform call to 
     * model inside module that makes API call to third party service
     *
     * @param $subject
     * @param $result
     * @param bool $isEnabled
     * @param string[] $modules
     * @return void
     */
    public function afterSetIsEnabled($subject, $result, $isEnabled, $modules)
    {
        foreach ($modules as $module) {
            if ($module=='Vendor_Module' && !isEnabled) {
                //do your magic here
                $this->setup->setAsUninstalled();
            }
        }
    }
}

El chequeo para revisar que $isEnabled sea falso probablemente está de más, porque no recibís este evento cuando el módulo se instala, ya que al momento en que se ejecuta tu código no es accesible todavía por Magento.

De igual manera, en ese punto es donde podes disparar una llamada a una API o hacer el trabajo que necesites hacer al detectar que tu módulo fue deshabilitado.

En mi caso, estoy instanciando un model de mi módulo que ejecuta una llamada a una API propia en caso que el módulo sea desinstalado.

De igual manera se puede hacer un request usando CURL aquí mismo (donde se llama a la función setAsUninstalled), o cualquiera sea la necesidad a cumplir.

Publicado por Matías Delgado

Senior Software Engineer en Route.