Symfony Console - Overwrite default options Symfony Console - Overwrite default options symfony symfony

Symfony Console - Overwrite default options


So, here is a solution that works, but I don't recommend it. I recommend you simply use --package-version or some other sort of option for your command, because this requires a lot of extra work and doesn't play well for future Symfony updates.

The first thing you can do is copy the console command in your bin/ directory to a new command, and change the use statement to your own extended Application:

bin/alt_console:

// use Symfony\Bundle\FrameworkBundle\Console\Application;use AppBundle\Console\Application;

Then create a new Application class that extends the existing Symfony Application, that looks like this:

Application:

namespace AppBundle\Console;use AppBundle\Command\YourCommand;use Symfony\Component\Console\Application;use Symfony\Component\Console\Event\ConsoleErrorEvent;use Symfony\Component\Console\Input\ArrayInput;use Symfony\Component\Console\Input\InputDefinition;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Output\OutputInterface;class TestApplication extends Application{    const NAME = 'Alternative Application';    const VERSION = '1.0';    // these are normally private, but must now be protected as they exist in doRun()    protected $command;    protected $defaultCommand;    protected $dispatcher;    protected $runningCommand;    /**     * {@inheritdoc}     */    public function __construct()    {        parent::__construct(static::NAME, static::VERSION);        // manually add the commands you want to be handled by this        $this->add(new YourCommand());    }    /**     * {@inheritdoc}     */    public function doRun(InputInterface $input, OutputInterface $output)    {        /* remove these lines        if (true === $input->hasParameterOption(array('--version', '-V'), true)) {            $output->writeln($this->getLongVersion());            return 0;        }        */        // copy the rest of the doRun() function as it         // exists in the base Application class        // ...    }    /**     * {@inheritdoc}     *     * Return everything from the default input definition except the 'version' option     */    protected function getDefaultInputDefinition()    {        $definition  = [];        $defaultDefinition = parent::getDefaultInputDefinition();        foreach ($defaultDefinition->getOptions() as $option) {            if ($option->getName() !== 'version') {                $definition[] = $option;            }        }        foreach ($defaultDefinition->getArguments() as $argument) {            $definition[] = $argument;        }        return new InputDefinition($definition);    }}

Now add your application with your own --version option:

namespace AppBundle\Command;use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Input\InputOption;use Symfony\Component\Console\Output\OutputInterface;class YourCommand extends ContainerAwareCommand{    /**     * {@inheritdoc}     */    protected function configure()    {        $this            ->setName('your:command')            ->addOption('--version', '-V', InputOption::VALUE_NONE, 'okay')        ;    }    /**     * {@inheritdoc}     */    protected function execute(InputInterface $input, OutputInterface $output)    {        if ($input->hasOption('version')) {            // do something        }    }}

Then you can call your command via:

php bin/console your:commandphp bin/console your:comand --version

Note that I do NOT recommend this. This is a lot of extra work for almost no gain at all other than saving yourself a few keystrokes with a different option now. Plus if bin/console or Symfony\Component\Console\Application changes in the future, or you'll have to manually update those files since you overrode them.