Skip to content

Commit e7a43ff

Browse files
committed
Merge branch '7.4' into 8.0
* 7.4: Minor tweaks [Console] Document invokable command
2 parents c5e40dc + 2f9c5cc commit e7a43ff

23 files changed

+203
-305
lines changed

components/console/changing_default_command.rst

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,14 @@ name to the ``setDefaultCommand()`` method::
99

1010
use Symfony\Component\Console\Attribute\AsCommand;
1111
use Symfony\Component\Console\Command\Command;
12-
use Symfony\Component\Console\Input\InputInterface;
13-
use Symfony\Component\Console\Output\OutputInterface;
12+
use Symfony\Component\Console\Style\SymfonyStyle;
1413

15-
#[AsCommand(name: 'hello:world')]
14+
#[AsCommand(name: 'hello:world', description: 'Outputs "Hello World"')]
1615
class HelloWorldCommand extends Command
1716
{
18-
protected function configure(): void
17+
public function __invoke(SymfonyStyle $io): int
1918
{
20-
$this->setDescription('Outputs "Hello World"');
21-
}
22-
23-
protected function execute(InputInterface $input, OutputInterface $output): int
24-
{
25-
$output->writeln('Hello World');
19+
$io->writeln('Hello World');
2620

2721
return Command::SUCCESS;
2822
}

components/console/events.rst

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -209,36 +209,32 @@ method::
209209
for these constants to be available.
210210

211211
If you use the Console component inside a Symfony application, commands can
212-
handle signals themselves. To do so, implement the
213-
:class:`Symfony\\Component\\Console\\Command\\SignalableCommandInterface` and subscribe to one or more signals::
212+
handle signals themselves by subscribing to the :class:`Symfony\\Component\\Console\\Event\\ConsoleSignalEvent` event::
214213

215-
// src/Command/SomeCommand.php
214+
// src/Command/MyCommand.php
216215
namespace App\Command;
217216

218-
use Symfony\Component\Console\Command\Command;
219-
use Symfony\Component\Console\Command\SignalableCommandInterface;
217+
use Symfony\Component\Console\Attribute\AsCommand;
218+
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
220219

221-
class SomeCommand extends Command implements SignalableCommandInterface
220+
#[AsCommand(name: 'app:my-command')]
221+
class MyCommand
222222
{
223223
// ...
224224

225-
public function getSubscribedSignals(): array
225+
#[AsEventListener(ConsoleSignalEvent::class)]
226+
public function handleSignal(ConsoleSignalEvent $event): void
226227
{
227-
// return here any of the constants defined by PCNTL extension
228-
return [\SIGINT, \SIGTERM];
229-
}
230-
231-
public function handleSignal(int $signal): int|false
232-
{
233-
if (\SIGINT === $signal) {
228+
// set here any of the constants defined by PCNTL extension
229+
if (in_array($event->getHandlingSignal(), [\SIGINT, \SIGTERM], true)) {
234230
// ...
235231
}
236232

237233
// ...
238234

239-
// return an integer to set the exit code, or
235+
// set an integer exit code, or
240236
// false to continue normal execution
241-
return 0;
237+
$event->setExitCode(0);
242238
}
243239
}
244240

components/console/helpers/cursor.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ of the output:
1313
// src/Command/MyCommand.php
1414
namespace App\Command;
1515
16-
use Symfony\Component\Console\Command\Command;
16+
use Symfony\Component\Console\Attribute\AsCommand;
1717
use Symfony\Component\Console\Cursor;
18-
use Symfony\Component\Console\Input\InputInterface;
1918
use Symfony\Component\Console\Output\OutputInterface;
2019
21-
class MyCommand extends Command
20+
#[AsCommand(name: 'app:my-command')]
21+
class MyCommand
2222
{
2323
// ...
2424
25-
public function execute(InputInterface $input, OutputInterface $output): int
25+
public function __invoke(OutputInterface $output): int
2626
{
2727
// ...
2828

components/console/helpers/debug_formatter.rst

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@ this:
1010
.. image:: /_images/components/console/debug_formatter.png
1111
:alt: Console output, with the first line showing "RUN Running figlet", followed by lines showing the output of the command prefixed with "OUT" and "RES Finished the command" as last line in the output.
1212

13-
Using the debug_formatter
13+
Using the Debug Formatter
1414
-------------------------
1515

16-
The formatter is included in the default helper set and you can get it by
17-
calling :method:`Symfony\\Component\\Console\\Command\\Command::getHelper`::
16+
The debug formatter helper can be instantiated directly as shown::
1817

19-
$debugFormatter = $this->getHelper('debug_formatter');
18+
$debugFormatter = new DebugFormatterHelper();
2019

21-
The formatter accepts strings and returns a formatted string, which you then
20+
It accepts strings and returns a formatted string, which you then
2221
output to the console (or even log the information or do anything else).
2322

2423
All methods of this helper have an identifier as the first argument. This is a

components/console/helpers/formatterhelper.rst

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
Formatter Helper
22
================
33

4-
The Formatter helper provides functions to format the output with colors.
5-
You can do more advanced things with this helper than you can in
6-
:doc:`/console/coloring`.
4+
The :class:`Symfony\\Component\\Console\\Helper\\FormatterHelper` helper provides
5+
functions to format the output with colors. You can do more advanced things with
6+
this helper than you can with the :doc:`basic colors and styles </console/coloring>`::
77

8-
The :class:`Symfony\\Component\\Console\\Helper\\FormatterHelper` is included
9-
in the default helper set and you can get it by calling
10-
:method:`Symfony\\Component\\Console\\Command\\Command::getHelper`::
11-
12-
$formatter = $this->getHelper('formatter');
8+
$formatter = new FormatterHelper();
139

1410
The methods return a string, which you'll usually render to the console by
1511
passing it to the

components/console/helpers/processhelper.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ a very verbose verbosity (e.g. ``-vv``)::
1111

1212
use Symfony\Component\Process\Process;
1313

14-
$helper = $this->getHelper('process');
14+
$helper = new ProcessHelper();
1515
$process = new Process(['figlet', 'Symfony']);
1616

1717
$helper->run($output, $process);

components/console/helpers/questionhelper.rst

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ Question Helper
22
===============
33

44
The :class:`Symfony\\Component\\Console\\Helper\\QuestionHelper` provides
5-
functions to ask the user for more information. It is included in the default
6-
helper set and you can get it by calling
7-
:method:`Symfony\\Component\\Console\\Command\\Command::getHelper`::
5+
functions to ask the user for more information::
86

9-
$helper = $this->getHelper('question');
7+
$helper = new QuestionHelper();
108

119
The Question Helper has a single method
1210
:method:`Symfony\\Component\\Console\\Helper\\QuestionHelper::ask` that needs an
@@ -27,18 +25,18 @@ Suppose you want to confirm an action before actually executing it. Add
2725
the following to your command::
2826

2927
// ...
28+
use Symfony\Component\Console\Attribute\AsCommand;
3029
use Symfony\Component\Console\Command\Command;
3130
use Symfony\Component\Console\Input\InputInterface;
3231
use Symfony\Component\Console\Output\OutputInterface;
3332
use Symfony\Component\Console\Question\ConfirmationQuestion;
3433

35-
class YourCommand extends Command
34+
#[AsCommand(name: 'app:my-command')]
35+
class MyCommand
3636
{
37-
// ...
38-
39-
public function execute(InputInterface $input, OutputInterface $output): int
37+
public function __invoke(InputInterface $input, OutputInterface $output): int
4038
{
41-
$helper = $this->getHelper('question');
39+
$helper = new QuestionHelper();
4240
$question = new ConfirmationQuestion('Continue with this action?', false);
4341

4442
if (!$helper->ask($input, $output, $question)) {
@@ -91,7 +89,7 @@ if you want to know a bundle name, you can add this to your command::
9189
use Symfony\Component\Console\Question\Question;
9290

9391
// ...
94-
public function execute(InputInterface $input, OutputInterface $output): int
92+
public function __invoke(InputInterface $input, OutputInterface $output): int
9593
{
9694
// ...
9795
$question = new Question('Please enter the name of the bundle', 'AcmeDemoBundle');
@@ -121,10 +119,10 @@ but ``red`` could be set instead (could be more explicit)::
121119
use Symfony\Component\Console\Question\ChoiceQuestion;
122120

123121
// ...
124-
public function execute(InputInterface $input, OutputInterface $output): int
122+
public function __invoke(InputInterface $input, OutputInterface $output): int
125123
{
126124
// ...
127-
$helper = $this->getHelper('question');
125+
$helper = new QuestionHelper();
128126
$question = new ChoiceQuestion(
129127
'Please select your favorite color (defaults to red)',
130128
// choices can also be PHP objects that implement __toString() method
@@ -184,10 +182,10 @@ this use :method:`Symfony\\Component\\Console\\Question\\ChoiceQuestion::setMult
184182
use Symfony\Component\Console\Question\ChoiceQuestion;
185183

186184
// ...
187-
public function execute(InputInterface $input, OutputInterface $output): int
185+
public function __invoke(InputInterface $input, OutputInterface $output): int
188186
{
189187
// ...
190-
$helper = $this->getHelper('question');
188+
$helper = new QuestionHelper();
191189
$question = new ChoiceQuestion(
192190
'Please select your favorite colors (defaults to red and blue)',
193191
['red', 'blue', 'yellow'],
@@ -218,10 +216,10 @@ will be autocompleted as the user types::
218216
use Symfony\Component\Console\Question\Question;
219217

220218
// ...
221-
public function execute(InputInterface $input, OutputInterface $output): int
219+
public function __invoke(InputInterface $input, OutputInterface $output): int
222220
{
223221
// ...
224-
$helper = $this->getHelper('question');
222+
$helper = new QuestionHelper();
225223

226224
$bundles = ['AcmeDemoBundle', 'AcmeBlogBundle', 'AcmeStoreBundle'];
227225
$question = new Question('Please enter the name of a bundle', 'FooBundle');
@@ -241,9 +239,9 @@ provide a callback function to dynamically generate suggestions::
241239
use Symfony\Component\Console\Question\Question;
242240

243241
// ...
244-
public function execute(InputInterface $input, OutputInterface $output): int
242+
public function __invoke(InputInterface $input, OutputInterface $output): int
245243
{
246-
$helper = $this->getHelper('question');
244+
$helper = new QuestionHelper();
247245

248246
// This function is called whenever the input changes and new
249247
// suggestions are needed.
@@ -282,10 +280,10 @@ You can also specify if you want to not trim the answer by setting it directly w
282280
use Symfony\Component\Console\Question\Question;
283281

284282
// ...
285-
public function execute(InputInterface $input, OutputInterface $output): int
283+
public function __invoke(InputInterface $input, OutputInterface $output): int
286284
{
287285
// ...
288-
$helper = $this->getHelper('question');
286+
$helper = new QuestionHelper();
289287

290288
$question = new Question('What is the name of the child?');
291289
$question->setTrimmable(false);
@@ -308,10 +306,10 @@ the response to a question should allow multiline answers by passing ``true`` to
308306
use Symfony\Component\Console\Question\Question;
309307

310308
// ...
311-
public function execute(InputInterface $input, OutputInterface $output): int
309+
public function __invoke(InputInterface $input, OutputInterface $output): int
312310
{
313311
// ...
314-
$helper = $this->getHelper('question');
312+
$helper = new QuestionHelper();
315313

316314
$question = new Question('How do you solve world peace?');
317315
$question->setMultiline(true);
@@ -335,10 +333,10 @@ convenient for passwords::
335333
use Symfony\Component\Console\Question\Question;
336334

337335
// ...
338-
public function execute(InputInterface $input, OutputInterface $output): int
336+
public function __invoke(InputInterface $input, OutputInterface $output): int
339337
{
340338
// ...
341-
$helper = $this->getHelper('question');
339+
$helper = new QuestionHelper();
342340

343341
$question = new Question('What is the database password?');
344342
$question->setHidden(true);
@@ -372,10 +370,10 @@ convenient for passwords::
372370
use Symfony\Component\Console\Question\ChoiceQuestion;
373371

374372
// ...
375-
public function execute(InputInterface $input, OutputInterface $output): int
373+
public function __invoke(InputInterface $input, OutputInterface $output): int
376374
{
377375
// ...
378-
$helper = $this->getHelper('question');
376+
$helper = new QuestionHelper();
379377
QuestionHelper::disableStty();
380378

381379
// ...
@@ -396,10 +394,10 @@ method::
396394
use Symfony\Component\Console\Question\Question;
397395

398396
// ...
399-
public function execute(InputInterface $input, OutputInterface $output): int
397+
public function __invoke(InputInterface $input, OutputInterface $output): int
400398
{
401399
// ...
402-
$helper = $this->getHelper('question');
400+
$helper = new QuestionHelper();
403401

404402
$question = new Question('Please enter the name of the bundle', 'AcmeDemoBundle');
405403
$question->setNormalizer(function (string $value): string {
@@ -434,10 +432,10 @@ method::
434432
use Symfony\Component\Console\Question\Question;
435433

436434
// ...
437-
public function execute(InputInterface $input, OutputInterface $output): int
435+
public function __invoke(InputInterface $input, OutputInterface $output): int
438436
{
439437
// ...
440-
$helper = $this->getHelper('question');
438+
$helper = new QuestionHelper();
441439

442440
$question = new Question('Please enter the name of the bundle', 'AcmeDemoBundle');
443441
$question->setValidator(function (string $answer): string {
@@ -494,10 +492,10 @@ You can also use a validator with a hidden question::
494492
use Symfony\Component\Console\Question\Question;
495493

496494
// ...
497-
public function execute(InputInterface $input, OutputInterface $output): int
495+
public function __invoke(InputInterface $input, OutputInterface $output): int
498496
{
499497
// ...
500-
$helper = $this->getHelper('question');
498+
$helper = new QuestionHelper();
501499

502500
$question = new Question('Please enter your password');
503501
$question->setNormalizer(function (?string $value): string {

components/console/helpers/table.rst

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ features, use the ``Table`` console helper explained in this article.
1010
To display a table, use :class:`Symfony\\Component\\Console\\Helper\\Table`,
1111
set the headers, set the rows and then render the table::
1212

13+
use Symfony\Component\Console\Attribute\AsCommand;
1314
use Symfony\Component\Console\Command\Command;
1415
use Symfony\Component\Console\Helper\Table;
15-
use Symfony\Component\Console\Input\InputInterface;
1616
use Symfony\Component\Console\Output\OutputInterface;
1717
// ...
1818

19-
class SomeCommand extends Command
19+
#[AsCommand(name: 'app:my-command')]
20+
class MyCommand
2021
{
21-
public function execute(InputInterface $input, OutputInterface $output): int
22+
public function __invoke(OutputInterface $output): int
2223
{
2324
$table = new Table($output);
2425
$table
@@ -468,9 +469,10 @@ The only requirement to append rows is that the table must be rendered inside a
468469
use Symfony\Component\Console\Helper\Table;
469470
// ...
470471

471-
class SomeCommand extends Command
472+
#[AsCommand(name: 'app:my-command')]
473+
class MyCommand
472474
{
473-
public function execute(InputInterface $input, OutputInterface $output): int
475+
public function __invoke(OutputInterface $output): int
474476
{
475477
$section = $output->section();
476478
$table = new Table($section);

components/console/helpers/tree.rst

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,17 @@ inside your console command::
2222
namespace App\Command;
2323

2424
use Symfony\Component\Console\Attribute\AsCommand;
25-
use Symfony\Component\Console\Command\Command;
2625
use Symfony\Component\Console\Helper\TreeHelper;
2726
use Symfony\Component\Console\Helper\TreeNode;
28-
use Symfony\Component\Console\Input\InputInterface;
29-
use Symfony\Component\Console\Output\OutputInterface;
3027
use Symfony\Component\Console\Style\SymfonyStyle;
3128

32-
#[AsCommand(name: 'app:some-command', description: '...')]
33-
class SomeCommand extends Command
29+
#[AsCommand(name: 'app:my-command', description: '...')]
30+
class MyCommand
3431
{
3532
// ...
3633

37-
protected function execute(InputInterface $input, OutputInterface $output): int
34+
public function __invoke(SymfonyStyle $io): int
3835
{
39-
$io = new SymfonyStyle($input, $output);
40-
4136
$node = TreeNode::fromValues([
4237
'config/',
4338
'public/',

0 commit comments

Comments
 (0)