Back to Top

Create a custom command to disable a module in Magento 2

Updated 24 July 2024

Hello Friends!
In this blog, we are going to learn how we can create a custom command to disable a custom module in Magento 2 with database changes.

Sometimes, in Magento 2, we create a custom attribute with custom source options, but when we disable the module, we face errors.

So, here we will add functionality to delete required custom attributes, tables, or patch names from the database in our custom command.


Note: If you are using Magento version < 2.3, then the patch_list table will not be available in your database.

To create a custom command, you have to follow below steps:

1. Mention your command in di.xml file inside app/code/Vendor/CustomModule/etc/ directory.

<?xml version="1.0"?>
<!--
/**
 * Webkul Software.
 *
 * @category  Webkul
 * @package   Vendor_CustomModule
 * @author    Webkul <[email protected]>
 * @copyright Webkul Software Private Limited (https://webkul.com)
 * @license   https://store.webkul.com/license.html ASL Licence
 * @link      https://store.webkul.com/license.html
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <!--Creating Disable CustomModule Command-->
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="disable_custommodule" xsi:type="object">Vendor\CustomModule\Console\Command\DisableCustomModule</item>
            </argument>
        </arguments>
    </type>
</config>

2. Now, we will create DisableCustomModule.php file inside app/code/Vendor/CustomModule/Console/Command/ directory. In this Class file, we will extend Symfony\Component\Console\Command\Command Class and configure our custom command.

Searching for an experienced
Magento 2 Company ?
Find out More
<?php
/**
 * Webkul Software.
 *
 * @category  Webkul
 * @package   Vendor_CustomModule
 * @author    Webkul
 * @copyright Webkul Software Private Limited (https://webkul.com)
 * @license   https://store.webkul.com/license.html
 */
namespace Vendor\CustomModule\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DisableCustomModule extends Command
{
    /**
     * @const string
     */
    const REMOVE = 'remove';

    /**
     * @var \Magento\Framework\App\ResourceConnection
     */
    protected $resource;

    /**
     * @var \Magento\Framework\Module\Manager
     */
    protected $moduleManager;

    /**
     * @var \Magento\Eav\Model\ResourceModel\Entity\Attribute
     */
    protected $eavAttribute;

    /**
     * @var \Magento\Framework\Module\Status
     */
    protected $modStatus;

    /**
     * @param \Magento\Framework\App\ResourceConnection $resource
     * @param \Magento\Framework\Module\Manager         $moduleManager
     * @param \Magento\Eav\Model\Entity\Attribute       $entityAttribute
     * @param \Magento\Framework\Module\Status          $modStatus
     */
    public function __construct(
        \Magento\Framework\Module\Status $modStatus,
        \Magento\Framework\Module\Manager $moduleManager,
        \Magento\Framework\App\ResourceConnection $resource,
        \Magento\Eav\Model\Entity\Attribute $entityAttribute
    ) {
        $this->resource      = $resource;
        $this->moduleManager = $moduleManager;
        $this->eavAttribute  = $entityAttribute;
        $this->modStatus     = $modStatus;
        
        parent::__construct();
    }

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $options = [
            new InputOption(
                self::REMOVE,
                null,
                InputOption::VALUE_REQUIRED,
                'Remove'
            )
        ];
        $this->setName('custommodule:disable')
            ->setDescription('CustomModule Disable Command')
            ->setDefinition($options);
        parent::configure();
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        try {
            if ($this->moduleManager->isEnabled('Vendor_CustomModule')) {
                $connection = $this->resource
                    ->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
    
                //this code will be execute when you will execute command 'php bin/magento custommodule:disable --remove=tables'
                if ($input->getOption(self::REMOVE) == "tables") {
                    // drop custom tables
                    $connection->dropTable($connection->getTableName('custom_table'));
                    
                    // drop custom column from quote_item table
                    $connection->dropColumn($connection->getTableName('quote_item'), 'custom_column');
                    
                    $output->writeln("<info>Database Tables Dropped Succesfully.</info>");
    
                    $dropColumnsMsg  = "'custom_column' column dropped from quote_item";
                    
                    $output->writeln($dropColumnsMsg);
                }
    
                // delete custom_attribute_of_product product attribute
                $this->eavAttribute->loadByCode('catalog_product', 'custom_attribute_of_product')->delete();
    
                // disable CustomModule module
                $this->modStatus->setIsEnabled(false, ['Vendor_CustomModule']);
    
                // if needed, delete record from patch_list table of CreateCustomAttribute Class
                $tableName = $connection->getTableName('patch_list');
                $connection->delete($tableName, "patch_name = 'Vendor\CustomModule\Setup\Patch\Data\CreateAttributes'");
    
                // delete entry from setup_module table
                $tableName = $connection->getTableName('setup_module');
                $connection->delete($tableName, ["module = 'Vendor_CustomModule'"]);
    
                $output->writeln('<info>Vendor_CustomModule module has been disabled successfully.</info>');
            }
        } catch (\Exception $e) {
            $output->writeln('<error>'.$e->getMessage().'</error>');
        }
        
        return 1;
    }
}

3. After creating the above files. Run the following command on CLI.

php bin/magento setup:di:compile

4. Now, we can check our custom command in the command list by executing the following command on CLI.

php bin/magento list
cmdlist1
cmdlist2

5. Now, we will run our custom command in CLI.

php bin/magento custommodule:disable
cmdlist4

6. Now, we will execute our custom command with parameters as following:

php bin/magento custommodule:disable --remove=tables
cmdlist5

7. For more information, check here.

That’s all about creating a custom command to disable a module in Magento 2.

Hope this will be helpful. Thanks :),

. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home