Add Custom CLI Commands
To ease development tasks, Shopware contains the Symfony commands functionality. This allows (plugin-) developers to define new commands executable via the Symfony console at bin/console
. The best thing about commands is, that they're more than just simple standalone PHP scripts - they integrate into Symfony and Shopware, so you've got access to all the functionality offered by both of them.
Creating a command for Shopware 6 via a plugin works exactly like you would add a command to Symfony. Make sure to have a look at the Symfony commands guide:
Prerequisites
This guide does not explain how to create a new plugin for Shopware 6. Head over to our plugin base guide to learn how to create a plugin at first:
The main requirement here is to have a services.xml
file loaded in your plugin. This can be achieved by placing the file into a Resources/config
directory relative to your plugin's base class location.
INFO
Refer to this video on custom Creating a CLI command. Also available on our free online training "Shopware 6 Backend Development".
Registering your command
From here on, everything works exactly like in Symfony itself. Commands are recognised by Shopware, once they're tagged with the console.command
tag in the dependency injection container. So to register a new command, just add it to your plugin's services.xml
and specify the console.command
tag:
<services>
<!-- ... -->
<service id="Swag\BasicExample\Command\ExampleCommand">
<tag name="console.command"/>
</service>
</services>
<!-- ... -->
Here's a full example services.xml
which registers your custom command:
// <plugin root>/src/Resources/config/services.xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="Swag\BasicExample\Command\ExampleCommand">
<tag name="console.command"/>
</service>
</services>
</container>
Your command's class should extend from the Symfony\Component\Console\Command\Command
class, here's an example:
// <plugin root>/src/Command/ExampleCommand.php
<?php declare(strict_types=1);
namespace Swag\BasicExample\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
// Command name
#[AsCommand(name: 'swag-commands:example')]
class ExampleCommand extends Command
{
// Provides a description, printed out in bin/console
protected function configure(): void
{
$this->setDescription('Does something very special.');
}
// Actual code executed in the command
protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln('It works!');
return Command::SUCCESS;
}
}
This command is of course only a basic example, so feel free to experiment. As stated above, you now have access to all the functionality offered by Symfony and Shopware.
INFO
For inspiration, maybe have a look at the Symfony documentation - you may for example use tables, progress bars, or custom formats.
Running commands
Commands are run via the bin/console
executable. To list all available commands, run bin/console list
:
$: php bin/console list
Symfony 4.4.4 (env: dev, debug: true)
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
-e, --env=ENV The Environment name. [default: "dev"]
--no-debug Switches off debug mode.
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
about Displays information about the current project
help Displays help for a command
list Lists commands
feature
feature:dump Creating json file with feature config for js testing and hot reloading capabilities.
assets
assets:install
bundle
bundle:dump Creates a json file with the configuration for each active Shopware bundle.
cache
cache:clear Clears the cache
cache:pool:clear Clears cache pools
cache:pool:delete Deletes an item from a cache pool
cache:pool:list List available cache pools
cache:pool:prune Prunes cache pools
cache:warmup Warms up an empty cache
[...]
Each command usually has a namespace like cache
, so to clear the cache you would execute php bin/console cache:clear
. If you would like to learn more about commands in general, have a look at this article in the Symfony documentation.