# Actions as commands

# How are attributes filled?

By default, all of the command's arguments and options will be used as attributes.

This means the attributes will also include any options defined by Laravel such as verbose or help.

You can provide more thorough mapping of your command input by overriding the getAttributesFromCommand method.

class PublishANewArticle extends Action
{
    protected static $commandSignature = 'make:article
                                          {title : The title of the article}
                                          {--published : Whether the article should be immediately published}
                                          {--tags=* : Tags for the newly created article}';

    public function getAttributesFromCommand(Command $command): array
    {
        return [
            'title' => $command->argument('title'),
            'published_at' => $command->option('published') ? now() : null,
            'tags' => $command->option('tags'),
        ];
    }

    // ...
}

# Registering commands

By default, any action that defines the $commandSignature static property will be registered as a command.

WARNING

This will work out-of-the-box for actions defined in the app/Actions folder (or subfolders). If some of your actions live outside this folder, you will need to call Actions::paths([...]) in a service provider to let the library know where to find your actions in order to register these routes.

See the "Registering actions" page for more details.

Alternatively, when not automatically registered, you can manually register an action by calling the registerCommand static method in your routes/console.php file.

PublishANewArticle::registerCommand();

# Prompting additional data

In some cases, when an action is running as a command, you might want to gather some attributes interactively. For example, prompt the user some additional data or ask them to confirm an action before continuing. You may do all of this within the asCommand method. This method will run before executing the action to allow you to define additional attributes. See example below.


class PublishANewArticle extends Action
{
    protected static $commandSignature = 'make:article';

    public function asCommand(Command $command)
    {
        $this->title = $command->ask('What is the title?');
        $this->published_at = $command->confirm('Publish immediately?') ? now() : null;

        if (! $command->confirm('Are you sure?')) {
            throw new Exception('Operation cancelled');
        }
    }

    // ...
}

TIP

It is worth noting that, just like the handle method, the asCommand method support dependency injections.

TIP

Also note that there exists a as... method for every way an action can run as. Namely, asObject, asJob, asListener, asController and asCommand.

See "The before hooks" for more details.

# Console output and exit code

By default, the returned value of the handle method will be dumped in the console and a successful exit code (i.e. 0) will be returned.

You may customise what you want to display to the console after executing the action by overriding the consoleOutput method. The returned value of the handle method is given as the first argument. The command object is available as the second argument.

public function consoleOutput($article, Command $command)
{
    $command->line("Success! You've published the article \"{$article->title}\".");
}

Any value returned by the consoleOutput method will be used as an exit code.

public function consoleOutput($article, Command $command)
{
    return 42;
}