ExpressionEngine Docs

Creating a Command

Commands are created inside add-ons and registered through the add-on setup file.

Prerequisite: Existing Add-on

Before creating a command, make sure you already have an add-on directory in system/user/addons/[addon_short_name]. If needed, create one first with make:addon.

Generate a Command with make:command

The recommended workflow is to use the command generator:

php eecli.php make:command "Sync Orders" --addon=my_example_addon --description="Sync orders from an API" --signature="sync-orders"

You can also run it interactively:

php eecli.php make:command
Let's build your command!
Command name? Sync Orders
What add-on do you want to add this to? my_example_addon
Command description? Sync orders from an API
Command signature? (i.e. make:magic) sync-orders
Let's build!
Your command has been created successfully!

The generator prefixes the command signature with the add-on short name.
For example, sync-orders becomes my_example_addon:sync-orders.

For all options, see make:command.

What Gets Generated

make:command creates a command class file in your add-on:

system/user/addons/my_example_addon/Commands/CommandSyncOrders.php

It also updates addon.setup.php by adding your command to the commands array:

return [
    // ...
    'namespace' => 'Vendor\MyExampleAddon',
    'commands' => [
        'my_example_addon:sync-orders' => Vendor\MyExampleAddon\Commands\CommandSyncOrders::class,
    ],
];

Anatomy of the Generated Class

The generated class extends ExpressionEngine\Cli\Cli and includes all required properties:

<?php

namespace Vendor\MyExampleAddon\Commands;

use ExpressionEngine\Cli\Cli;

class CommandSyncOrders extends Cli
{
    public $name = 'Sync Orders';
    public $signature = 'my_example_addon:sync-orders';
    public $description = 'Sync orders from an API';
    public $summary = 'Sync orders from an API';
    public $usage = 'php eecli.php my_example_addon:sync-orders';
    public $commandOptions = [];

    public function handle()
    {
        $this->info('Hello World!');
    }
}

You can now replace the handle() contents with your command logic and add options to $commandOptions as needed.

Advanced: Manual Registration

Manual registration is optional, but if you add command classes yourself, register them in addon.setup.php under the commands key using ::class values:

'commands' => [
    'my_example_addon:sync-orders' => Vendor\MyExampleAddon\Commands\CommandSyncOrders::class,
],