Creating Magento 2 Console Commands
Command Line Interface
To create custom commands to the CLI interface add a folder called ./Console/Command
to your Custom Magento 2 Module. Here we can create our custom command AddItem.php
:
<?php
namespace INSTAR\SampleModule\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use INSTAR\SampleModule\Model\ItemFactory;
use Magento\Framework\Console\Cli;
class AddItem extends Command
{
const INPUT_KEY_NAME = 'name';
const INPUT_KEY_DESCRIPTION = 'description';
private $itemFactory;
public function __construct(ItemFactory $itemFactory)
{
$this->itemFactory = $itemFactory;
parent::__construct();
}
protected function configure()
{
$this->setName('instar:item:add')
->addArgument(
self::INPUT_KEY_NAME,
InputArgument::REQUIRED,
'Item name'
)->addArgument(
self::INPUT_KEY_DESCRIPTION,
InputArgument::OPTIONAL,
'Item description'
);
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$item = $this->itemFactory->create();
$item->setName($input->getArgument(self::INPUT_KEY_NAME));
$item->setDescription($input->getArgument(self::INPUT_KEY_DESCRIPTION));
$item->setIsObjectNew(true);
$item->save();
return Cli::RETURN_SUCCESS;
}
}
Magento 2 uses the Symfony framework to create command line commands. This examples imports the necessary modules from Symfony and creates a command that accepts 2 inputs - an item name and description. We now need to implement this command so that those values can be written to our modules database table - for this we have to add a Dependency Injection configuration to our module with ./etc/di.xml
:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\Console\CommandList">
<arguments>
<argument name="commands" xsi:type="array">
<item name="instarAddItem" xsi:type="object">INSTAR\SampleModule\Console\Command\AddItem</item>
</argument>
</arguments>
</type>
</config>
Now flush the Magento cache (all XML files are cached by Magento - changing them always requires a flush):
bin/magento cache:flush
The list of available Magento commands should now contain the new command we created:
root@Magento2 /var/www/html/magento # bin/magento
Magento CLI 2.3.3
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
help Displays help for a command
list Lists commands
instar
instar:item:add
You can now use the command to add Items and append them to your modules database table:
bin/magento instar:item:add "Item 3" "Third item description"
You can now verify that the item was added by connecting to your MySQL database, or by opening the view we created earlier: