[BUGFIX] Update ConsoleOutput functions to new Symfony console 49/51949/3
authorJigal van Hemert <jigal.van.hemert@typo3.org>
Sat, 4 Mar 2017 07:58:38 +0000 (08:58 +0100)
committerBenni Mack <benni@typo3.org>
Wed, 29 Mar 2017 09:44:03 +0000 (11:44 +0200)
Symfony's Question and ChoiceQuestion define maxAttempts as null|int
with null as default. The ConsoleOutput functions are adjusted accordingly
to prevent an exception from being thrown.

Resolves: #80053
Releases: master
Change-Id: I0e23b8f6e3ff875f14a8f081059e869142ab5aa4
Reviewed-on: https://review.typo3.org/51949
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
typo3/sysext/core/Documentation/Changelog/master/Deprecation-80053-ExtbaseCLIConsoleOutputDifferentMethodSignatureForInfiniteAttempts.rst [new file with mode: 0644]
typo3/sysext/extbase/Classes/Mvc/Cli/ConsoleOutput.php

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-80053-ExtbaseCLIConsoleOutputDifferentMethodSignatureForInfiniteAttempts.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-80053-ExtbaseCLIConsoleOutputDifferentMethodSignatureForInfiniteAttempts.rst
new file mode 100644 (file)
index 0000000..f55c1ac
--- /dev/null
@@ -0,0 +1,35 @@
+.. include:: ../../Includes.txt
+
+=================================================================================================
+Deprecation: #80053 - Extbase CLI Console Output different method signature for infinite attempts
+=================================================================================================
+
+See :issue:`80053`
+
+Description
+===========
+
+When using Extbase's CLI functionality to ask for a question via `ConsoleOutput->select()` or
+`ConsoleOutput->askAndValidate()` the option to define infinite attempts has changed from "false"
+to "null".
+
+
+Impact
+======
+
+Calling any of the methods with php:`$attempts = false` will trigger a deprecation log entry.
+
+
+Affected Installations
+======================
+
+Any TYPO3 extension shipping custom CLI commands for Extbase using the methods above with the option
+to have infinite attempts.
+
+
+Migration
+=========
+
+Set the method argument from "false" to "null" in the Extbase Command of your extension.
+
+.. index:: CLI
\ No newline at end of file
index 9966c7c..6e0e53d 100644 (file)
@@ -25,6 +25,7 @@ use Symfony\Component\Console\Output\ConsoleOutput as SymfonyConsoleOutput;
 use Symfony\Component\Console\Question\ChoiceQuestion;
 use Symfony\Component\Console\Question\ConfirmationQuestion;
 use Symfony\Component\Console\Question\Question;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * A wrapper for Symfony ConsoleOutput and related helpers
@@ -149,12 +150,17 @@ class ConsoleOutput
      * @param array $choices List of choices to pick from
      * @param bool $default The default answer if the user enters nothing
      * @param bool $multiSelect If TRUE the result will be an array with the selected options. Multiple options can be given separated by commas
-     * @param bool|int $attempts Max number of times to ask before giving up (false by default, which means infinite)
+     * @param null|bool|int $attempts Max number of times to ask before giving up (null by default, which means infinite)
      * @return int|string|array The selected value or values (the key of the choices array)
      * @throws \InvalidArgumentException
      */
-    public function select($question, $choices, $default = null, $multiSelect = false, $attempts = false)
+    public function select($question, $choices, $default = null, $multiSelect = false, $attempts = null)
     {
+        // boolean option is @deprecated in TYPO3 v8, will be removed in TYPO3 v9
+        if ($attempts === false) {
+            GeneralUtility::deprecationLog('CLI output select() asks for infinite attempts by setting the value to "false", but should be null by default. Use "null" instead in your CommandController.');
+            $attempts = null;
+        }
         $question = (new ChoiceQuestion($question, $choices, $default))
             ->setMultiselect($multiSelect)
             ->setMaxAttempts($attempts)
@@ -222,14 +228,19 @@ class ConsoleOutput
      *
      * @param string|array $question The question to ask. If an array each array item is turned into one line of a multi-line question
      * @param callable $validator A PHP callback that gets a value and is expected to return the (transformed) value or throw an exception if it wasn't valid
-     * @param int|bool $attempts Max number of times to ask before giving up (false by default, which means infinite)
+     * @param int|null|bool $attempts Max number of times to ask before giving up (null by default, which means infinite)
      * @param string $default The default answer if none is given by the user
      * @param array $autocomplete List of values to autocomplete. This only works if "stty" is installed
      * @return mixed
      * @throws \Exception When any of the validators return an error
      */
-    public function askAndValidate($question, $validator, $attempts = false, $default = null, array $autocomplete = null)
+    public function askAndValidate($question, $validator, $attempts = null, $default = null, array $autocomplete = null)
     {
+        // boolean option is @deprecated in TYPO3 v8, will be removed in TYPO3 v9
+        if ($attempts === false) {
+            GeneralUtility::deprecationLog('CLI output askAndValidate() sets infinite attempts by setting the value to "false", but should be null by default. Use "null" instead in your CommandController.');
+            $attempts = null;
+        }
         $question = (new Question($question, $default))
             ->setValidator($validator)
             ->setMaxAttempts($attempts)