50% discount in conference replays
2020 and 2021 events
In English, French, German, Polish and Spanish

Building a single Command Application

Edit this page

Building a single Command Application

When building a command line tool, you may not need to provide several commands. In such a case, having to pass the command name each time is tedious. Fortunately, it is possible to remove this need by declaring a single command application:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env php
<?php
require __DIR__.'/vendor/autoload.php';

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

(new Application('echo', '1.0.0'))
    ->register('echo')
        ->addArgument('foo', InputArgument::OPTIONAL, 'The directory')
        ->addOption('bar', null, InputOption::VALUE_REQUIRED)
        ->setCode(function(InputInterface $input, OutputInterface $output) {
            // output arguments and options
        })
    ->getApplication()
    ->setDefaultCommand('echo', true) // Single command application
    ->run();

The setDefaultCommand() method accepts a boolean as the second parameter. If true, the command echo will then always be used, without having to pass its name.

You can still register a command as usual:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env php
<?php
require __DIR__.'/vendor/autoload.php';

use Acme\Command\DefaultCommand;
use Symfony\Component\Console\Application;

$application = new Application('echo', '1.0.0');
$command = new DefaultCommand();

$application->add($command);

$application->setDefaultCommand($command->getName(), true);
$application->run();
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.