Follow the below steps to create new command line in to Console CLI in Magento 2.
Define command in di.xml
In di.xml file, you can use a type with name Magento\Framework\Console\CommandList to define the command option.
File: app/code/PHPCodez/First/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="displayPHPCodez" xsi:type="object">PHPCodez\First\Console\Hello</item> </argument> </arguments> </type> </config>
This config will declare a command class hello. This class will define the command name and execute() method for this command.
Create command class
As define in di.xml, we will create a command class:
File: app/code/PHPCodez/First/Console/Hello.php
<?php
namespace PHPCodez\First\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Hello extends Command
{
protected function configure()
{
$this->setName('phpcodez:Hello');
$this->setDescription('Demo command line');
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln("Hello PHPCodez");
}
}
In this function, we will define 2 methods:
configure() method is used to set the name, description, command line arguments of the magento 2 add command line
execute() method will run when we call this command line via console.
Clean the cache from shell and run the command hello.
php bin/magento cache:flush php bin/magento phpcodez:hello
Command With Arguments
Modify Hello.php with the following content
File: app/code/PHPCodez/First/Console/Hello.php
<?php
namespace PHPCodez\First\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
class Hello extends Command
{
const NAME = 'name';
protected function configure()
{
$options = [
new InputOption(
self::NAME,
null,
InputOption::VALUE_REQUIRED,
'Name'
)
];
$this->setName('phpcodez:hello')
->setDescription('Demo command line')
->setDefinition($options);
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
if ($name = $input->getOption(self::NAME)) {
$output->writeln("Hello " . $name);
} else {
$output->writeln("Hello PHPCodez");
}
return $this;
}
}
Clean the cache from shell and run the command hello.
php bin/magento cache:flush php bin/magento phpcodez:hello --name PHPCodez
Output will be Hello PHPCodez