
.. include:: ../../Includes.txt

==================================================================
Feature: #59606 - Integrate Symfony/Console into CommandController
==================================================================

See :issue:`59606`

Description
===========

The CommandController now makes use of Symfony/Console internally and
provides various methods directly from the CommandController's `output` member:

* TableHelper

  * outputTable($rows, $headers = NULL)

* DialogHelper

  * select($question, $choices, $default = NULL, $multiSelect = false, $attempts = FALSE)
  * ask($question, $default = NULL, array $autocomplete = array())
  * askConfirmation($question, $default = TRUE)
  * askHiddenResponse($question, $fallback = TRUE)
  * askAndValidate($question, $validator, $attempts = FALSE, $default = NULL, array $autocomplete = NULL)
  * askHiddenResponseAndValidate($question, $validator, $attempts = FALSE, $fallback = TRUE)

* ProgressHelper

  * progressStart($max = NULL)
  * progressSet($current)
  * progressAdvance($step = 1)
  * progressFinish()

Here's an example showing of some of those functions:

.. code-block:: php

   namespace Acme\Demo\Command;

   use TYPO3\CMS\Extbase\Mvc\Controller\CommandController;

   /**
    * My command
    */
   class MyCommandController extends CommandController {

      /**
       * @return string
       */
      public function myCommand() {
         // render a table
         $this->output->outputTable(array(
            array('Bob', 34, 'm'),
            array('Sally', 21, 'f'),
            array('Blake', 56, 'm')
         ),
         array('Name', 'Age', 'Gender'));

         // select
         $colors = array('red', 'blue', 'yellow');
         $selectedColorIndex = $this->output->select('Please select one color', $colors, 'red');
         $this->outputLine('You choose the color %s.', array($colors[$selectedColorIndex]));

         // ask
         $name = $this->output->ask('What is your name?' . PHP_EOL, 'Bob', array('Bob', 'Sally', 'Blake'));
         $this->outputLine('Hello %s.', array($name));

         // prompt
         $likesDogs = $this->output->askConfirmation('Do you like dogs?');
         if ($likesDogs) {
            $this->outputLine('You do like dogs!');
         }

         // progress
         $this->output->progressStart(600);
         for ($i = 0; $i < 300; $i ++) {
            $this->output->progressAdvance();
            usleep(5000);
         }
         $this->output->progressFinish();

      }
   }


Impact
======

This change does not alter the public API so it is not breaking
in the strict sense. But it introduces a new behavior:
Previously all output was collected in the `Cli\Response` and only rendered to the console at the end of a CLI request.
Now all methods producing output (including `output()` and `outputLine()`) render the result directly to the console.
If you use `$this->response` directly or let the command method return a string, the rendering is still deferred until
the end of the CLI request.


.. index:: CLI, ext:extbase, PHP-API
