Use Symfony forms for Console command input
PHP Gherkin Shell
Latest commit 56433b5 Feb 9, 2017 @matthiasnoback committed on GitHub Merge pull request #23 from mops1k/fix_label_translations
Add translation to transformers

Symfony Console Form

By Matthias Noback

Build Status

This package contains a Symfony bundle and some tools which enable you to use Symfony Form types to define and interactively process user input from the CLI.


composer require matthiasnoback/symfony-console-form

Enable Matthias\SymfonyConsoleForm\Bundle\SymfonyConsoleFormBundle in the kernel of your Symfony application.

    // app/AppKernel.php

    public function registerBundles()
        $bundles = array(
            // ...
            new Matthias\SymfonyConsoleForm\Bundle\SymfonyConsoleFormBundle(),


Follow the steps below or just clone this project, then run:

php test/console.php form:demo

Set up the form


use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\Country;
use Symfony\Component\Validator\Constraints\Email;

class DemoType extends AbstractType
    public function buildForm(FormBuilderInterface $builder, array $options)
                    'label' => 'Your name',
                    'required' => true,
                    'data' => 'Matthias'

    public function setDefaultOptions(OptionsResolverInterface $resolver)
        $resolver->setDefaults(['data_class' => 'Matthias\SymfonyConsoleForm\Tests\Data\Demo']);

    public function getName()
        return 'test';

The corresponding Demo class looks like this:


class Demo
    public $name;

Create the console command; use the form helper


use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Matthias\SymfonyConsoleForm\Console\Helper\FormHelper;

class TestCommand extends Command
    protected function configure()

    protected function execute(InputInterface $input, OutputInterface $output)
        $formHelper = $this->getHelper('form');
        /** @var FormHelper $formHelper */

        $formData = $formHelper->interactUsingForm(new DemoType(), $input, $output);

        // $formData is the valid and populated form data object/array

When you provide command-line options with the names of the form fields, those values will be used as default values.

If you add the --no-interaction option when running the command, it will submit the form using the input options you provided.

If the submitted data is invalid the command will fail.


  • Provide example of stand-alone usage (no need to extend the command)
  • Maybe: provide a way to submit a form at once, possibly using a JSON-encoded array
  • Add more functional tests
  • Show form label of root form
  • Show nesting in form hierarchy using breadcrumbs
  • When these things have been provided, release this as a package (or multiple packages for stand-alone use)