Skip to content

Commit 262fb43

Browse files
committed
Merge branch '5.4' into 6.0
* 5.4: No longer mention a deprecated interface Document console completion Fix invalid interface mention in security.rst
2 parents 80a2dab + f679e20 commit 262fb43

File tree

5 files changed

+207
-36
lines changed

5 files changed

+207
-36
lines changed
150 KB
Loading

console.rst

Lines changed: 109 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,90 @@ The Symfony framework provides lots of commands through the ``bin/console`` scri
99
created with the :doc:`Console component </components/console>`. You can also
1010
use it to create your own commands.
1111

12-
The Console: APP_ENV & APP_DEBUG
13-
---------------------------------
12+
Running Commands
13+
----------------
14+
15+
Each Symfony application comes with a large set of commands. You can use
16+
the ``list`` command to view all available commands in the application:
17+
18+
.. code-block:: terminal
19+
20+
$ php bin/console list
21+
...
22+
23+
Available commands:
24+
about Display information about the current project
25+
completion Dump the shell completion script
26+
help Display help for a command
27+
list List commands
28+
assets
29+
assets:install Install bundle's web assets under a public directory
30+
cache
31+
cache:clear Clear the cache
32+
...
33+
34+
If you find the command you need, you can run it with the ``--help`` option
35+
to view the command's documentation:
36+
37+
.. code-block:: terminal
38+
39+
$ php bin/console assets:install --help
40+
41+
APP_ENV & APP_DEBUG
42+
~~~~~~~~~~~~~~~~~~~
1443

1544
Console commands run in the :ref:`environment <config-dot-env>` defined in the ``APP_ENV``
1645
variable of the ``.env`` file, which is ``dev`` by default. It also reads the ``APP_DEBUG``
1746
value to turn "debug" mode on or off (it defaults to ``1``, which is on).
1847

1948
To run the command in another environment or debug mode, edit the value of ``APP_ENV``
20-
and ``APP_DEBUG``.
49+
and ``APP_DEBUG``. You can also define this env vars when running the
50+
command, for instance:
51+
52+
.. code-block:: terminal
53+
54+
# clears the cache for the prod environment
55+
$ APP_ENV=prod php bin/console cache:clear
56+
57+
.. _console-completion-setup:
58+
59+
Console Completion
60+
~~~~~~~~~~~~~~~~~~
61+
62+
.. versionadded:: 5.4
63+
64+
Console completion for Bash was introduced in Symfony 5.4.
65+
66+
If you are using the Bash shell, you can install Symfony's completion
67+
script to get auto completion when typing commands in the terminal. All
68+
commands support name and option completion, and some can even complete
69+
values.
70+
71+
.. image:: /_images/components/console/completion.gif
72+
73+
First, make sure you installed and setup the "bash completion" package for
74+
your OS (typically named ``bash-completion``). Then, install the Symfony
75+
completion bash script *once* by running the ``completion`` command in a
76+
Symfony app installed on your computer:
77+
78+
.. code-block:: terminal
79+
80+
$ php bin/console completion bash | sudo tee /etc/bash_completion.d/console-events-terminate
81+
# after the installation, restart the shell
82+
83+
Now you are all set to use the auto completion for all Symfony Console
84+
applications on your computer. By default, you can get a list of complete
85+
options by pressing the Tab key.
86+
87+
.. tip::
88+
89+
Many PHP tools are built using the Symfony Console component (e.g.
90+
Composer, PHPstan and Behat). If they are using version 5.4 or higher,
91+
you can also install their completion script to enable console completion:
92+
93+
.. code-block:: terminal
94+
95+
$ php vendor/bin/phpstan completion bash | sudo tee /etc/bash_completion.d/phpstan
2196
2297
Creating a Command
2398
------------------
@@ -38,11 +113,6 @@ want a command to create a user::
38113
// the name of the command (the part after "bin/console")
39114
protected static $defaultName = 'app:create-user';
40115

41-
protected function configure(): void
42-
{
43-
// ...
44-
}
45-
46116
protected function execute(InputInterface $input, OutputInterface $output): int
47117
{
48118
// ... put here the code to create the user
@@ -65,37 +135,41 @@ want a command to create a user::
65135
}
66136

67137
Configuring the Command
68-
-----------------------
138+
~~~~~~~~~~~~~~~~~~~~~~~
69139

70140
You can optionally define a description, help message and the
71-
:doc:`input options and arguments </console/input>`::
141+
:doc:`input options and arguments </console/input>` by overriding the
142+
``configure()`` method::
72143

73-
// ...
74-
// the command description shown when running "php bin/console list"
75-
protected static $defaultDescription = 'Creates a new user.';
144+
// src/Command/CreateUserCommand.php
76145

77146
// ...
78-
protected function configure(): void
147+
class CreateUserCommand extends Command
79148
{
80-
$this
81-
// If you don't like using the $defaultDescription static property,
82-
// you can also define the short description using this method:
83-
// ->setDescription('...')
149+
// the command description shown when running "php bin/console list"
150+
protected static $defaultDescription = 'Creates a new user.';
84151

85-
// the command help shown when running the command with the "--help" option
86-
->setHelp('This command allows you to create a user...')
87-
;
152+
// ...
153+
protected function configure(): void
154+
{
155+
$this
156+
// the command help shown when running the command with the "--help" option
157+
->setHelp('This command allows you to create a user...')
158+
;
159+
}
88160
}
89161

90-
Defining the ``$defaultDescription`` static property instead of using the
91-
``setDescription()`` method allows to get the command description without
92-
instantiating its class. This makes the ``php bin/console list`` command run
93-
much faster.
162+
.. tip::
163+
164+
Defining the ``$defaultDescription`` static property instead of using the
165+
``setDescription()`` method allows to get the command description without
166+
instantiating its class. This makes the ``php bin/console list`` command run
167+
much faster.
94168

95-
If you want to always run the ``list`` command fast, add the ``--short`` option
96-
to it (``php bin/console list --short``). This will avoid instantiating command
97-
classes, but it won't show any description for commands that use the
98-
``setDescription()`` method instead of the static property.
169+
If you want to always run the ``list`` command fast, add the ``--short`` option
170+
to it (``php bin/console list --short``). This will avoid instantiating command
171+
classes, but it won't show any description for commands that use the
172+
``setDescription()`` method instead of the static property.
99173

100174
The ``configure()`` method is called automatically at the end of the command
101175
constructor. If your command defines its own constructor, set the properties
@@ -130,7 +204,7 @@ available in the ``configure()`` method::
130204
}
131205

132206
Registering the Command
133-
-----------------------
207+
~~~~~~~~~~~~~~~~~~~~~~~
134208

135209
In PHP 8 and newer versions, you can register the command by adding the
136210
``AsCommand`` attribute to it::
@@ -141,6 +215,8 @@ In PHP 8 and newer versions, you can register the command by adding the
141215
use Symfony\Component\Console\Attribute\AsCommand;
142216
use Symfony\Component\Console\Command\Command;
143217

218+
// the "name" and "description" arguments of AsCommand replace the
219+
// static $defaultName and $defaultDescription properties
144220
#[AsCommand(
145221
name: 'app:create-user',
146222
description: 'Creates a new user.',
@@ -157,8 +233,8 @@ If you can't use PHP attributes, register the command as a service and
157233
:ref:`default services.yaml configuration <service-container-services-load-example>`,
158234
this is already done for you, thanks to :ref:`autoconfiguration <services-autoconfigure>`.
159235

160-
Executing the Command
161-
---------------------
236+
Running the Command
237+
~~~~~~~~~~~~~~~~~~~
162238

163239
After configuring and registering the command, you can run it in the terminal:
164240

@@ -440,7 +516,7 @@ call ``setAutoExit(false)`` on it to get the command result in ``CommandTester``
440516

441517
$application = new Application();
442518
$application->setAutoExit(false);
443-
519+
444520
$tester = new ApplicationTester($application);
445521

446522
.. note::

console/input.rst

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,4 +304,91 @@ The above code can be simplified as follows because ``false !== null``::
304304
$yell = ($optionValue !== false);
305305
$yellLouder = ($optionValue === 'louder');
306306

307+
Adding Argument/Option Value Completion
308+
---------------------------------------
309+
310+
.. versionadded:: 5.4
311+
312+
Console completion was introduced in Symfony 5.4.
313+
314+
If :ref:`Console completion is installed <console-completion-setup>`,
315+
command and option names will be auto completed by the shell. However, you
316+
can also implement value completion for the input in your commands. For
317+
instance, you may want to complete all usernames from the database in the
318+
``name`` argument of your greet command.
319+
320+
To achieve this, override the ``complete()`` method in the command::
321+
322+
// ...
323+
use Symfony\Component\Console\Completion\CompletionInput;
324+
use Symfony\Component\Console\Completion\CompletionSuggestions;
325+
326+
class GreetCommand extends Command
327+
{
328+
// ...
329+
330+
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
331+
{
332+
if ($input->mustSuggestArgumentValuesFor('names')) {
333+
// the user asks for completion input for the "names" option
334+
335+
// the value the user already typed, e.g. when typing "app:greet Fa" before
336+
// pressing Tab, this will contain "Fa"
337+
$currentValue = $input->getCompletionValue();
338+
339+
// get the list of username names from somewhere (e.g. the database)
340+
// you may use $currentValue to filter down the names
341+
$availableUsernames = ...;
342+
343+
// then add the retrieved names as suggested values
344+
$suggestions->suggestValues($availableUsernames);
345+
}
346+
}
347+
}
348+
349+
That's all you need! Assuming users "Fabien" and "Fabrice" exist, pressing
350+
tab after typing ``app:greet Fa`` will give you these names as a suggestion.
351+
352+
.. tip::
353+
354+
The bash shell is able to handle huge amounts of suggestions and will
355+
automatically filter the suggested values based on the existing input
356+
from the user. You do not have to implement any filter logic in the
357+
command.
358+
359+
You may use ``CompletionInput::getCompletionValue()`` to get the
360+
current input if that helps improving performance (e.g. by reducing the
361+
number of rows fetched from the database).
362+
363+
Testing the Completion script
364+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
365+
366+
The Console component comes with a special
367+
:class:`Symfony\\Component\\Console\\Test\\CommandCompletionTester`` class
368+
to help you unit test the completion logic::
369+
370+
// ...
371+
use Symfony\Component\Console\Application;
372+
373+
class GreetCommandTest extends TestCase
374+
{
375+
public function testComplete()
376+
{
377+
$application = new Application();
378+
$application->add(new GreetCommand());
379+
380+
// create a new tester with the greet command
381+
$tester = new CommandCompletionTester($application->get('app:greet'));
382+
383+
// complete the input without any existing input (the empty string represents
384+
// the position of the cursor)
385+
$suggestions = $tester->complete(['']);
386+
$this->assertSame(['Fabien', 'Fabrice', 'Wouter'], $suggestions);
387+
388+
// complete the input with "Fa" as input
389+
$suggestions = $tester->complete(['Fa']);
390+
$this->assertSame(['Fabien', 'Fabrice'], $suggestions);
391+
}
392+
}
393+
307394
.. _`docopt standard`: http://docopt.org/

page_creation.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@ the debugging routes in the next section.
195195

196196
You'll learn about many more commands as you continue!
197197

198+
.. tip::
199+
200+
If you are using the Bash shell, you can set up completion support.
201+
This autocompletes commands and other input when using ``bin/console``.
202+
See :ref:`the Console document <console-completion-setup>` for more
203+
information on how to set up completion.
204+
198205
.. _web-debug-toolbar:
199206

200207
The Web Debug Toolbar: Debugging Dream

security.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2451,9 +2451,10 @@ However, in some cases, this process can cause unexpected authentication problem
24512451
If you're having problems authenticating, it could be that you *are* authenticating
24522452
successfully, but you immediately lose authentication after the first redirect.
24532453

2454-
In that case, review the serialization logic (e.g. ``SerializableInterface``) on
2455-
you user class (if you have any) to make sure that all the fields necessary are
2456-
serialized.
2454+
In that case, review the serialization logic (e.g. the ``__serialize()`` or
2455+
``serialize()`` methods) on you user class (if you have any) to make sure
2456+
that all the fields necessary are serialized and also exclude all the
2457+
fields not necessary to be serialized (e.g. Doctrine relations).
24572458

24582459
Comparing Users Manually with EquatableInterface
24592460
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)