How to add CLI commands
Overview of adding CLI commands
Magento enables your component to add commands to our Symfony-like command-line interface (CLI).
About the Magento CLI
Magento has one command-line interface that performs both installation and configuration tasks: <magento_root>/bin/magento
. The new interface performs multiple tasks, including:
- Installing Magento (and related tasks such as creating or updating the database schema, creating the deployment configuration, and so on).
- Clearing the cache.
- Managing indexes, including reindexing.
- Creating translation dictionaries and translation packages.
- Generating non-existent classes such as factories and interceptors for plug-ins, generating the dependency injection configuration for the object manager.
- Deploying static view files.
- Creating CSS from Less.
Other benefits:
- A single command (
<magento_root>/bin/magento list
) lists all available installation and configuration commands. - Consistent user interface based on Symfony.
- The CLI is extensible so third party developers can “plug in” to it. This has the additional benefit of eliminating users’ learning curve.
- Commands for disabled modules do not display.
Prerequisites
Before you begin, make sure you understand the following:
- All Magento command-line interface (CLI) commands rely on the Magento application and must have access to its context, dependency injections, plug-ins, and so on.
- All CLI commands should be implemented in the scope of your module and should depend on the module’s status.
- Your command can use the Object Manager and Magento dependency injection features; for example, it can use constructor dependency injection.
-
You must register your commands as discussed in any of the following sections:
Add CLI commands using dependency injection
The Magento 2 sample modules provide a demonstration of many programming techniques, including adding a CLI command using dependency injection. Look at the sample-module-command
for an example. The module’s README.md discusses how to install it.
Following is a summary of the process:
-
Create a Command class (the recommended location is
<your component root dir>/Console/Command
).See
<Magento_Store_module_dir>/Console/Command/StoreListCommand.php
for example.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
namespace Magento\CommandExample\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Class SomeCommand
*/
class SomeCommand extends Command
{
/**
* @inheritDoc
*/
protected function configure()
{
$this->setName('my:first:command');
$this->setDescription('This is my first console command.');
parent::configure();
}
/**
* @param InputInterface $input
* @param OutputInterface $output
*
* @return null|int
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln('<info>Success Message.</info>');
$output->writeln('<error>An error encountered.</error>');
}
}
You can style the output text by using
- Declare your Command class in
Magento\Framework\Console\CommandListInterface
using dependency injection (<your component root dir>/etc/di.xml
):
1
2
3
4
5
6
7
8
9
10
11
<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="commandexample_somecommand" xsi:type="object">Magento\CommandExample\Console\Command\SomeCommand</item>
</argument>
</arguments>
</type>
...
</config>
-
Clean the cache and compiled code directories:
1 2
cd <magento_root>/var rm -rf cache/* page_cache/* di/* generation/*
Add CLI commands using the Composer autoloader
To be added at a later time.