Console

OXID eShop uses Symfony console component to register or execute command, so it’s possible to use it’s features. More information about Symfony console can be found here.

Executing CLI Commands

To get list of commands, execute:

vendor/bin/oe-console

In case you are using Enterprise Edition subshops feature, to get list of specific subshop commands, execute:

vendor/bin/oe-console --shop-id=<shop-id>

Note

If <shop-id> will not be defined: shop 1, going to be used.

Some other commands examples:

vendor/bin/oe-console oe:module:activate <module-id>
vendor/bin/oe-console oe:module:activate <module-id> --shop-id=<shop-id>
vendor/bin/oe-console oe:module:deactivate <module-id> --shop-id=<shop-id>

Creating custom CLI commands

Commands can be created for OXID eShop modules or for OXID eShop components.

Module commands

OXID eShop allows to create commands for modules. Command will appear in the list only when module going to be activated.

Command class

First of all it’s necessary to create a command class. Command class example:

<?php declare(strict_types=1);
namespace OxidEsales\DemoModule\Command;

use OxidEsales\EshopCommunity\Internal\Framework\Console\AbstractShopAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloWorldCommand extends AbstractShopAwareCommand
{
    protected function configure()
    {
        $this->setName('demo-module:say-hello')
        ->setDescription('"Hello world" command.')
        ->setHelp('Command says "Hello world".');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Hello world!');

        return 0;
    }
}

Important

Module command must extend \OxidEsales\EshopCommunity\Internal\Framework\Console\AbstractShopAwareCommand. It’s necessary to extend this class otherwise command will not respect OXID eShop modules functionality and some features will not work.

Command file registration

When command file is created, it’s necessary to register it as a service. If services.yaml file is not present, create it in your module root directory.

Important

Do not add a leading backslash to the classname.

wrong: class: \OxidEsales\DemoModule\Command\HelloWorldCommand

correct: class: OxidEsales\DemoModule\Command\HelloWorldCommand

services:
  OxidEsales\DemoModule\Command\HelloWorld:
    class: OxidEsales\DemoModule\Command\HelloWorldCommand
    tags:
    - { name: 'console.command', command: 'demo-module:say-hello' }

Important

Despite specifying command: ‘demo-module:say-hello’ explicitly is not needed, we highly recommend to do so, because you will likely run into this issue otherwise.

Now after module activation, command will be available in commands list and it can be executed via:

vendor/bin/oe-console demo-module:say-hello

In case you need to change command name, it can be done also via services.yaml file by adding command entry:

services:
  OxidEsales\DemoModule\Command\HelloWorld:
    class: OxidEsales\DemoModule\Command\HelloWorldCommand
    tags:
    - { name: 'console.command', command: 'demo-module:say-hello-another-command' }

And again after module activation command can be called via:

vendor/bin/oe-console demo-module:say-hello-another-command

Demo module with command example can be found here.

OXID eShop component commands

Component commands works similarly as module commands, just one difference, they become active instantly after installation via composer. For more information refer to OXID eShop component.

Command class

Component command example:

<?php declare(strict_types=1);
namespace OxidEsales\DemoComponent\Command;

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

class HelloWorldCommand extends Command
{
    protected function configure()
    {
        $this->setName('demo-component:say-hello')
        ->setDescription('Says hello.')
        ->setHelp('This command welcomes you.');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Hello World!');

        return 0;
    }
}

Important

Component command must extend \Symfony\Component\Console\Command\Command.

Command file registration

When command class is created, it’s necessary to register it as a service. If the services.yaml is not present, create it in your component root directory.

services:
  OxidEsales\DemoComponent\Command\HelloWorld:
    class: OxidEsales\DemoComponent\Command\HelloWorldCommand
    tags:
    - { name: 'console.command', command: 'demo-module:say-hello' }

Command testing

For integration testing commands we recommend to use the symfony CommandTester. Within this CommandTester the input and output can even be overwritten for your needs.

Example for executing your command within command tester:

class TestCommand extends Command
{
    protected function configure()
    {
        $this->setName('oe:tests:test-command');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Command has been executed!');
        return 0;
    }
}

public function testCommandExecution()
{
    $commandTester = new CommandTester(new TestCommand());

    $commandTester->execute([]);

    $output = $commandTester->getDisplay();

    $this->assertSame('Command has been executed!' . PHP_EOL, $output);
}