From aabb62e72fc8173f454efe82564ece273f138dbc Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Mon, 15 Aug 2022 00:50:08 +0200 Subject: [PATCH 001/670] Removing 2 distracting scenarios Reason: Too many numbers are only distracting from the message - anybody can image that all numbers are just arbitrary examples... Other problem: The axis legends "1 hour window" in the SVG are overlapping: https://symfony.com/doc/5.4/rate_limiter.html#fixed-window-rate-limiter Maybe either reduce the font size, or reword to just "window" --- rate_limiter.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rate_limiter.rst b/rate_limiter.rst index 65a0243e5e8..a5b73ac4735 100644 --- a/rate_limiter.rst +++ b/rate_limiter.rst @@ -35,8 +35,7 @@ Fixed Window Rate Limiter ~~~~~~~~~~~~~~~~~~~~~~~~~ This is the simplest technique and it's based on setting a limit for a given -interval of time (e.g. 5,000 requests per hour or 3 login attempts every 15 -minutes). +interval of time. In the diagram below, the limit is set to "5 tokens per hour". Each window starts at the first hit (i.e. 10:15, 11:30 and 12:30). As soon as there are @@ -48,11 +47,11 @@ squares). Its main drawback is that resource usage is not evenly distributed in time and -it can overload the server at the window edges. In the previous example, +it can overload the server at the window edges. In this example, there were 6 accepted requests between 11:00 and 12:00. This is more significant with bigger limits. For instance, with 5,000 requests -per hour, a user could make the 4,999 requests in the last minute of some +per hour, a user could make 4,999 requests in the last minute of some hour and another 5,000 requests during the first minute of the next hour, making 9,999 requests in total in two minutes and possibly overloading the server. These periods of excessive usage are called "bursts". From 9262483ce3346eda0dc167b53bfea42adf2c98d1 Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Thu, 10 Nov 2022 22:54:22 +0100 Subject: [PATCH 002/670] Consistent naming of `FormLoginAuthenticator` Reason: Make it more clear that we're always talking about the same **built-in** thing. --- security.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/security.rst b/security.rst index 583f5e19f9a..abfa7c1e7c8 100644 --- a/security.rst +++ b/security.rst @@ -660,7 +660,7 @@ Form Login Most websites have a login form where users authenticate using an identifier (e.g. email address or username) and a password. This -functionality is provided by the *form login authenticator*. +functionality is provided by the built-in :class:`Symfony\\Component\\Security\\Http\Authenticator\\FormLoginAuthenticator`. First, create a controller for the login form: @@ -691,7 +691,7 @@ First, create a controller for the login form: } } -Then, enable the form login authenticator using the ``form_login`` setting: +Then, enable the ``FormLoginAuthenticator`` using the ``form_login`` setting: .. configuration-block:: @@ -784,8 +784,8 @@ Edit the login controller to render the login form: } } -Don't let this controller confuse you. Its job is only to *render* the form: -the ``form_login`` authenticator will handle the form *submission* automatically. +Don't let this controller confuse you. Its job is only to *render* the form. +The ``FormLoginAuthenticator`` will handle the form *submission* automatically. If the user submits an invalid email or password, that authenticator will store the error and redirect back to this controller, where we read the error (using ``AuthenticationUtils``) so that it can be displayed back to the user. @@ -857,7 +857,7 @@ To review the whole process: #. The ``/login`` page renders login form via the route and controller created in this example; #. The user submits the login form to ``/login``; -#. The security system (i.e. the ``form_login`` authenticator) intercepts the +#. The security system (i.e. the ``FormLoginAuthenticator``) intercepts the request, checks the user's submitted credentials, authenticates the user if they are correct, and sends the user back to the login form if they are not. From 06c08093c40f4fdfe3b1a05824bbbfb8c6424f32 Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Sat, 19 Nov 2022 18:25:56 +0100 Subject: [PATCH 003/670] Adding info about when the firewall needs to encompass all pages --- security.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/security.rst b/security.rst index 845b86c3039..21247c146fc 100644 --- a/security.rst +++ b/security.rst @@ -588,15 +588,13 @@ will be able to authenticate (e.g. login form, API token, etc). Only one firewall is active on each request: Symfony uses the ``pattern`` key to find the first match (you can also :doc:`match by host or other things `). +Here, all "real" URLs are handled by the ``main`` firewall (no ``pattern`` key means +it matches *all* URLs). The ``dev`` firewall is really a fake firewall: it makes sure that you don't accidentally block Symfony's dev tools - which live under URLs like ``/_profiler`` and ``/_wdt``. -All *real* URLs are handled by the ``main`` firewall (no ``pattern`` key means -it matches *all* URLs). A firewall can have many modes of authentication, -in other words, it enables many ways to ask the question "Who are you?". - Often, the user is unknown (i.e. not logged in) when they first visit your website. If you visit your homepage right now, you *will* have access and you'll see that you're visiting a page behind the firewall in the toolbar: @@ -606,7 +604,14 @@ you'll see that you're visiting a page behind the firewall in the toolbar: Visiting a URL under a firewall doesn't necessarily require you to be authenticated (e.g. the login form has to be accessible or some parts of your application -are public). You'll learn how to restrict access to URLs, controllers or +are public). On the other hand, all pages that you want to be *aware* of a logged in +user have to be under the same firewall. So if you want to display a "You are logged in +as ..." message on every page, they all have to be included in the same firewall. + +The same firewall can have many modes of authentication, +in other words, it enables many ways to ask the question "Who are you?". + +You'll learn how to restrict access to URLs, controllers or anything else within your firewall in the :ref:`access control ` section. From 6c19fa7a835ca9407bde4b7f91c9b2cb6fbc052f Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Tue, 6 Dec 2022 16:46:57 +0100 Subject: [PATCH 004/670] Changing versionadded 5.1 to note Reasons: * Info about 5.1 doesn't make sense in 5.4 anymore. * Link to `configureContainer` was dead anyway. --- configuration.rst | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/configuration.rst b/configuration.rst index 6d2638008fa..bf00e080262 100644 --- a/configuration.rst +++ b/configuration.rst @@ -60,13 +60,11 @@ configure your applications. Symfony lets you choose between YAML, XML and PHP and throughout the Symfony documentation, all configuration examples will be shown in these three formats. -.. versionadded:: 5.1 +.. note:: - Starting from Symfony 5.1, by default Symfony only loads the configuration + By default, Symfony only loads the configuration files defined in YAML format. If you define configuration in XML and/or PHP - formats, update the ``src/Kernel.php`` file to add support for the ``.xml`` - and ``.php`` file extensions by overriding the - :method:`Symfony\\Component\\HttpKernel\\Kernel::configureContainer` method:: + formats, update the ``src/Kernel.php`` file:: // src/Kernel.php use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; @@ -93,8 +91,8 @@ shown in these three formats. } There isn't any practical difference between formats. In fact, Symfony -transforms and caches all of them into PHP before running the application, so -there's not even any performance difference between them. +transforms all of them into PHP and caches them before running the application, so +there's not even any performance difference. YAML is used by default when installing packages because it's concise and very readable. These are the main advantages and disadvantages of each format: From 3d9dfe669f4557cc10d0ae0b188151113e736334 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Fri, 7 Apr 2023 17:09:46 +0200 Subject: [PATCH 005/670] [DependencyInjection] Document ServiceConfigurator remove method --- service_container/remove.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 service_container/remove.rst diff --git a/service_container/remove.rst b/service_container/remove.rst new file mode 100644 index 00000000000..da4fbf2e54e --- /dev/null +++ b/service_container/remove.rst @@ -0,0 +1,23 @@ +How to Remove a Service +======================= + +A service can be removed from the service container if needed +(for instance in the test or a specific environment): + +.. configuration-block:: + + .. code-block:: php + + // config/services_test.php + namespace Symfony\Component\DependencyInjection\Loader\Configurator; + + use App\RemovedService; + + return function(ContainerConfigurator $containerConfigurator) { + $services = $containerConfigurator->services(); + + $services->remove(RemovedService::class); + }; + +Now, the container will not contain the ``App\RemovedService`` +in the test environment. From 09d44cb4931c9572941799331ebbe26e012a72f3 Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Tue, 11 Apr 2023 18:13:38 +0200 Subject: [PATCH 006/670] Adding more details on `action` and `method` --- forms.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forms.rst b/forms.rst index 17223e15e10..a78eb2f4fe5 100644 --- a/forms.rst +++ b/forms.rst @@ -755,8 +755,9 @@ Set the ``label`` option on fields to define their labels explicitly:: Changing the Action and HTTP Method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -By default, a form will be submitted via an HTTP POST request to the same -URL under which the form was rendered. When building the form in the controller, +By default, the ``
`` tag will be rendered with a ``method="post"`` attribute, +and no ``action`` attribute, causing it to be submitted via an HTTP POST request to the same +URL under which it was rendered. When building the form, use the ``setAction()`` and ``setMethod()`` methods to change this:: // src/Controller/TaskController.php From 2e55bdadcb86479328bf09aea2d9f79b0a1643f4 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Wed, 12 Apr 2023 23:47:39 +0200 Subject: [PATCH 007/670] Flex private recipes with Gitlab --- setup/flex_private_recipes.rst | 101 +++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/setup/flex_private_recipes.rst b/setup/flex_private_recipes.rst index 5941ba2908f..14300e70258 100644 --- a/setup/flex_private_recipes.rst +++ b/setup/flex_private_recipes.rst @@ -8,7 +8,7 @@ private Symfony Flex recipe repositories, and seamlessly integrate them into the This is particularly useful when you have private bundles or packages that must perform their own installation tasks. To do this, you need to complete several steps: -* Create a private GitHub repository; +* Create a private repository; * Create your private recipes; * Create an index to the recipes; * Store your recipes in the private repository; @@ -16,14 +16,26 @@ perform their own installation tasks. To do this, you need to complete several s * Configure your project's ``composer.json`` file; and * Install the recipes in your project. -Create a Private GitHub Repository ----------------------------------- +.. _create-a-private-github-repository + +Create a Private Repository +--------------------------- + +GitHub +~~~~~~ Log in to your GitHub.com account, click your account icon in the top-right corner, and select **Your Repositories**. Then click the **New** button, fill in the **repository name**, select the **Private** radio button, and click the **Create Repository** button. +Gitlab +~~~~~~ + +Log in to your Gitlab.com account, click the **New project** button, select **Create blank project**, fill in +the **Project name**, select the **Private** radio button, and click the +**Create project** button. + Create Your Private Recipes --------------------------- @@ -124,6 +136,9 @@ Create an Index to the Recipes The next step is to create an ``index.json`` file, which will contain entries for all your private recipes, and other general configuration information. +GitHub +~~~~~~ + The ``index.json`` file has the following format: .. code-block:: json @@ -134,11 +149,11 @@ The ``index.json`` file has the following format: "1.0" ] }, - "branch": "master", + "branch": "main", "is_contrib": true, "_links": { "repository": "github.com/your-github-account-name/your-recipes-repository", - "origin_template": "{package}:{version}@github.com/your-github-account-name/your-recipes-repository:master", + "origin_template": "{package}:{version}@github.com/your-github-account-name/your-recipes-repository:main", "recipe_template": "https://api.github.com/repos/your-github-account-name/your-recipes-repository/contents/{package_dotted}.{version}.json" } } @@ -146,15 +161,43 @@ The ``index.json`` file has the following format: Create an entry in ``"recipes"`` for each of your bundle recipes. Replace ``your-github-account-name`` and ``your-recipes-repository`` with your own details. +Gitlab +~~~~~~ + +The ``index.json`` file has the following format: + +.. code-block:: json + + { + "recipes": { + "acme/private-bundle": [ + "1.0" + ] + }, + "branch": "main", + "is_contrib": true, + "_links": { + "repository": "gitlab.com/your-gitlab-account-name/your-recipes-repository", + "origin_template": "{package}:{version}@gitlab.com/your-gitlab-account-name/your-recipes-repository:main", + "recipe_template": "https://gitlab.com/api/v4/projects/your-gitlab-project-id/repository/files/{package_dotted}.{version}.json/raw?ref=main" + } + } + +Create an entry in ``"recipes"`` for each of your bundle recipes. Replace +``your-gitlab-account-name``, ``your-gitlab-repository`` and ``your-gitlab-project-id`` with your own details. + Store Your Recipes in the Private Repository -------------------------------------------- Upload the recipe ``.json`` file(s) and the ``index.json`` file into the root -directory of your private GitHub repository. +directory of your private repository. Grant ``composer`` Access to the Private Repository --------------------------------------------------- +GitHub +~~~~~~ + In your GitHub account, click your account icon in the top-right corner, select ``Settings`` and ``Developer Settings``. Then select ``Personal Access Tokens``. @@ -168,9 +211,29 @@ computer, and execute the following command: Replace ``[token]`` with the value of your GitHub personal access token. +Gitlab +~~~~~~ + +In your Gitlab account, click your account icon in the top-right corner, select +``Preferences`` and ``Access Tokens``. + +Generate a new personal access token with ``read_api`` and ``read_repository`` +scopes. Copy the access token value, switch to the terminal of your local +computer, and execute the following command: + +.. code-block:: terminal + + $ composer config --global --auth gitlab-oauth.gitlab.com [token] + +Replace ``[token]`` with the value of your Gitlab personal access token. + + Configure Your Project's ``composer.json`` File ----------------------------------------------- +GitHub +~~~~~~ + Add the following to your project's ``composer.json`` file: .. code-block:: json @@ -199,6 +262,32 @@ Replace ``your-github-account-name`` and ``your-recipes-repository`` with your o The ``endpoint`` URL **must** point to ``https://api.github.com/repos`` and **not** to ``https://www.github.com``. +Gitlab +~~~~~~ + +Add the following to your project's ``composer.json`` file: + +.. code-block:: json + + { + "extra": { + "symfony": { + "endpoint": [ + "https://gitlab.com/api/v4/projects/your-gitlab-project-id/repository/files/index.json/raw?ref=main", + "flex://defaults" + ] + } + } + } + +Replace ``your-gitlab-project-id`` with your own details. + +.. tip:: + + The ``extra.symfony`` key will most probably already exist in your + ``composer.json``. In that case, add the ``"endpoint"`` key to the existing + ``extra.symfony`` entry. + Install the Recipes in Your Project ----------------------------------- From 173203c187bd805a171a94218b06a0427374feb5 Mon Sep 17 00:00:00 2001 From: Matthieu Lempereur Date: Tue, 18 Apr 2023 17:43:17 +0200 Subject: [PATCH 008/670] improve links label in rememberMe doc --- security/remember_me.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/security/remember_me.rst b/security/remember_me.rst index 58fbeb6e959..1d69cc9a555 100644 --- a/security/remember_me.rst +++ b/security/remember_me.rst @@ -266,12 +266,14 @@ Signature based tokens By default, the remember me cookie contains a signature based on properties of the user. If the properties change, the signature changes and already generated tokens are no longer considered valid. See - :ref:`security-remember-me-signature` for more information. + :ref:`how to use them ` for more + information. Persistent tokens Persistent tokens store any generated token (e.g. in a database). This allows you to invalidate tokens by changing the rows in the database. - See :ref:`security-remember-me-persistent` for more information. + See :ref:`how to store tokens ` for more + information. .. note:: From 2e0598b69b6f4b3ff40a01fd0daaa343bab9f1c5 Mon Sep 17 00:00:00 2001 From: MrYamous Date: Thu, 20 Apr 2023 20:12:10 +0200 Subject: [PATCH 009/670] use attributes for entity example --- security.rst | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/security.rst b/security.rst index fb0ad14e2ac..a492e38fac7 100644 --- a/security.rst +++ b/security.rst @@ -125,32 +125,21 @@ from the `MakerBundle`_: use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; - /** - * @ORM\Entity(repositoryClass=UserRepository::class) - */ + #[ORM\Entity(repositoryClass: UserRepository::class)] class User implements UserInterface, PasswordAuthenticatedUserInterface { - /** - * @ORM\Id - * @ORM\GeneratedValue - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: 'integer')] private $id; - /** - * @ORM\Column(type="string", length=180, unique=true) - */ + #[ORM\Column(type: 'string', length: 180, unique: true)] private $email; - /** - * @ORM\Column(type="json") - */ + #[ORM\Column(type: 'json')] private $roles = []; - /** - * @var string The hashed password - * @ORM\Column(type="string") - */ + #[ORM\Column(type: 'string')] private $password; public function getId(): ?int From d09cf034f6a5cfe110fb2b35b670a3d2060c87a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20ADAM?= Date: Sat, 22 Apr 2023 16:13:04 +0200 Subject: [PATCH 010/670] [DI] Mark service as public with #[Autoconfigure] attribute --- service_container.rst | 20 ++++++++++++++++++++ service_container/alias_private.rst | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/service_container.rst b/service_container.rst index 47a421f1345..cdda1155344 100644 --- a/service_container.rst +++ b/service_container.rst @@ -927,6 +927,26 @@ setting: ; }; +It is also possible to define a service as public thanks to the ``#[Autoconfigure]`` +attribute. This attribute must be used directly on the class of the service +you want to configure:: + + // src/Service/PublicService.php + namespace App\Service; + + use Symfony\Component\DependencyInjection\Attribute\Autoconfigure; + + #[Autoconfigure(public: true)] + class PublicService + { + // ... + } + +.. versionadded:: 5.3 + + The ``#[Autoconfigure]`` attribute was introduced in Symfony 5.3. PHP + attributes require at least PHP 8.0. + .. deprecated:: 5.1 As of Symfony 5.1, it is no longer possible to autowire the service diff --git a/service_container/alias_private.rst b/service_container/alias_private.rst index 44a8492a53d..fc8bfa0f432 100644 --- a/service_container/alias_private.rst +++ b/service_container/alias_private.rst @@ -62,6 +62,26 @@ You can also control the ``public`` option on a service-by-service basis: ->public(); }; +It is also possible to define a service as public thanks to the ``#[Autoconfigure]`` +attribute. This attribute must be used directly on the class of the service +you want to configure:: + + // src/Service/Foo.php + namespace App\Service; + + use Symfony\Component\DependencyInjection\Attribute\Autoconfigure; + + #[Autoconfigure(public: true)] + class Foo + { + // ... + } + +.. versionadded:: 5.3 + + The ``#[Autoconfigure]`` attribute was introduced in Symfony 5.3. PHP + attributes require at least PHP 8.0. + .. _services-why-private: Private services are special because they allow the container to optimize whether From bf0d3a17bd816a0fd55ae3fa13bca727a10d09c2 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Wed, 26 Apr 2023 21:56:19 +0200 Subject: [PATCH 011/670] Remove space end of line --- components/psr7.rst | 2 +- workflow.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/psr7.rst b/components/psr7.rst index eb5ff8196a9..04a3b9148b5 100644 --- a/components/psr7.rst +++ b/components/psr7.rst @@ -29,7 +29,7 @@ Usage Converting from HttpFoundation Objects to PSR-7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The bridge provides an interface of a factory called +The bridge provides an interface of a factory called `HttpMessageFactoryInterface`_ that builds objects implementing PSR-7 interfaces from HttpFoundation objects. diff --git a/workflow.rst b/workflow.rst index 98b0d7c5798..b0dd2f2495a 100644 --- a/workflow.rst +++ b/workflow.rst @@ -39,7 +39,7 @@ a ``Definition`` and a way to write the states to the objects (i.e. an instance of a :class:`Symfony\\Component\\Workflow\\MarkingStore\\MarkingStoreInterface`.) Consider the following example for a blog post. A post can have these places: -``draft``, ``reviewed``, ``rejected``, ``published``. You could define the workflow as +``draft``, ``reviewed``, ``rejected``, ``published``. You could define the workflow as follows: .. configuration-block:: From 60d10cc30f412e9296864ce6358e1d01a9286db2 Mon Sep 17 00:00:00 2001 From: Zairig Imad Date: Wed, 26 Apr 2023 10:46:33 +0000 Subject: [PATCH 012/670] Update _ux-libraries.rst.inc --- frontend/_ux-libraries.rst.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/_ux-libraries.rst.inc b/frontend/_ux-libraries.rst.inc index a40a51109f5..87a713abe0b 100644 --- a/frontend/_ux-libraries.rst.inc +++ b/frontend/_ux-libraries.rst.inc @@ -19,6 +19,7 @@ (`see demo `_) * `ux-typed`_: Integration with `Typed`_ (`see demo `_) * `ux-vue`_: Render `Vue`_ component from Twig (`see demo `_) +* `ux-svelte`_: Render `Svelte`_ component from Twig. .. _`ux-autocomplete`: https://symfony.com/bundles/ux-autocomplete/current/index.html .. _`ux-chartjs`: https://symfony.com/bundles/ux-chartjs/current/index.html @@ -33,6 +34,7 @@ .. _`ux-twig-component`: https://symfony.com/bundles/ux-twig-component/current/index.html .. _`ux-typed`: https://symfony.com/bundles/ux-typed/current/index.html .. _`ux-vue`: https://symfony.com/bundles/ux-vue/current/index.html +.. _`ux-svelte`: https://symfony.com/bundles/ux-svelte/current/index.html .. _`Chart.js`: https://www.chartjs.org/ .. _`Swup`: https://swup.js.org/ .. _`React`: https://reactjs.org/ From 3637cf96074f340af38a6f9e6b6ead7f5f2b6d8c Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 28 Apr 2023 11:44:14 +0200 Subject: [PATCH 013/670] Update dependencies of the docs builder used in tets --- _build/composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_build/composer.lock b/_build/composer.lock index d45dc483946..d863be84ad9 100644 --- a/_build/composer.lock +++ b/_build/composer.lock @@ -466,16 +466,16 @@ }, { "name": "symfony-tools/docs-builder", - "version": "v0.20.2", + "version": "v0.20.5", "source": { "type": "git", "url": "https://github.com/symfony-tools/docs-builder.git", - "reference": "6486fd734bb151a05f592b06ac1569c62d338a08" + "reference": "11d9d81e3997e771ad1a57eabaa51fc22c500b35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony-tools/docs-builder/zipball/6486fd734bb151a05f592b06ac1569c62d338a08", - "reference": "6486fd734bb151a05f592b06ac1569c62d338a08", + "url": "https://api.github.com/repos/symfony-tools/docs-builder/zipball/11d9d81e3997e771ad1a57eabaa51fc22c500b35", + "reference": "11d9d81e3997e771ad1a57eabaa51fc22c500b35", "shasum": "" }, "require": { @@ -514,9 +514,9 @@ "description": "The build system for Symfony's documentation", "support": { "issues": "https://github.com/symfony-tools/docs-builder/issues", - "source": "https://github.com/symfony-tools/docs-builder/tree/v0.20.2" + "source": "https://github.com/symfony-tools/docs-builder/tree/v0.20.5" }, - "time": "2023-04-04T06:17:34+00:00" + "time": "2023-04-28T09:41:45+00:00" }, { "name": "symfony/console", From cde41e8619b22ebe3f73f2cee3679a34108a6937 Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Mon, 1 May 2023 18:12:41 +0200 Subject: [PATCH 014/670] Minor typo Page: https://symfony.com/doc/5.4/components/options_resolver.html --- components/options_resolver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/options_resolver.rst b/components/options_resolver.rst index 78266c2a309..3e7c657b79f 100644 --- a/components/options_resolver.rst +++ b/components/options_resolver.rst @@ -51,7 +51,7 @@ check which options are set:: } Also, the default values of the options are buried in the business logic of your -code. Use the :phpfunction:`array_replace` to fix that:: +code. Use :phpfunction:`array_replace` to fix that:: class Mailer { From 39bca2d7a404c067daf9c4fdeb3e4bc98975ce61 Mon Sep 17 00:00:00 2001 From: Mickael Perraud Date: Sat, 29 Apr 2023 11:13:51 +0200 Subject: [PATCH 015/670] Fix missing link --- frontend/_ux-libraries.rst.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/_ux-libraries.rst.inc b/frontend/_ux-libraries.rst.inc index 87a713abe0b..a9d8f15acde 100644 --- a/frontend/_ux-libraries.rst.inc +++ b/frontend/_ux-libraries.rst.inc @@ -38,6 +38,7 @@ .. _`Chart.js`: https://www.chartjs.org/ .. _`Swup`: https://swup.js.org/ .. _`React`: https://reactjs.org/ +.. _`Svelte`: https://svelte.dev/ .. _`Turbo Drive`: https://turbo.hotwired.dev/ .. _`Typed`: https://github.com/mattboldt/typed.js/ .. _`Vue`: https://vuejs.org/ From e95b95a36acff0d7e9e417882b81e7ccd4b33130 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Tue, 2 May 2023 23:19:36 +0200 Subject: [PATCH 016/670] Improve security logout options --- reference/configuration/security.rst | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/reference/configuration/security.rst b/reference/configuration/security.rst index 27869dd074d..b811f33e2ac 100644 --- a/reference/configuration/security.rst +++ b/reference/configuration/security.rst @@ -448,10 +448,13 @@ redirected to the ``default_target_path`` to avoid a redirection loop. For historical reasons, and to match the misspelling of the HTTP standard, the option is called ``use_referer`` instead of ``use_referrer``. -**Options Related to Logout Configuration** +logout +~~~~~~ + +You can configure logout options. invalidate_session -~~~~~~~~~~~~~~~~~~ +.................. **type**: ``boolean`` **default**: ``true`` @@ -466,14 +469,14 @@ the current firewall and not the other ones. .. _reference-security-logout-success-handler: ``path`` -~~~~~~~~ +........ **type**: ``string`` **default**: ``/logout`` The path which triggers logout. You need to set up a route with a matching path. target -~~~~~~ +...... **type**: ``string`` **default**: ``/`` @@ -482,7 +485,7 @@ starts with ``http://`` or ``https://``) or the route name (otherwise) to redirect after logout. success_handler -~~~~~~~~~~~~~~~ +............... .. deprecated:: 5.1 @@ -501,14 +504,14 @@ If it is set, the logout ``target`` option will be ignored. .. _reference-security-logout-csrf: csrf_parameter -~~~~~~~~~~~~~~ +.............. **type**: ``string`` **default**: ``'_csrf_token'`` The name of the parameter that stores the CSRF token value. csrf_token_generator -~~~~~~~~~~~~~~~~~~~~ +.................... **type**: ``string`` **default**: ``null`` @@ -516,7 +519,7 @@ The ``id`` of the service used to generate the CSRF tokens. Symfony provides a default service whose ID is ``security.csrf.token_manager``. csrf_token_id -~~~~~~~~~~~~~ +............. **type**: ``string`` **default**: ``'logout'`` From 06eb904b9db53efb1ca848619d0e18b8b2401b3b Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Tue, 2 May 2023 22:21:43 +0200 Subject: [PATCH 017/670] Use Doctor RST 1.45.0 and new Rule `RemoveTrailingWhitespace` --- .doctor-rst.yaml | 1 + .github/workflows/ci.yaml | 2 +- reference/constraints/Traverse.rst | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.doctor-rst.yaml b/.doctor-rst.yaml index bf037f27716..0fc471cfee8 100644 --- a/.doctor-rst.yaml +++ b/.doctor-rst.yaml @@ -44,6 +44,7 @@ rules: only_backslashes_in_use_statements_in_php_code_block: ~ ordered_use_statements: ~ php_prefix_before_bin_console: ~ + remove_trailing_whitespace: ~ replace_code_block_types: ~ replacement: ~ short_array_syntax: ~ diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 835cf386072..79f2c12e4fb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.44.1 + uses: docker://oskarstark/doctor-rst:1.45.0 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache diff --git a/reference/constraints/Traverse.rst b/reference/constraints/Traverse.rst index 2302139cbb9..01dcd4f779c 100644 --- a/reference/constraints/Traverse.rst +++ b/reference/constraints/Traverse.rst @@ -112,7 +112,7 @@ that all have constraints on their properties. /** * @var Collection|Book[] */ - #[ORM\ManyToMany(targetEntity: Book::class)] + #[ORM\ManyToMany(targetEntity: Book::class)] protected $books; // some other properties From 9e211756bc22f3d5f8bb9eea8623a9a9293829a9 Mon Sep 17 00:00:00 2001 From: jmsche Date: Tue, 11 Apr 2023 15:25:35 +0200 Subject: [PATCH 018/670] [Form] Add some basic docs for Twig Form field helpers --- form/form_customization.rst | 43 ++++++++++++++++++++++++++++++++++++ reference/twig_reference.rst | 6 +++++ 2 files changed, 49 insertions(+) diff --git a/form/form_customization.rst b/form/form_customization.rst index 3551ed2344e..9db536dfbd6 100644 --- a/form/form_customization.rst +++ b/form/form_customization.rst @@ -87,6 +87,49 @@ control over how each form field is rendered, so you can fully customize them: Later in this article you can find the full reference of these Twig functions with more usage examples. +.. _reference-forms-twig-field-helpers: + +Form Field Helpers +------------------ + +The ``form_*()`` helpers render each part of the form field, including all its needed HTML elements. Most developers +like this behavior, but some designers struggle with it, because it hides all the HTML in form themes which are not +easy to manage by them. + +That's why some Twig form helpers are available to render the value of each form field part without adding any +HTML around it: + +* ``field_name`` +* ``field_value`` +* ``field_label`` +* ``field_help`` +* ``field_errors`` +* ``field_choices`` (an iterator of the field choices; e.g. for `` + + + +.. versionadded:: 5.2 + + The ``field_*()`` helpers were introduced in Symfony 5.2. + Form Rendering Variables ------------------------ diff --git a/reference/twig_reference.rst b/reference/twig_reference.rst index 38d96910fd2..0ee70b0929d 100644 --- a/reference/twig_reference.rst +++ b/reference/twig_reference.rst @@ -365,6 +365,12 @@ explained in the article about :doc:`customizing form rendering ` * :ref:`form_row() ` * :ref:`form_rest() ` +* :ref:`field_name() ` +* :ref:`field_value() ` +* :ref:`field_label() ` +* :ref:`field_help() ` +* :ref:`field_errors() ` +* :ref:`field_choices() ` .. _reference-twig-filters: From 8578924939c1ebe1ccdd0cdd88581c772998f3e1 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 4 May 2023 15:31:55 +0200 Subject: [PATCH 019/670] Tweaks --- form/form_customization.rst | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/form/form_customization.rst b/form/form_customization.rst index 9db536dfbd6..87be104c7f1 100644 --- a/form/form_customization.rst +++ b/form/form_customization.rst @@ -92,22 +92,23 @@ control over how each form field is rendered, so you can fully customize them: Form Field Helpers ------------------ -The ``form_*()`` helpers render each part of the form field, including all its needed HTML elements. Most developers -like this behavior, but some designers struggle with it, because it hides all the HTML in form themes which are not -easy to manage by them. - -That's why some Twig form helpers are available to render the value of each form field part without adding any -HTML around it: - -* ``field_name`` -* ``field_value`` -* ``field_label`` -* ``field_help`` -* ``field_errors`` -* ``field_choices`` (an iterator of the field choices; e.g. for ````) + +When using these helpers, you must write all the HTML contents for all form +fields, so you no longer have to deal with form themes: .. code-block:: html+twig From b3bc5aca3e6fa3f7c5d0c2b52f334cc2d28a0be5 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 18 Apr 2023 17:03:05 +0200 Subject: [PATCH 020/670] Don't use double backquotes in the comments --- .../cache/adapters/array_cache_adapter.rst | 2 +- event_dispatcher.rst | 2 +- service_container/autowiring.rst | 20 +++++++++---------- testing.rst | 5 ++--- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/components/cache/adapters/array_cache_adapter.rst b/components/cache/adapters/array_cache_adapter.rst index 7429593f993..1d8cd87269a 100644 --- a/components/cache/adapters/array_cache_adapter.rst +++ b/components/cache/adapters/array_cache_adapter.rst @@ -15,7 +15,7 @@ method:: // until the current PHP process finishes) $defaultLifetime = 0, - // if ``true``, the values saved in the cache are serialized before storing them + // if true, the values saved in the cache are serialized before storing them $storeSerialized = true, // the maximum lifetime (in seconds) of the entire cache (after this time, the diff --git a/event_dispatcher.rst b/event_dispatcher.rst index ae13f5d61a6..c04e309eb46 100644 --- a/event_dispatcher.rst +++ b/event_dispatcher.rst @@ -796,7 +796,7 @@ could listen to the ``mailer.post_send`` event and change the method's return va public function onMailerPostSend(AfterSendMailEvent $event) { $returnValue = $event->getReturnValue(); - // modify the original ``$returnValue`` value + // modify the original $returnValue value $event->setReturnValue($returnValue); } diff --git a/service_container/autowiring.rst b/service_container/autowiring.rst index 39fa1ba5299..60baa01b261 100644 --- a/service_container/autowiring.rst +++ b/service_container/autowiring.rst @@ -216,8 +216,8 @@ adding a service alias: # ... # but this fixes it! - # the ``app.rot13.transformer`` service will be injected when - # an ``App\Util\Rot13Transformer`` type-hint is detected + # the "app.rot13.transformer" service will be injected when + # an App\Util\Rot13Transformer type-hint is detected App\Util\Rot13Transformer: '@app.rot13.transformer' .. code-block:: xml @@ -251,8 +251,8 @@ adding a service alias: ->autowire(); // but this fixes it! - // the ``app.rot13.transformer`` service will be injected when - // an ``App\Util\Rot13Transformer`` type-hint is detected + // the "app.rot13.transformer" service will be injected when + // an App\Util\Rot13Transformer type-hint is detected $services->alias(Rot13Transformer::class, 'app.rot13.transformer'); }; @@ -355,8 +355,8 @@ To fix that, add an :ref:`alias `: $services->set(Rot13Transformer::class); - // the ``App\Util\Rot13Transformer`` service will be injected when - // an ``App\Util\TransformerInterface`` type-hint is detected + // the App\Util\Rot13Transformer service will be injected when + // an App\Util\TransformerInterface type-hint is detected $services->alias(TransformerInterface::class, Rot13Transformer::class); }; @@ -526,13 +526,13 @@ the injection:: $services->set(Rot13Transformer::class)->autowire(); $services->set(UppercaseTransformer::class)->autowire(); - // the ``App\Util\UppercaseTransformer`` service will be - // injected when an ``App\Util\TransformerInterface`` - // type-hint for a ``$shoutyTransformer`` argument is detected. + // the App\Util\UppercaseTransformer service will be + // injected when an App\Util\TransformerInterface + // type-hint for a $shoutyTransformer argument is detected. $services->alias(TransformerInterface::class.' $shoutyTransformer', UppercaseTransformer::class); // If the argument used for injection does not match, but the - // type-hint still matches, the ``App\Util\Rot13Transformer`` + // type-hint still matches, the App\Util\Rot13Transformer // service will be injected. $services->alias(TransformerInterface::class, Rot13Transformer::class); diff --git a/testing.rst b/testing.rst index c7885328242..3ca9f5e6e8a 100644 --- a/testing.rst +++ b/testing.rst @@ -566,11 +566,10 @@ In the above example, the test validates that the HTTP response was successful and the request body contains a ``

`` tag with ``"Hello world"``. The ``request()`` method also returns a crawler, which you can use to -create more complex assertions in your tests:: +create more complex assertions in your tests (e.g. to count the number of page +elements that match a given CSS selector):: $crawler = $client->request('GET', '/post/hello-world'); - - // for instance, count the number of ``.comment`` elements on the page $this->assertCount(4, $crawler->filter('.comment')); You can learn more about the crawler in :doc:`/testing/dom_crawler`. From f1698a449d2446c5f1615b232595a29b1740c84e Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Mon, 10 Apr 2023 21:01:00 -0400 Subject: [PATCH 021/670] Revamping Multiple Kernels documentation --- configuration/multiple_kernels.rst | 467 +++++++++++++++++++---------- 1 file changed, 306 insertions(+), 161 deletions(-) diff --git a/configuration/multiple_kernels.rst b/configuration/multiple_kernels.rst index dc7e4c5b390..12ebaf67eda 100644 --- a/configuration/multiple_kernels.rst +++ b/configuration/multiple_kernels.rst @@ -1,244 +1,389 @@ -How To Create Symfony Applications with Multiple Kernels -======================================================== +How to Create Multiple Symfony Applications with a Single Kernel +================================================================ -.. caution:: +In most Symfony applications, incoming requests are processed by the front controller at ``public/index.php``, which +instantiates the ``src/Kernel.php`` class to create the application kernel. This kernel loads the bundles, configurations, +and handles the request to generate the response. - Creating applications with multiple kernels is no longer recommended by - Symfony. Consider creating multiple small applications instead. +The current implementation of the Kernel class serves as a convenient default for a single application. However, it can +also manage multiple applications. While the Kernel typically runs the same application with different configurations +based on various :ref:`environments ` , it can be adapted to run different applications with +specific bundles and configurations. -In most Symfony applications, incoming requests are processed by the -``public/index.php`` front controller, which instantiates the ``src/Kernel.php`` -class to create the application kernel that loads the bundles and handles the -request to generate the response. +These are some of the common use cases for creating multiple applications with a single Kernel: -This single kernel approach is a convenient default, but Symfony applications -can define any number of kernels. Whereas -:ref:`environments ` run the same application with -different configurations, kernels can run different parts of the same -application. +* An application that defines an API can be divided into two segments to improve performance. The first segment serves + the regular web application, while the second segment exclusively responds to API requests. This approach requires + loading fewer bundles and enabling fewer features for the second part, thus optimizing performance; +* A highly sensitive application could be divided into two parts for enhanced security. The first part would only load + routes corresponding to the publicly exposed sections of the application. The second part would load the remainder of + the application, with its access safeguarded by the web server; +* A monolithic application could be gradually transformed into a more distributed architecture, such as micro-services. + This approach allows for a seamless migration of a large application while still sharing common configurations and + components. -These are some of the common use cases for creating multiple kernels: +Turning a Single Application into Multiple Applications +------------------------------------------------------- -* An application that defines an API could define two kernels for performance - reasons. The first kernel would serve the regular application and the second - one would only respond to the API requests, loading less bundles and enabling - less features; -* A highly sensitive application could define two kernels. The first one would - only load the routes that match the parts of the application exposed publicly. - The second kernel would load the rest of the application and its access would - be protected by the web server; -* A micro-services oriented application could define several kernels to - enable/disable services selectively turning a traditional monolith application - into several micro-applications. +Let's explore the steps required to convert a single application into a new one that supports multiple applications: -Adding a new Kernel to the Application --------------------------------------- +1. Create a new application; +2. Update the Kernel class to support multiple applications; +3. Add a new ``APP_ID`` environment variable; +4. Update the front controllers. -Creating a new kernel in a Symfony application is a three-step process: +The following example shows how to create a new application for the API of a new Symfony project. -1. Create a new front controller to load the new kernel; -2. Create the new kernel class; -3. Define the configuration loaded by the new kernel. +Step 1) Create a new Application +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The following example shows how to create a new kernel for the API of a given -Symfony application. +In this example, we will use the `Shared Kernel`_ pattern, where, although all applications maintain an isolated context, +they can share common bundles, configurations, and code if desired. The optimal approach will depend on your specific +needs and requirements, so it's up to you to decide which best suits your project. -Step 1) Create a new Front Controller -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +First, let's create a new ``apps`` directory at the root of your project, which will hold all the necessary applications. +Each application will follow a simplified directory structure like the one described in :ref:`Symfony Best Practice `: -Instead of creating the new front controller from scratch, it's easier to -duplicate the existing one. For example, create ``public/api.php`` from -``public/index.php``. +.. code-block:: text -Then, update the code of the new front controller to instantiate the new kernel -class instead of the usual ``Kernel`` class:: + your-project/ + ├─ apps/ + │ └─ api/ + │ ├─ config/ + │ │ ├─ bundles.php + │ │ ├─ routes.yaml + │ │ └─ services.yaml + │ └─ src/ + ├─ bin/ + │ └─ console + ├─ config/ + ├─ public/ + │ └─ index.php + ├─ src/ + │ └─ Kernel.php - // public/api.php - // ... - $kernel = new ApiKernel( - $_SERVER['APP_ENV'] ?? 'dev', - $_SERVER['APP_DEBUG'] ?? ('prod' !== ($_SERVER['APP_ENV'] ?? 'dev')) - ); - // ... +.. note:: + + Note that the ``config/`` and ``src/`` directories at the root of the project will represent the shared context among + all applications within the ``apps/`` directory. Therefore, you should carefully consider what is common and what + should be placed in the specific application. .. tip:: - Another approach is to keep the existing ``index.php`` front controller, but - add an ``if`` statement to load the different kernel based on the URL (e.g. - if the URL starts with ``/api``, use the ``ApiKernel``). + You might also consider renaming the namespace for the shared context, from ``App`` to ``Shared``, as it will make it + easier to distinguish and provide clearer meaning to this context. -Step 2) Create the new Kernel Class -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Since the new ``apps/api/src/`` directory will host the PHP code related to the API, we need to update the ``composer.json`` +file to include it in the autoload section: -Now you need to define the ``ApiKernel`` class used by the new front controller. -The easiest way to do this is by duplicating the existing ``src/Kernel.php`` -file and make the needed changes. +.. code-block:: json -In this example, the ``ApiKernel`` will load fewer bundles than the default -Kernel. Be sure to also change the location of the cache, logs and configuration -files so they don't collide with the files from ``src/Kernel.php``:: + { + "autoload": { + "psr-4": { + "Shared\\": "src/", + "Api\\": "apps/api/src/" + } + } + } - // src/ApiKernel.php - use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; - use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; - use Symfony\Component\HttpKernel\Kernel as BaseKernel; - use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; +Additionally, don't forget to run `composer dump-autoload` to generate the autoload files. - class ApiKernel extends Kernel +Step 2) Update the Kernel class to support Multiple Applications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Since we aim to support multiple applications, we will add a new property ``string $id`` to the Kernel to identify the +application being loaded. This property will also allow us to split the cache, logs, and configuration files in order to +avoid collisions with other applications. Moreover, it contributes to performance optimization, as each application will +load only the required resources:: + + // src/Kernel.php + namespace Shared; + + // ... + + class Kernel extends BaseKernel { use MicroKernelTrait; - public function getProjectDir(): string + public function __construct(string $environment, bool $debug, private string $id) + { + parent::__construct($environment, $debug); + } + + public function getSharedConfigDir(): string + { + return $this->getProjectDir().'/config'; + } + + public function getAppConfigDir(): string + { + return $this->getProjectDir().'/apps/'.$this->id.'/config'; + } + + public function registerBundles(): iterable { - return \dirname(__DIR__); + $sharedBundles = require $this->getSharedConfigDir().'/bundles.php'; + $appBundles = require $this->getAppConfigDir().'/bundles.php'; + + // load common bundles, such as the FrameworkBundle, as well as + // specific bundles required exclusively for the app itself + foreach (array_merge($sharedBundles, $appBundles) as $class => $envs) { + if ($envs[$this->environment] ?? $envs['all'] ?? false) { + yield new $class(); + } + } } public function getCacheDir(): string { - return $this->getProjectDir().'/var/cache/api/'.$this->environment; + // divide cache for each application + return ($_SERVER['APP_CACHE_DIR'] ?? $this->getProjectDir().'/var/cache').'/'.$this->id.'/'.$this->environment; } public function getLogDir(): string { - return $this->getProjectDir().'/var/log/api'; + // divide logs for each application + return ($_SERVER['APP_LOG_DIR'] ?? $this->getProjectDir().'/var/log').'/'.$this->id; } - protected function configureContainer(ContainerConfigurator $containerConfigurator): void + protected function configureContainer(ContainerConfigurator $container): void { - $containerConfigurator->import('../config/api/{packages}/*.yaml'); - $containerConfigurator->import('../config/api/{packages}/'.$this->environment.'/*.yaml'); - - if (is_file(\dirname(__DIR__).'/config/api/services.yaml')) { - $containerConfigurator->import('../config/api/services.yaml'); - $containerConfigurator->import('../config/api/{services}_'.$this->environment.'.yaml'); - } else { - $containerConfigurator->import('../config/api/{services}.php'); - } + // load common config files, such as the framework.yaml, as well as + // specific configs required exclusively for the app itself + $this->doConfigureContainer($container, $this->getSharedConfigDir()); + $this->doConfigureContainer($container, $this->getAppConfigDir()); } protected function configureRoutes(RoutingConfigurator $routes): void { - $routes->import('../config/api/{routes}/'.$this->environment.'/*.yaml'); - $routes->import('../config/api/{routes}/*.yaml'); - // ... load only the config routes strictly needed for the API + // load common routes files, such as the routes/framework.yaml, as well as + // specific routes required exclusively for the app itself + $this->doConfigureRoutes($routes, $this->getSharedConfigDir()); + $this->doConfigureRoutes($routes, $this->getAppConfigDir()); } - // If you need to run some logic to decide which bundles to load, - // you might prefer to use the registerBundles() method instead - private function getBundlesPath(): string + private function doConfigureContainer(ContainerConfigurator $container, string $configDir): void { - // load only the bundles strictly needed for the API - return $this->getProjectDir().'/config/api_bundles.php'; + $container->import($configDir.'/{packages}/*.{php,yaml}'); + $container->import($configDir.'/{packages}/'.$this->environment.'/*.{php,yaml}'); + + if (is_file($configDir.'/services.yaml')) { + $container->import($configDir.'/services.yaml'); + $container->import($configDir.'/{services}_'.$this->environment.'.yaml'); + } else { + $container->import($configDir.'/{services}.php'); + } + } + + private function doConfigureRoutes(RoutingConfigurator $routes, string $configDir): void + { + $routes->import($configDir.'/{routes}/'.$this->environment.'/*.{php,yaml}'); + $routes->import($configDir.'/{routes}/*.{php,yaml}'); + + if (is_file($configDir.'/routes.yaml')) { + $routes->import($configDir.'/routes.yaml'); + } else { + $routes->import($configDir.'/{routes}.php'); + } + + if (false !== ($fileName = (new \ReflectionObject($this))->getFileName())) { + $routes->import($fileName, 'annotation'); + } } } -.. versionadded:: 5.4 +In this example, we reuse the default implementation to import configuration and routes based on a given configuration +directory. As we saw earlier, this approach will import both shared and app-specific resources. - The ``getBundlesPath()`` method was introduced in Symfony 5.4. +Step 3) Add a new APP_ID environment variable +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Step 3) Define the Kernel Configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Now, let's introduce a new environment variable that identifies the current application. This new variable can be added +to the ``.env`` file to provide a default value, but it should typically be added to your web server configuration. -Finally, define the configuration files that the new ``ApiKernel`` will load. -According to the above code, this config will live in one or multiple files -stored in ``config/api/`` and ``config/api/ENVIRONMENT_NAME/`` directories. +.. code-block:: bash -The new configuration files can be created from scratch when you load only a few -bundles, because it will be small. Otherwise, duplicate the existing -config files in ``config/packages/`` or better, import them and override the -needed options. + # .env + APP_ID=api -Executing Commands with a Different Kernel ------------------------------------------- +.. caution:: -The ``bin/console`` script used to run Symfony commands always uses the default -``Kernel`` class to build the application and load the commands. If you need -to run console commands using the new kernel, duplicate the ``bin/console`` -script and rename it (e.g. ``bin/api``). + The value of this variable must match the application directory within ``apps/`` as it is used in the Kernel to load + the specific application configuration. -Then, replace the ``Kernel`` instance by your own kernel instance -(e.g. ``ApiKernel``). Now you can run commands using the new kernel -(e.g. ``php bin/api cache:clear``). +Step 4) Update the Front Controllers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. note:: +In this final step, we will update the front controllers ``public/index.php`` and ``bin/console`` to pass the value of +the ``APP_ID`` variable to the Kernel instance. This will allow the Kernel to load and run the specified application:: - The commands available for each console script (e.g. ``bin/console`` and - ``bin/api``) can differ because they depend on the bundles enabled for each - kernel, which could be different. + // public/index.php + use Shared\Kernel; + // ... + + return function (array $context) { + return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG'], $context['APP_ID']); + }; + +Similar to configuring the required ``APP_ENV`` and ``APP_DEBUG`` values, the third argument of the Kernel constructor +is now also necessary to setting the application ID, which is derived from an external configuration. + +For the second front controller, we will define a new console option to allow passing the application ID we want to run +under CLI context:: + + // bin/console + use Shared\Kernel; + // ... + + return function (InputInterface $input, array $context) { + $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG'], $input->getParameterOption(['--id', '-i'], $context['APP_ID'])); + + $application = new Application($kernel); + $application->getDefinition() + ->addOption(new InputOption('--id', '-i', InputOption::VALUE_REQUIRED, 'The App ID')) + ; + + return $application; + }; + +That's it! + +Executing Commands +------------------ + +The ``bin/console`` script, which is used to run Symfony commands, always uses the ``Kernel`` class to build the +application and load the commands. If you need to run console commands for a specific application, you can provide the +``--id`` option along with the appropriate identity value: + +.. code-block:: terminal + + php bin/console cache:clear --id=api + // or + php bin/console cache:clear -iapi + + // alternatively + export APP_ID=api + php bin/console cache:clear + +You might want to update the composer auto-scripts section to run multiple commands simultaneously. In this example, +we assume you have a second application for managing the configuration (admin): + +.. code-block:: json + + { + "scripts": { + "auto-scripts": { + "cache:clear -iapi": "symfony-cmd", + "cache:clear -iadmin": "symfony-cmd", + "assets:install %PUBLIC_DIR% -iapi": "symfony-cmd", + "assets:install %PUBLIC_DIR% -iadmin --no-cleanup": "symfony-cmd" + } + } + } + +Then, run `composer auto-scripts` to test it! + +.. note:: -Rendering Templates Defined in a Different Kernel -------------------------------------------------- + The commands available for each console script (e.g. ``bin/console -iapi`` and ``bin/console -iadmin``) can differ + because they depend on the bundles enabled for each application, which could be different. -If you follow the Symfony Best Practices, the templates of the default kernel -will be stored in ``templates/``. Trying to render those templates in a -different kernel will result in a *There are no registered paths for namespace -"__main__"* error. +Rendering Templates +------------------- -In order to solve this issue, add the following configuration to your kernel: +Let's assume there is now another app called ``admin``. If you follow the :ref:`Symfony Best Practices `, the shared Kernel +templates will be located in the ``templates/`` directory at the project's root. For admin-specific templates, you can +create a new directory ``apps/admin/templates/`` which you will need to manually configure under the Admin application: .. code-block:: yaml - # config/api/twig.yaml + # apps/admin/config/packages/twig.yaml twig: paths: - # allows to use api/templates/ dir in the ApiKernel - "%kernel.project_dir%/api/templates": ~ + '%kernel.project_dir%/apps/admin/templates': Admin + +Then, use this Twig namespace to reference any template within the Admin application only, for example ``@Admin/form/fields.html.twig``. -Running Tests Using a Different Kernel --------------------------------------- +Running Tests +------------- -In Symfony applications, functional tests extend by default from the -:class:`Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase` class. Inside that -class, a method called ``getKernelClass()`` tries to find the class of the kernel -to use to run the application during tests. The logic of this method does not -support multiple kernel applications, so your tests won't use the right kernel. +In Symfony applications, functional tests typically extend from the :class:`Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase` +class by default. Within its parent class, ``KernelTestCase``, there is a method called ``createKernel()`` that attempts to +create the kernel responsible for running the application during tests. However, the current logic of this method doesn't +include our new application ID argument, so we need to make an update:: -The solution is to create a custom base class for functional tests extending -from ``WebTestCase`` class and overriding the ``getKernelClass()`` method to -return the fully qualified class name of the kernel to use:: + // apps/api/tests/ApiTestCase.php + namespace Api\Tests; + use Shared\Kernel; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; + use Symfony\Component\HttpKernel\KernelInterface; - // tests needing the ApiKernel to work, now must extend this - // ApiTestCase class instead of the default WebTestCase class class ApiTestCase extends WebTestCase { - protected static function getKernelClass() + protected static function createKernel(array $options = []): KernelInterface { - return 'App\ApiKernel'; + $env = $options['environment'] ?? $_ENV['APP_ENV'] ?? $_SERVER['APP_ENV'] ?? 'test'; + $debug = $options['debug'] ?? (bool) ($_ENV['APP_DEBUG'] ?? $_SERVER['APP_DEBUG'] ?? true); + + return new Kernel($env, $debug, 'api'); } + } - // this is needed because the KernelTestCase class keeps a reference to - // the previously created kernel in its static $kernel property. Thus, - // if your functional tests do not run in isolated processes, a later run - // test for a different kernel will reuse the previously created instance, - // which points to a different kernel - protected function tearDown() - { - parent::tearDown(); +.. note:: + + Keep in mind that we will set a fixed application ID value in this instance, as the specific test cases extending + from ``ApiTestCase`` will focus solely on the ``api`` tests. + +In this situation, we have created a ``tests/`` directory inside the ``apps/api/`` application. As a result, we need to +inform both the ``composer.json`` file and our ``phpunit.xml`` configuration about its existence: - static::$class = null; +.. code-block:: json + + { + "autoload-dev": { + "psr-4": { + "Shared\\Tests\\": "tests/", + "Api\\Tests\\": "apps/api/tests/" + } } } -Adding more Kernels to the Application --------------------------------------- +Remember to run ``composer dump-autoload`` to generate the autoload files. + +And, here is the update needed for the ``phpunit.xml`` file: + +.. code-block:: xml -If your application is very complex and you create several kernels, it's better -to store them in their own directories instead of messing with lots of files in -the default ``src/`` directory: + + + tests + + + apps/api/tests + + + +Adding more Applications +------------------------ + +Now you can begin adding more applications as needed, such as an ``admin`` application to manage the project's +configuration and permissions. To do that, you will have to repeat the step 1 only: .. code-block:: text - project/ - ├─ src/ - │ ├─ ... - │ └─ Kernel.php - ├─ api/ - │ ├─ ... - │ └─ ApiKernel.php - ├─ ... - └─ public/ - ├─ ... - ├─ api.php - └─ index.php + your-project/ + ├─ apps/ + │ ├─ admin/ + │ │ ├─ config/ + │ │ │ ├─ bundles.php + │ │ │ ├─ routes.yaml + │ │ │ └─ services.yaml + │ │ └─ src/ + │ └─ api/ + │ └─ ... + +Additionally, you might need to update your web server configuration to set the ``APP_ID=admin`` under a different domain. + +.. _`Shared Kernel`: http://ddd.fed.wiki.org/view/shared-kernel From b3bee8e81626f0d7ae17979f4aa9a27d0c988087 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 4 May 2023 16:35:20 +0200 Subject: [PATCH 022/670] Minor tweaks --- configuration/multiple_kernels.rst | 181 +++++++++++++++++------------ 1 file changed, 108 insertions(+), 73 deletions(-) diff --git a/configuration/multiple_kernels.rst b/configuration/multiple_kernels.rst index 12ebaf67eda..1b8504e0748 100644 --- a/configuration/multiple_kernels.rst +++ b/configuration/multiple_kernels.rst @@ -1,48 +1,59 @@ How to Create Multiple Symfony Applications with a Single Kernel ================================================================ -In most Symfony applications, incoming requests are processed by the front controller at ``public/index.php``, which -instantiates the ``src/Kernel.php`` class to create the application kernel. This kernel loads the bundles, configurations, -and handles the request to generate the response. - -The current implementation of the Kernel class serves as a convenient default for a single application. However, it can -also manage multiple applications. While the Kernel typically runs the same application with different configurations -based on various :ref:`environments ` , it can be adapted to run different applications with -specific bundles and configurations. - -These are some of the common use cases for creating multiple applications with a single Kernel: - -* An application that defines an API can be divided into two segments to improve performance. The first segment serves - the regular web application, while the second segment exclusively responds to API requests. This approach requires - loading fewer bundles and enabling fewer features for the second part, thus optimizing performance; -* A highly sensitive application could be divided into two parts for enhanced security. The first part would only load - routes corresponding to the publicly exposed sections of the application. The second part would load the remainder of - the application, with its access safeguarded by the web server; -* A monolithic application could be gradually transformed into a more distributed architecture, such as micro-services. - This approach allows for a seamless migration of a large application while still sharing common configurations and - components. +In Symfony applications, incoming requests are usually processed by the front +controller at ``public/index.php``, which instantiates the ``src/Kernel.php`` +class to create the application kernel. This kernel loads the bundles, the +configuration, and handles the request to generate the response. + +The current implementation of the Kernel class serves as a convenient default +for a single application. However, it can also manage multiple applications. +While the Kernel typically runs the same application with different +configurations based on various :ref:`environments `, +it can be adapted to run different applications with specific bundles and configuration. + +These are some of the common use cases for creating multiple applications with a +single Kernel: + +* An application that defines an API can be divided into two segments to improve + performance. The first segment serves the regular web application, while the + second segment exclusively responds to API requests. This approach requires + loading fewer bundles and enabling fewer features for the second part, thus + optimizing performance; +* A highly sensitive application could be divided into two parts for enhanced + security. The first part would only load routes corresponding to the publicly + exposed sections of the application. The second part would load the remainder + of the application, with its access safeguarded by the web server; +* A monolithic application could be gradually transformed into a more + distributed architecture, such as micro-services. This approach allows for a + seamless migration of a large application while still sharing common + configurations and components. Turning a Single Application into Multiple Applications ------------------------------------------------------- -Let's explore the steps required to convert a single application into a new one that supports multiple applications: +These are the steps required to convert a single application into a new one that +supports multiple applications: 1. Create a new application; 2. Update the Kernel class to support multiple applications; 3. Add a new ``APP_ID`` environment variable; 4. Update the front controllers. -The following example shows how to create a new application for the API of a new Symfony project. +The following example shows how to create a new application for the API of a new +Symfony project. Step 1) Create a new Application ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In this example, we will use the `Shared Kernel`_ pattern, where, although all applications maintain an isolated context, -they can share common bundles, configurations, and code if desired. The optimal approach will depend on your specific -needs and requirements, so it's up to you to decide which best suits your project. +This example follows the `Shared Kernel`_ pattern: all applications maintain an +isolated context, but they can share common bundles, configuration, and code if +desired. The optimal approach will depend on your specific needs and +requirements, so it's up to you to decide which best suits your project. -First, let's create a new ``apps`` directory at the root of your project, which will hold all the necessary applications. -Each application will follow a simplified directory structure like the one described in :ref:`Symfony Best Practice `: +First, create a new ``apps`` directory at the root of your project, which will +hold all the necessary applications. Each application will follow a simplified +directory structure like the one described in :ref:`Symfony Best Practice `: .. code-block:: text @@ -64,17 +75,20 @@ Each application will follow a simplified directory structure like the one descr .. note:: - Note that the ``config/`` and ``src/`` directories at the root of the project will represent the shared context among - all applications within the ``apps/`` directory. Therefore, you should carefully consider what is common and what - should be placed in the specific application. + Note that the ``config/`` and ``src/`` directories at the root of the + project will represent the shared context among all applications within the + ``apps/`` directory. Therefore, you should carefully consider what is + common and what should be placed in the specific application. .. tip:: - You might also consider renaming the namespace for the shared context, from ``App`` to ``Shared``, as it will make it - easier to distinguish and provide clearer meaning to this context. + You might also consider renaming the namespace for the shared context, from + ``App`` to ``Shared``, as it will make it easier to distinguish and provide + clearer meaning to this context. -Since the new ``apps/api/src/`` directory will host the PHP code related to the API, we need to update the ``composer.json`` -file to include it in the autoload section: +Since the new ``apps/api/src/`` directory will host the PHP code related to the +API, you have to update the ``composer.json`` file to include it in the autoload +section: .. code-block:: json @@ -87,15 +101,18 @@ file to include it in the autoload section: } } -Additionally, don't forget to run `composer dump-autoload` to generate the autoload files. +Additionally, don't forget to run ``composer dump-autoload`` to generate the +autoload files. Step 2) Update the Kernel class to support Multiple Applications ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Since we aim to support multiple applications, we will add a new property ``string $id`` to the Kernel to identify the -application being loaded. This property will also allow us to split the cache, logs, and configuration files in order to -avoid collisions with other applications. Moreover, it contributes to performance optimization, as each application will -load only the required resources:: +Since there will be multiple applications, it's better to add a new property +``string $id`` to the Kernel to identify the application being loaded. This +property will also allow you to split the cache, logs, and configuration files +in order to avoid collisions with other applications. Moreover, it contributes +to performance optimization, as each application will load only the required +resources:: // src/Kernel.php namespace Shared; @@ -193,14 +210,16 @@ load only the required resources:: } } -In this example, we reuse the default implementation to import configuration and routes based on a given configuration -directory. As we saw earlier, this approach will import both shared and app-specific resources. +This example reuses the default implementation to import the configuration and +routes based on a given configuration directory. As shown earlier, this +approach will import both the shared and the app-specific resources. Step 3) Add a new APP_ID environment variable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Now, let's introduce a new environment variable that identifies the current application. This new variable can be added -to the ``.env`` file to provide a default value, but it should typically be added to your web server configuration. +Next, define a new environment variable that identifies the current application. +This new variable can be added to the ``.env`` file to provide a default value, +but it should typically be added to your web server configuration. .. code-block:: bash @@ -209,14 +228,17 @@ to the ``.env`` file to provide a default value, but it should typically be adde .. caution:: - The value of this variable must match the application directory within ``apps/`` as it is used in the Kernel to load - the specific application configuration. + The value of this variable must match the application directory within + ``apps/`` as it is used in the Kernel to load the specific application + configuration. Step 4) Update the Front Controllers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In this final step, we will update the front controllers ``public/index.php`` and ``bin/console`` to pass the value of -the ``APP_ID`` variable to the Kernel instance. This will allow the Kernel to load and run the specified application:: +In this final step, update the front controllers ``public/index.php`` and +``bin/console`` to pass the value of the ``APP_ID`` variable to the Kernel +instance. This will allow the Kernel to load and run the specified +application:: // public/index.php use Shared\Kernel; @@ -226,11 +248,12 @@ the ``APP_ID`` variable to the Kernel instance. This will allow the Kernel to lo return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG'], $context['APP_ID']); }; -Similar to configuring the required ``APP_ENV`` and ``APP_DEBUG`` values, the third argument of the Kernel constructor -is now also necessary to setting the application ID, which is derived from an external configuration. +Similar to configuring the required ``APP_ENV`` and ``APP_DEBUG`` values, the +third argument of the Kernel constructor is now also necessary to set the +application ID, which is derived from an external configuration. -For the second front controller, we will define a new console option to allow passing the application ID we want to run -under CLI context:: +For the second front controller, define a new console option to allow passing +the application ID to run under CLI context:: // bin/console use Shared\Kernel; @@ -252,8 +275,9 @@ That's it! Executing Commands ------------------ -The ``bin/console`` script, which is used to run Symfony commands, always uses the ``Kernel`` class to build the -application and load the commands. If you need to run console commands for a specific application, you can provide the +The ``bin/console`` script, which is used to run Symfony commands, always uses +the ``Kernel`` class to build the application and load the commands. If you +need to run console commands for a specific application, you can provide the ``--id`` option along with the appropriate identity value: .. code-block:: terminal @@ -266,8 +290,9 @@ application and load the commands. If you need to run console commands for a spe export APP_ID=api php bin/console cache:clear -You might want to update the composer auto-scripts section to run multiple commands simultaneously. In this example, -we assume you have a second application for managing the configuration (admin): +You might want to update the composer auto-scripts section to run multiple +commands simultaneously. This example shows the commands of two different +applications called ``api`` and ``admin``: .. code-block:: json @@ -282,19 +307,23 @@ we assume you have a second application for managing the configuration (admin): } } -Then, run `composer auto-scripts` to test it! +Then, run ``composer auto-scripts`` to test it! .. note:: - The commands available for each console script (e.g. ``bin/console -iapi`` and ``bin/console -iadmin``) can differ - because they depend on the bundles enabled for each application, which could be different. + The commands available for each console script (e.g. ``bin/console -iapi`` + and ``bin/console -iadmin``) can differ because they depend on the bundles + enabled for each application, which could be different. Rendering Templates ------------------- -Let's assume there is now another app called ``admin``. If you follow the :ref:`Symfony Best Practices `, the shared Kernel -templates will be located in the ``templates/`` directory at the project's root. For admin-specific templates, you can -create a new directory ``apps/admin/templates/`` which you will need to manually configure under the Admin application: +Let's consider that you need to create another app called ``admin``. If you +follow the :ref:`Symfony Best Practices `, the shared Kernel +templates will be located in the ``templates/`` directory at the project's root. +For admin-specific templates, you can create a new directory +``apps/admin/templates/`` which you will need to manually configure under the +Admin application: .. code-block:: yaml @@ -303,15 +332,18 @@ create a new directory ``apps/admin/templates/`` which you will need to manually paths: '%kernel.project_dir%/apps/admin/templates': Admin -Then, use this Twig namespace to reference any template within the Admin application only, for example ``@Admin/form/fields.html.twig``. +Then, use this Twig namespace to reference any template within the Admin +application only, for example ``@Admin/form/fields.html.twig``. Running Tests ------------- -In Symfony applications, functional tests typically extend from the :class:`Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase` -class by default. Within its parent class, ``KernelTestCase``, there is a method called ``createKernel()`` that attempts to -create the kernel responsible for running the application during tests. However, the current logic of this method doesn't -include our new application ID argument, so we need to make an update:: +In Symfony applications, functional tests typically extend from +the :class:`Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase` class by +default. Within its parent class, ``KernelTestCase``, there is a method called +``createKernel()`` that attempts to create the kernel responsible for running +the application during tests. However, the current logic of this method doesn't +include the new application ID argument, so you need to update it:: // apps/api/tests/ApiTestCase.php namespace Api\Tests; @@ -333,11 +365,12 @@ include our new application ID argument, so we need to make an update:: .. note:: - Keep in mind that we will set a fixed application ID value in this instance, as the specific test cases extending - from ``ApiTestCase`` will focus solely on the ``api`` tests. + This examples uses a hardcoded application ID value because the tests + extending this ``ApiTestCase`` class will focus solely on the ``api`` tests. -In this situation, we have created a ``tests/`` directory inside the ``apps/api/`` application. As a result, we need to -inform both the ``composer.json`` file and our ``phpunit.xml`` configuration about its existence: +Now, create a ``tests/`` directory inside the ``apps/api/`` application. Then, +update both the ``composer.json`` file and ``phpunit.xml`` configuration about +its existence: .. code-block:: json @@ -368,8 +401,9 @@ And, here is the update needed for the ``phpunit.xml`` file: Adding more Applications ------------------------ -Now you can begin adding more applications as needed, such as an ``admin`` application to manage the project's -configuration and permissions. To do that, you will have to repeat the step 1 only: +Now you can begin adding more applications as needed, such as an ``admin`` +application to manage the project's configuration and permissions. To do that, +you will have to repeat the step 1 only: .. code-block:: text @@ -384,6 +418,7 @@ configuration and permissions. To do that, you will have to repeat the step 1 on │ └─ api/ │ └─ ... -Additionally, you might need to update your web server configuration to set the ``APP_ID=admin`` under a different domain. +Additionally, you might need to update your web server configuration to set the +``APP_ID=admin`` under a different domain. .. _`Shared Kernel`: http://ddd.fed.wiki.org/view/shared-kernel From 397e74ffc6908e4947ae6c28f2c5bbc81e4fb117 Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Thu, 4 May 2023 19:51:52 +0200 Subject: [PATCH 023/670] Update multiple_kernels.rst Replacing tabs with spaces --- configuration/multiple_kernels.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configuration/multiple_kernels.rst b/configuration/multiple_kernels.rst index 1b8504e0748..9464fcf39f7 100644 --- a/configuration/multiple_kernels.rst +++ b/configuration/multiple_kernels.rst @@ -62,16 +62,16 @@ directory structure like the one described in :ref:`Symfony Best Practice Date: Sun, 7 May 2023 22:29:00 +0200 Subject: [PATCH 024/670] Not add quote in default values --- reference/configuration/framework.rst | 18 +++++++++--------- reference/configuration/security.rst | 6 +++--- reference/configuration/twig.rst | 10 +++++----- reference/configuration/web_profiler.rst | 2 +- reference/forms/types/collection.rst | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index 53f3aa64960..290fefb13c8 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -740,7 +740,7 @@ is disabled. This can be either a template name or the content itself. path .... -**type**: ``string`` **default**: ``'/_fragment'`` +**type**: ``string`` **default**: ``/_fragment`` The path prefix for fragments. The fragment listener will only be executed when the request starts with this path. @@ -1357,7 +1357,7 @@ requests (and not on the subrequests). dsn ... -**type**: ``string`` **default**: ``'file:%kernel.cache_dir%/profiler'`` +**type**: ``string`` **default**: ``file:%kernel.cache_dir%/profiler`` The DSN where to store the profiling information. @@ -1553,7 +1553,7 @@ session storage_factory_id .................. -**type**: ``string`` **default**: ``'session.storage.factory.native'`` +**type**: ``string`` **default**: ``session.storage.factory.native`` The service ID used for creating the ``SessionStorageInterface`` that stores the session. This service is available in the Symfony application via the @@ -1574,7 +1574,7 @@ To see a list of all available storages, run: handler_id .......... -**type**: ``string`` **default**: ``'session.handler.native_file'`` +**type**: ``string`` **default**: ``session.handler.native_file`` The service id used for session storage. The default value ``'session.handler.native_file'`` will let Symfony manage the sessions itself using files to store the session metadata. @@ -1666,7 +1666,7 @@ to the cookie specification. cookie_samesite ............... -**type**: ``string`` or ``null`` **default**: ``'lax'`` +**type**: ``string`` or ``null`` **default**: ``lax`` It controls the way cookies are sent when the HTTP request did not originate from the same domain that is associated with the cookies. Setting this option is @@ -1701,7 +1701,7 @@ The possible values for this option are: cookie_secure ............. -**type**: ``boolean`` or ``'auto'`` **default**: ``'auto'`` +**type**: ``boolean`` or ``'auto'`` **default**: ``auto`` This determines whether cookies should only be sent over secure connections. In addition to ``true`` and ``false``, there's a special ``'auto'`` value that @@ -2702,7 +2702,7 @@ annotations cache ..... -**type**: ``string`` **default**: ``'php_array'`` +**type**: ``string`` **default**: ``php_array`` This option can be one of the following values: @@ -2722,7 +2722,7 @@ a service id file_cache_dir .............. -**type**: ``string`` **default**: ``'%kernel.cache_dir%/annotations'`` +**type**: ``string`` **default**: ``%kernel.cache_dir%/annotations`` The directory to store cache files for annotations, in case ``annotations.cache`` is set to ``'file'``. @@ -3493,7 +3493,7 @@ marking_store Each marking store can define any of these options: -* ``property`` (**type**: ``string`` **default**: ``'marking'``) +* ``property`` (**type**: ``string`` **default**: ``marking``) * ``service`` (**type**: ``string``) * ``type`` (**type**: ``string`` **allow value**: ``'method'``) diff --git a/reference/configuration/security.rst b/reference/configuration/security.rst index b811f33e2ac..22884fdbbe1 100644 --- a/reference/configuration/security.rst +++ b/reference/configuration/security.rst @@ -494,7 +494,7 @@ success_handler :class:`Symfony\\Component\\Security\\Http\\Event\\LogoutEvent` instead. -**type**: ``string`` **default**: ``'security.logout.success_handler'`` +**type**: ``string`` **default**: ``security.logout.success_handler`` The service ID used for handling a successful logout. The service must implement :class:`Symfony\\Component\\Security\\Http\\Logout\\LogoutSuccessHandlerInterface`. @@ -506,7 +506,7 @@ If it is set, the logout ``target`` option will be ignored. csrf_parameter .............. -**type**: ``string`` **default**: ``'_csrf_token'`` +**type**: ``string`` **default**: ``_csrf_token`` The name of the parameter that stores the CSRF token value. @@ -521,7 +521,7 @@ default service whose ID is ``security.csrf.token_manager``. csrf_token_id ............. -**type**: ``string`` **default**: ``'logout'`` +**type**: ``string`` **default**: ``logout`` An arbitrary string used to identify the token (and check its validity afterwards). diff --git a/reference/configuration/twig.rst b/reference/configuration/twig.rst index fc1d4886082..1153846f35d 100644 --- a/reference/configuration/twig.rst +++ b/reference/configuration/twig.rst @@ -36,7 +36,7 @@ compiled again automatically. autoescape ~~~~~~~~~~ -**type**: ``boolean`` or ``string`` **default**: ``'name'`` +**type**: ``boolean`` or ``string`` **default**: ``name`` If set to ``false``, automatic escaping is disabled (you can still escape each content individually in the templates). @@ -83,7 +83,7 @@ called to determine the default escaping applied to the template. base_template_class ~~~~~~~~~~~~~~~~~~~ -**type**: ``string`` **default**: ``'Twig\Template'`` +**type**: ``string`` **default**: ``Twig\Template`` Twig templates are compiled into PHP classes before using them to render contents. This option defines the base class from which all the template classes @@ -93,7 +93,7 @@ application harder to maintain. cache ~~~~~ -**type**: ``string`` | ``false`` **default**: ``'%kernel.cache_dir%/twig'`` +**type**: ``string`` | ``false`` **default**: ``%kernel.cache_dir%/twig`` Before using the Twig templates to render some contents, they are compiled into regular PHP code. Compilation is a costly process, so the result is cached in @@ -107,7 +107,7 @@ compiled again. charset ~~~~~~~ -**type**: ``string`` **default**: ``'%kernel.charset%'`` +**type**: ``string`` **default**: ``%kernel.charset%`` The charset used by the template files. By default it's the same as the value of the :ref:`kernel.charset container parameter `, @@ -160,7 +160,7 @@ If this option is ``false``, the ``dump()`` function doesn't output any contents default_path ~~~~~~~~~~~~ -**type**: ``string`` **default**: ``'%kernel.project_dir%/templates'`` +**type**: ``string`` **default**: ``%kernel.project_dir%/templates`` The path to the directory where Symfony will look for the application Twig templates by default. If you store the templates in more than one directory, use diff --git a/reference/configuration/web_profiler.rst b/reference/configuration/web_profiler.rst index fc95fd96833..f0b11f47064 100644 --- a/reference/configuration/web_profiler.rst +++ b/reference/configuration/web_profiler.rst @@ -30,7 +30,7 @@ Configuration excluded_ajax_paths ~~~~~~~~~~~~~~~~~~~ -**type**: ``string`` **default**: ``'^/((index|app(_[\w]+)?)\.php/)?_wdt'`` +**type**: ``string`` **default**: ``^/((index|app(_[\w]+)?)\.php/)?_wdt`` When the toolbar logs AJAX requests, it matches their URLs against this regular expression. If the URL matches, the request is not displayed in the toolbar. This diff --git a/reference/forms/types/collection.rst b/reference/forms/types/collection.rst index f44f25d7545..c4aa8be8a7f 100644 --- a/reference/forms/types/collection.rst +++ b/reference/forms/types/collection.rst @@ -198,7 +198,7 @@ type:: entry_type ~~~~~~~~~~ -**type**: ``string`` **default**: ``'Symfony\Component\Form\Extension\Core\Type\TextType'`` +**type**: ``string`` **default**: ``Symfony\Component\Form\Extension\Core\Type\TextType`` This is the field type for each item in this collection (e.g. ``TextType``, ``ChoiceType``, etc). For example, if you have an array of email addresses, From 486eacc15c75817fdba3644f5b316245be95206e Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Sun, 7 May 2023 22:41:02 +0200 Subject: [PATCH 025/670] Add missing backticks to defaults --- reference/configuration/framework.rst | 2 +- reference/constraints/Collection.rst | 4 ++-- reference/constraints/Count.rst | 2 +- reference/constraints/Regex.rst | 2 +- reference/forms/types/options/help.rst.inc | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index 53f3aa64960..c35eb5a575e 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -1117,7 +1117,7 @@ Use ``0`` to not limit the duration. max_duration ............ -**type**: ``float`` **default**: 0 +**type**: ``float`` **default**: ``0`` The maximum execution time, in seconds, that the request and the response are allowed to take. A value lower than or equal to 0 means it is unlimited. diff --git a/reference/constraints/Collection.rst b/reference/constraints/Collection.rst index 62595aef75e..44d0319bb84 100644 --- a/reference/constraints/Collection.rst +++ b/reference/constraints/Collection.rst @@ -379,7 +379,7 @@ Options ``allowExtraFields`` ~~~~~~~~~~~~~~~~~~~~ -**type**: ``boolean`` **default**: false +**type**: ``boolean`` **default**: ``false`` If this option is set to ``false`` and the underlying collection contains one or more elements that are not included in the `fields`_ option, a validation @@ -388,7 +388,7 @@ error will be returned. If set to ``true``, extra fields are OK. ``allowMissingFields`` ~~~~~~~~~~~~~~~~~~~~~~ -**type**: ``boolean`` **default**: false +**type**: ``boolean`` **default**: ``false`` If this option is set to ``false`` and one or more fields from the `fields`_ option are not present in the underlying collection, a validation error diff --git a/reference/constraints/Count.rst b/reference/constraints/Count.rst index d4e7e796acc..b4d6982b0fb 100644 --- a/reference/constraints/Count.rst +++ b/reference/constraints/Count.rst @@ -115,7 +115,7 @@ Options ``divisibleBy`` ~~~~~~~~~~~~~~~ -**type**: ``integer`` **default**: null +**type**: ``integer`` **default**: ``null`` .. versionadded:: 5.1 diff --git a/reference/constraints/Regex.rst b/reference/constraints/Regex.rst index d4ecf423fd0..6c7f34a5422 100644 --- a/reference/constraints/Regex.rst +++ b/reference/constraints/Regex.rst @@ -193,7 +193,7 @@ Options ``htmlPattern`` ~~~~~~~~~~~~~~~ -**type**: ``string|boolean`` **default**: null +**type**: ``string|boolean`` **default**: ``null`` This option specifies the pattern to use in the HTML5 ``pattern`` attribute. You usually don't need to specify this option because by default, the constraint diff --git a/reference/forms/types/options/help.rst.inc b/reference/forms/types/options/help.rst.inc index 86f84111c88..c69e99819b3 100644 --- a/reference/forms/types/options/help.rst.inc +++ b/reference/forms/types/options/help.rst.inc @@ -1,7 +1,7 @@ help ~~~~ -**type**: ``string`` or ``TranslatableMessage`` **default**: null +**type**: ``string`` or ``TranslatableMessage`` **default**: ``null`` Allows you to define a help message for the form field, which by default is rendered below the field:: From e45f6e9dc0ff57db7b17ce312b141857433ccff2 Mon Sep 17 00:00:00 2001 From: MatTheCat Date: Mon, 8 May 2023 14:01:13 +0200 Subject: [PATCH 026/670] Improve the warning about signing messages in a listener --- mailer.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mailer.rst b/mailer.rst index 712efa8a8c5..3a5e9223411 100644 --- a/mailer.rst +++ b/mailer.rst @@ -1044,6 +1044,15 @@ Before signing/encrypting messages, make sure to have: When using OpenSSL to generate certificates, make sure to add the ``-addtrust emailProtection`` command option. +.. caution:: + + These features require messages to be rendered, + which is not always immediate. + For example, :ref:`templated emails ` content is generated + by a :class:`Symfony\\Component\\Mailer\\EventListener\\MessageListener`. + If you need to sign and/or encrypt such a message, you need to do so in + a :ref:`MessageEvent ` listener with a negative priority. + Signing Messages ~~~~~~~~~~~~~~~~ @@ -1432,13 +1441,6 @@ is sent:: } } -.. tip:: - - When using a ``MessageEvent`` listener to - :doc:`sign the email contents `, run it as - late as possible (e.g. setting a negative priority for it) so the email - contents are not set or modified after signing them. - Development & Debugging ----------------------- From 07f6609a1b8bec0839a56d464e18b2abb06c753f Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Sun, 7 May 2023 22:57:08 +0200 Subject: [PATCH 027/670] [Fix pipeline] multiple_kernels.rst must respect doctor-rst --- .doctor-rst.yaml | 14 ++++++++++++++ configuration/multiple_kernels.rst | 18 +++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.doctor-rst.yaml b/.doctor-rst.yaml index 0fc471cfee8..318d55b688a 100644 --- a/.doctor-rst.yaml +++ b/.doctor-rst.yaml @@ -101,3 +101,17 @@ whitelist: - '// bin/console' - '.. _`a feature to test applications using Mercure`: https://github.com/symfony/panther#creating-isolated-browsers-to-test-apps-using-mercure-or-websocket' - '.. End to End Tests (E2E)' + - 'First, create a new ``apps`` directory at the root of your project, which will' # configuration/multiple_kernels.rst + - '├─ apps/' # configuration/multiple_kernels.rst + - '``apps/`` directory. Therefore, you should carefully consider what is' # configuration/multiple_kernels.rst + - 'Since the new ``apps/api/src/`` directory will host the PHP code related to the' # configuration/multiple_kernels.rst + - '"Api\\": "apps/api/src/"' # configuration/multiple_kernels.rst + - "return $this->getProjectDir().'/apps/'.$this->id.'/config';" # configuration/multiple_kernels.rst + - '``apps/`` as it is used in the Kernel to load the specific application' # configuration/multiple_kernels.rst + - '``apps/admin/templates/`` which you will need to manually configure under the' # configuration/multiple_kernels.rst + - '# apps/admin/config/packages/twig.yaml' # configuration/multiple_kernels.rst + - "'%kernel.project_dir%/apps/admin/templates': Admin" # configuration/multiple_kernels.rst + - '// apps/api/tests/ApiTestCase.php' # configuration/multiple_kernels.rst + - 'Now, create a ``tests/`` directory inside the ``apps/api/`` application. Then,' # configuration/multiple_kernels.rst + - '"Api\\Tests\\": "apps/api/tests/"' # configuration/multiple_kernels.rst + - 'apps/api/tests' # configuration/multiple_kernels.rst diff --git a/configuration/multiple_kernels.rst b/configuration/multiple_kernels.rst index 9464fcf39f7..cc50c27a1d4 100644 --- a/configuration/multiple_kernels.rst +++ b/configuration/multiple_kernels.rst @@ -164,12 +164,12 @@ resources:: return ($_SERVER['APP_LOG_DIR'] ?? $this->getProjectDir().'/var/log').'/'.$this->id; } - protected function configureContainer(ContainerConfigurator $container): void + protected function configureContainer(ContainerConfigurator $containerConfigurator): void { // load common config files, such as the framework.yaml, as well as // specific configs required exclusively for the app itself - $this->doConfigureContainer($container, $this->getSharedConfigDir()); - $this->doConfigureContainer($container, $this->getAppConfigDir()); + $this->doConfigureContainer($containerConfigurator, $this->getSharedConfigDir()); + $this->doConfigureContainer($containerConfigurator, $this->getAppConfigDir()); } protected function configureRoutes(RoutingConfigurator $routes): void @@ -180,16 +180,16 @@ resources:: $this->doConfigureRoutes($routes, $this->getAppConfigDir()); } - private function doConfigureContainer(ContainerConfigurator $container, string $configDir): void + private function doConfigureContainer(ContainerConfigurator $containerConfigurator, string $configDir): void { - $container->import($configDir.'/{packages}/*.{php,yaml}'); - $container->import($configDir.'/{packages}/'.$this->environment.'/*.{php,yaml}'); + $containerConfigurator->import($configDir.'/{packages}/*.{php,yaml}'); + $containerConfigurator->import($configDir.'/{packages}/'.$this->environment.'/*.{php,yaml}'); if (is_file($configDir.'/services.yaml')) { - $container->import($configDir.'/services.yaml'); - $container->import($configDir.'/{services}_'.$this->environment.'.yaml'); + $containerConfigurator->import($configDir.'/services.yaml'); + $containerConfigurator->import($configDir.'/{services}_'.$this->environment.'.yaml'); } else { - $container->import($configDir.'/{services}.php'); + $containerConfigurator->import($configDir.'/{services}.php'); } } From d22a4bd4db92da667dfe8359f05e5459c27990b4 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 9 May 2023 11:31:48 +0200 Subject: [PATCH 028/670] Tweaks --- mailer.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mailer.rst b/mailer.rst index 3a5e9223411..ee69bd3b123 100644 --- a/mailer.rst +++ b/mailer.rst @@ -1046,12 +1046,12 @@ Before signing/encrypting messages, make sure to have: .. caution:: - These features require messages to be rendered, - which is not always immediate. - For example, :ref:`templated emails ` content is generated + Signing and encrypting messages require their contents to be fully rendered. + For example, the content of :ref:`templated emails ` is rendered by a :class:`Symfony\\Component\\Mailer\\EventListener\\MessageListener`. - If you need to sign and/or encrypt such a message, you need to do so in - a :ref:`MessageEvent ` listener with a negative priority. + So, if you want to sign and/or encrypt such a message, you need to do it in + a :ref:`MessageEvent ` listener run after it (you need to set + a negative priority to your listener). Signing Messages ~~~~~~~~~~~~~~~~ From 7b0bac7ff72206c5e1b3d56231716fb1417dca48 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 5 May 2023 17:11:43 +0200 Subject: [PATCH 029/670] Update all links to PHPUnit docs --- best_practices.rst | 2 +- components/phpunit_bridge.rst | 10 +++++----- create_framework/unit_testing.rst | 4 ++-- form/unit_testing.rst | 2 +- testing.rst | 8 ++++---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/best_practices.rst b/best_practices.rst index 159868118b3..02896abc627 100644 --- a/best_practices.rst +++ b/best_practices.rst @@ -463,4 +463,4 @@ you must set up a redirection. .. _`feature toggles`: https://en.wikipedia.org/wiki/Feature_toggle .. _`smoke testing`: https://en.wikipedia.org/wiki/Smoke_testing_(software) .. _`Webpack`: https://webpack.js.org/ -.. _`PHPUnit data providers`: https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#data-providers +.. _`PHPUnit data providers`: https://docs.phpunit.de/en/9.5/writing-tests-for-phpunit.html#data-providers diff --git a/components/phpunit_bridge.rst b/components/phpunit_bridge.rst index 2d8803c4089..558fd808db6 100644 --- a/components/phpunit_bridge.rst +++ b/components/phpunit_bridge.rst @@ -1062,13 +1062,13 @@ not find the SUT: .. _`PHPUnit`: https://phpunit.de -.. _`PHPUnit event listener`: https://phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.PHPUnit_Framework_TestListener +.. _`PHPUnit event listener`: https://docs.phpunit.de/en/10.0/extending-phpunit.html#phpunit-s-event-system .. _`ErrorHandler component`: https://github.com/symfony/error-handler -.. _`PHPUnit's assertStringMatchesFormat()`: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertStringMatchesFormat +.. _`PHPUnit's assertStringMatchesFormat()`: https://docs.phpunit.de/en/9.5/assertions.html#assertstringmatchesformat .. _`PHP error handler`: https://www.php.net/manual/en/book.errorfunc.php -.. _`environment variable`: https://phpunit.de/manual/current/en/appendixes.configuration.html#appendixes.configuration.php-ini-constants-variables +.. _`environment variable`: https://docs.phpunit.de/en/9.5/configuration.html#the-env-element .. _`@-silencing operator`: https://www.php.net/manual/en/language.operators.errorcontrol.php .. _`Travis CI`: https://travis-ci.org/ -.. _`test listener`: https://phpunit.de/manual/current/en/appendixes.configuration.html#appendixes.configuration.test-listeners -.. _`@covers`: https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.covers +.. _`test listener`: https://docs.phpunit.de/en/9.5/configuration.html#the-extensions-element +.. _`@covers`: https://docs.phpunit.de/en/9.5/annotations.html#covers .. _`PHP namespace resolutions rules`: https://www.php.net/manual/en/language.namespaces.rules.php diff --git a/create_framework/unit_testing.rst b/create_framework/unit_testing.rst index c2d04115812..cd3b30cac6c 100644 --- a/create_framework/unit_testing.rst +++ b/create_framework/unit_testing.rst @@ -220,6 +220,6 @@ Symfony code. Now that we are confident (again) about the code we have written, we can safely think about the next batch of features we want to add to our framework. -.. _`PHPUnit`: https://phpunit.readthedocs.io/en/9.5/ -.. _`test doubles`: https://phpunit.readthedocs.io/en/9.5/test-doubles.html +.. _`PHPUnit`: https://docs.phpunit.de/en/9.5/ +.. _`test doubles`: https://docs.phpunit.de/en/9.5/test-doubles.html .. _`XDebug`: https://xdebug.org/ diff --git a/form/unit_testing.rst b/form/unit_testing.rst index d67b5f3bae7..3c4a7b780a3 100644 --- a/form/unit_testing.rst +++ b/form/unit_testing.rst @@ -241,4 +241,4 @@ guessers using the :method:`Symfony\\Component\\Form\\Test\\FormIntegrationTestC and :method:`Symfony\\Component\\Form\\Test\\FormIntegrationTestCase::getTypeGuessers` methods. -.. _`PHPUnit data providers`: https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#data-providers +.. _`PHPUnit data providers`: https://docs.phpunit.de/en/9.5/writing-tests-for-phpunit.html#data-providers diff --git a/testing.rst b/testing.rst index 3ca9f5e6e8a..ed0ab1a8e2c 100644 --- a/testing.rst +++ b/testing.rst @@ -1115,13 +1115,13 @@ Learn more /components/css_selector .. _`PHPUnit`: https://phpunit.de/ -.. _`documentation`: https://phpunit.readthedocs.io/ -.. _`Writing Tests for PHPUnit`: https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html -.. _`PHPUnit documentation`: https://phpunit.readthedocs.io/en/9.5/configuration.html +.. _`documentation`: https://docs.phpunit.de/ +.. _`Writing Tests for PHPUnit`: https://docs.phpunit.de/en/9.5/writing-tests-for-phpunit.html +.. _`PHPUnit documentation`: https://docs.phpunit.de/en/9.5/configuration.html .. _`unit test`: https://en.wikipedia.org/wiki/Unit_testing .. _`DAMADoctrineTestBundle`: https://github.com/dmaicher/doctrine-test-bundle .. _`Doctrine data fixtures`: https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html .. _`DoctrineFixturesBundle documentation`: https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html .. _`SymfonyMakerBundle`: https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html -.. _`PHPUnit Assertion`: https://phpunit.readthedocs.io/en/9.5/assertions.html +.. _`PHPUnit Assertion`: https://docs.phpunit.de/en/9.5/assertions.html .. _`section 4.1.18 of RFC 3875`: https://tools.ietf.org/html/rfc3875#section-4.1.18 From b7d5c256c88f34ba00abe8cccd169bad295c62d9 Mon Sep 17 00:00:00 2001 From: Matthias Schmidt Date: Sun, 7 May 2023 20:11:10 +0200 Subject: [PATCH 030/670] [Frontend] Update package.json example path See symfony/ux@561a4a3609bd234b5ef1dacc9c42f5f89f071372 --- frontend/ux.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ux.rst b/frontend/ux.rst index a43bcd8d028..98360893905 100644 --- a/frontend/ux.rst +++ b/frontend/ux.rst @@ -59,7 +59,7 @@ PHP package. For example: { "devDependencies": { "...": "", - "@symfony/ux-chartjs": "file:vendor/symfony/ux-chartjs/Resources/assets" + "@symfony/ux-chartjs": "file:vendor/symfony/ux-chartjs/assets" } } From 26d021c632d989621e541fdfe12b408e8c927aa7 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Wed, 10 May 2023 08:41:12 +0200 Subject: [PATCH 031/670] Use "$container" consistently --- .doctor-rst.yaml | 4 +- bundles/best_practices.rst | 4 +- bundles/configuration.rst | 12 ++-- bundles/extension.rst | 8 +-- bundles/prepend_extension.rst | 20 +++--- cache.rst | 8 +-- components/dependency_injection.rst | 52 +++++++------- .../_imports-parameters-note.rst.inc | 4 +- .../dependency_injection/compilation.rst | 72 +++++++++---------- components/event_dispatcher.rst | 20 +++--- components/serializer.rst | 4 +- components/uid.rst | 8 +-- components/var_dumper.rst | 4 +- configuration.rst | 50 ++++++------- configuration/env_var_processors.rst | 20 +++--- configuration/micro_kernel_trait.rst | 14 ++-- configuration/multiple_kernels.rst | 18 ++--- configuration/using_parameters_in_dic.rst | 4 +- console/lazy_commands.rst | 10 +-- controller/argument_value_resolver.rst | 4 +- controller/upload_file.rst | 4 +- create_framework/dependency_injection.rst | 24 +++---- doctrine/events.rst | 12 ++-- event_dispatcher.rst | 8 +-- frontend/custom_version_strategy.rst | 4 +- http_cache/cache_invalidation.rst | 4 +- mailer.rst | 4 +- messenger/multiple_buses.rst | 4 +- profiler.rst | 4 +- quick_tour/the_architecture.rst | 4 +- reference/configuration/framework.rst | 4 +- reference/dic_tags.rst | 8 +-- routing/custom_route_loader.rst | 4 +- security.rst | 8 +-- security/access_control.rst | 4 +- service_container.rst | 22 +++--- service_container/alias_private.rst | 20 +++--- service_container/autowiring.rst | 10 +-- service_container/calls.rst | 2 +- service_container/compiler_passes.rst | 16 ++--- service_container/configurators.rst | 8 +-- service_container/expression_language.rst | 6 +- service_container/factories.rst | 20 +++--- service_container/import.rst | 8 +-- service_container/injection_types.rst | 12 ++-- service_container/lazy_services.rst | 8 +-- service_container/optional_dependencies.rst | 8 +-- service_container/parent_services.rst | 8 +-- service_container/service_closures.rst | 6 +- service_container/service_decoration.rst | 32 ++++----- .../service_subscribers_locators.rst | 30 ++++---- service_container/shared.rst | 4 +- service_container/synthetic_services.rst | 4 +- service_container/tags.rst | 66 ++++++++--------- session.rst | 16 ++--- testing.rst | 4 +- 56 files changed, 375 insertions(+), 375 deletions(-) diff --git a/.doctor-rst.yaml b/.doctor-rst.yaml index 318d55b688a..6e22b45bb97 100644 --- a/.doctor-rst.yaml +++ b/.doctor-rst.yaml @@ -2,8 +2,8 @@ rules: american_english: ~ argument_variable_must_match_type: arguments: - - { type: 'ContainerBuilder', name: 'containerBuilder' } - - { type: 'ContainerConfigurator', name: 'containerConfigurator' } + - { type: 'ContainerBuilder', name: 'container' } + - { type: 'ContainerConfigurator', name: 'container' } avoid_repetetive_words: ~ blank_line_after_anchor: ~ blank_line_after_directive: ~ diff --git a/bundles/best_practices.rst b/bundles/best_practices.rst index d5c73209f26..e622cfd243f 100644 --- a/bundles/best_practices.rst +++ b/bundles/best_practices.rst @@ -442,8 +442,8 @@ The end user can provide values in any configuration file: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->parameters() + return static function (ContainerConfigurator $container) { + $container->parameters() ->set('acme_blog.author.email', 'fabien@example.com') ; }; diff --git a/bundles/configuration.rst b/bundles/configuration.rst index e25d6e01036..a30b6310ec1 100644 --- a/bundles/configuration.rst +++ b/bundles/configuration.rst @@ -217,7 +217,7 @@ force validation (e.g. if an additional option was passed, an exception will be thrown):: // src/Acme/SocialBundle/DependencyInjection/AcmeSocialExtension.php - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); @@ -259,15 +259,15 @@ In your extension, you can load this and dynamically set its arguments:: use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { - $loader = new XmlFileLoader($containerBuilder, new FileLocator(dirname(__DIR__).'/Resources/config')); + $loader = new XmlFileLoader($container, new FileLocator(dirname(__DIR__).'/Resources/config')); $loader->load('services.xml'); $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); - $definition = $containerBuilder->getDefinition('acme.social.twitter_client'); + $definition = $container->getDefinition('acme.social.twitter_client'); $definition->replaceArgument(0, $config['twitter']['client_id']); $definition->replaceArgument(1, $config['twitter']['client_secret']); } @@ -288,7 +288,7 @@ In your extension, you can load this and dynamically set its arguments:: class AcmeHelloExtension extends ConfigurableExtension { // note that this method is called loadInternal and not load - protected function loadInternal(array $mergedConfig, ContainerBuilder $containerBuilder) + protected function loadInternal(array $mergedConfig, ContainerBuilder $container) { // ... } @@ -304,7 +304,7 @@ In your extension, you can load this and dynamically set its arguments:: (e.g. by overriding configurations and using :phpfunction:`isset` to check for the existence of a value). Be aware that it'll be very hard to support XML:: - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $config = []; // let resources override the previous set value diff --git a/bundles/extension.rst b/bundles/extension.rst index 2a8a5965451..74659cd98b6 100644 --- a/bundles/extension.rst +++ b/bundles/extension.rst @@ -34,7 +34,7 @@ This is how the extension of an AcmeHelloBundle should look like:: class AcmeHelloExtension extends Extension { - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { // ... you'll load the files here later } @@ -89,10 +89,10 @@ For instance, assume you have a file called ``services.xml`` in the use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; // ... - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader( - $containerBuilder, + $container, new FileLocator(__DIR__.'/../Resources/config') ); $loader->load('services.xml'); @@ -115,7 +115,7 @@ they are compiled when generating the application cache to improve the overall performance. Define the list of annotated classes to compile in the ``addAnnotatedClassesToCompile()`` method:: - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { // ... diff --git a/bundles/prepend_extension.rst b/bundles/prepend_extension.rst index 6ad1ad758d3..35c277ec0e6 100644 --- a/bundles/prepend_extension.rst +++ b/bundles/prepend_extension.rst @@ -31,7 +31,7 @@ To give an Extension the power to do this, it needs to implement { // ... - public function prepend(ContainerBuilder $containerBuilder) + public function prepend(ContainerBuilder $container) { // ... } @@ -52,15 +52,15 @@ a configuration setting in multiple bundles as well as disable a flag in multipl in case a specific other bundle is not registered:: // src/Acme/HelloBundle/DependencyInjection/AcmeHelloExtension.php - public function prepend(ContainerBuilder $containerBuilder) + public function prepend(ContainerBuilder $container) { // get all bundles - $bundles = $containerBuilder->getParameter('kernel.bundles'); + $bundles = $container->getParameter('kernel.bundles'); // determine if AcmeGoodbyeBundle is registered if (!isset($bundles['AcmeGoodbyeBundle'])) { // disable AcmeGoodbyeBundle in bundles $config = ['use_acme_goodbye' => false]; - foreach ($containerBuilder->getExtensions() as $name => $extension) { + foreach ($container->getExtensions() as $name => $extension) { switch ($name) { case 'acme_something': case 'acme_other': @@ -70,21 +70,21 @@ in case a specific other bundle is not registered:: // note that if the user manually configured // use_acme_goodbye to true in config/services.yaml // then the setting would in the end be true and not false - $containerBuilder->prependExtensionConfig($name, $config); + $container->prependExtensionConfig($name, $config); break; } } } // get the configuration of AcmeHelloExtension (it's a list of configuration) - $configs = $containerBuilder->getExtensionConfig($this->getAlias()); + $configs = $container->getExtensionConfig($this->getAlias()); // iterate in reverse to preserve the original order after prepending the config foreach (array_reverse($configs) as $config) { // check if entity_manager_name is set in the "acme_hello" configuration if (isset($config['entity_manager_name'])) { // prepend the acme_something settings with the entity_manager_name - $containerBuilder->prependExtensionConfig('acme_something', [ + $container->prependExtensionConfig('acme_something', [ 'entity_manager_name' => $config['entity_manager_name'], ]); } @@ -141,13 +141,13 @@ registered and the ``entity_manager_name`` setting for ``acme_hello`` is set to // config/packages/acme_something.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->extension('acme_something', [ + return static function (ContainerConfigurator $container) { + $container->extension('acme_something', [ // ... 'use_acme_goodbye' => false, 'entity_manager_name' => 'non_default', ]); - $containerConfigurator->extension('acme_other', [ + $container->extension('acme_other', [ // ... 'use_acme_goodbye' => false, ]); diff --git a/cache.rst b/cache.rst index 48d3a250bd1..118ef13a326 100644 --- a/cache.rst +++ b/cache.rst @@ -384,8 +384,8 @@ with either :class:`Symfony\\Contracts\\Cache\\CacheInterface` or // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return function(ContainerConfigurator $container) { + $container->services() // ... ->set('app.cache.adapter.redis') @@ -465,14 +465,14 @@ and use that when configuring the pool. use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $containerBuilder, FrameworkConfig $framework) { + return static function (ContainerBuilder $container, FrameworkConfig $framework) { $framework->cache() ->pool('cache.my_redis') ->adapters(['cache.adapter.redis']) ->provider('app.my_custom_redis_provider'); - $containerBuilder->register('app.my_custom_redis_provider', \Redis::class) + $container->register('app.my_custom_redis_provider', \Redis::class) ->setFactory([RedisAdapter::class, 'createConnection']) ->addArgument('redis://localhost') ->addArgument([ diff --git a/components/dependency_injection.rst b/components/dependency_injection.rst index dcc98bf2450..a6d8521f03a 100644 --- a/components/dependency_injection.rst +++ b/components/dependency_injection.rst @@ -45,8 +45,8 @@ You can register this in the container as a service:: use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); - $containerBuilder->register('mailer', 'Mailer'); + $container = new ContainerBuilder(); + $container->register('mailer', 'Mailer'); An improvement to the class to make it more flexible would be to allow the container to set the ``transport`` used. If you change the class @@ -68,8 +68,8 @@ Then you can set the choice of transport in the container:: use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); - $containerBuilder + $container = new ContainerBuilder(); + $container ->register('mailer', 'Mailer') ->addArgument('sendmail'); @@ -83,9 +83,9 @@ the ``Mailer`` service's constructor argument:: use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); - $containerBuilder->setParameter('mailer.transport', 'sendmail'); - $containerBuilder + $container = new ContainerBuilder(); + $container->setParameter('mailer.transport', 'sendmail'); + $container ->register('mailer', 'Mailer') ->addArgument('%mailer.transport%'); @@ -112,14 +112,14 @@ not exist yet. Use the ``Reference`` class to tell the container to inject the use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); - $containerBuilder->setParameter('mailer.transport', 'sendmail'); - $containerBuilder + $container->setParameter('mailer.transport', 'sendmail'); + $container ->register('mailer', 'Mailer') ->addArgument('%mailer.transport%'); - $containerBuilder + $container ->register('newsletter_manager', 'NewsletterManager') ->addArgument(new Reference('mailer')); @@ -144,14 +144,14 @@ If you do want to though then the container can call the setter method:: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); - $containerBuilder->setParameter('mailer.transport', 'sendmail'); - $containerBuilder + $container->setParameter('mailer.transport', 'sendmail'); + $container ->register('mailer', 'Mailer') ->addArgument('%mailer.transport%'); - $containerBuilder + $container ->register('newsletter_manager', 'NewsletterManager') ->addMethodCall('setMailer', [new Reference('mailer')]); @@ -160,11 +160,11 @@ like this:: use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); // ... - $newsletterManager = $containerBuilder->get('newsletter_manager'); + $newsletterManager = $container->get('newsletter_manager'); Avoiding your Code Becoming Dependent on the Container ------------------------------------------------------ @@ -198,8 +198,8 @@ Loading an XML config file:: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; - $containerBuilder = new ContainerBuilder(); - $loader = new XmlFileLoader($containerBuilder, new FileLocator(__DIR__)); + $container = new ContainerBuilder(); + $loader = new XmlFileLoader($container, new FileLocator(__DIR__)); $loader->load('services.xml'); Loading a YAML config file:: @@ -208,8 +208,8 @@ Loading a YAML config file:: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; - $containerBuilder = new ContainerBuilder(); - $loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__)); + $container = new ContainerBuilder(); + $loader = new YamlFileLoader($container, new FileLocator(__DIR__)); $loader->load('services.yaml'); .. note:: @@ -233,8 +233,8 @@ into a separate config file and load it in a similar way:: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; - $containerBuilder = new ContainerBuilder(); - $loader = new PhpFileLoader($containerBuilder, new FileLocator(__DIR__)); + $container = new ContainerBuilder(); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__)); $loader->load('services.php'); You can now set up the ``newsletter_manager`` and ``mailer`` services using @@ -287,13 +287,13 @@ config files: namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->parameters() + return static function (ContainerConfigurator $container) { + $container->parameters() // ... ->set('mailer.transport', 'sendmail') ; - $services = $containerConfigurator->services(); + $services = $container->services(); $services->set('mailer', 'Mailer') ->args(['%mailer.transport%']) ; diff --git a/components/dependency_injection/_imports-parameters-note.rst.inc b/components/dependency_injection/_imports-parameters-note.rst.inc index 45a75652fda..d17d6d60b26 100644 --- a/components/dependency_injection/_imports-parameters-note.rst.inc +++ b/components/dependency_injection/_imports-parameters-note.rst.inc @@ -31,6 +31,6 @@ // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->import('%kernel.project_dir%/somefile.yaml'); + return static function (ContainerConfigurator $container) { + $container->import('%kernel.project_dir%/somefile.yaml'); }; diff --git a/components/dependency_injection/compilation.rst b/components/dependency_injection/compilation.rst index 3880d6b5508..edaa8be8f47 100644 --- a/components/dependency_injection/compilation.rst +++ b/components/dependency_injection/compilation.rst @@ -61,10 +61,10 @@ A very simple extension may just load configuration files into the container:: class AcmeDemoExtension implements ExtensionInterface { - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader( - $containerBuilder, + $container, new FileLocator(__DIR__.'/../Resources/config') ); $loader->load('services.xml'); @@ -114,14 +114,14 @@ are loaded:: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; - $containerBuilder = new ContainerBuilder(); - $containerBuilder->registerExtension(new AcmeDemoExtension); + $container = new ContainerBuilder(); + $container->registerExtension(new AcmeDemoExtension); - $loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__)); + $loader = new YamlFileLoader($container, new FileLocator(__DIR__)); $loader->load('config.yaml'); // ... - $containerBuilder->compile(); + $container->compile(); .. note:: @@ -132,7 +132,7 @@ are loaded:: The values from those sections of the config files are passed into the first argument of the ``load()`` method of the extension:: - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $foo = $configs[0]['foo']; //fooValue $bar = $configs[0]['bar']; //barValue @@ -158,7 +158,7 @@ you could access the config value this way:: use Symfony\Component\Config\Definition\Processor; // ... - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $processor = new Processor(); @@ -219,13 +219,13 @@ The processed config value can now be added as container parameters as if it were listed in a ``parameters`` section of the config file but with the additional benefit of merging multiple files and validation of the configuration:: - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $processor = new Processor(); $config = $processor->processConfiguration($configuration, $configs); - $containerBuilder->setParameter('acme_demo.FOO', $config['foo']); + $container->setParameter('acme_demo.FOO', $config['foo']); // ... } @@ -234,14 +234,14 @@ More complex configuration requirements can be catered for in the Extension classes. For example, you may choose to load a main service configuration file but also load a secondary one only if a certain parameter is set:: - public function load(array $configs, ContainerBuilder $containerBuilder) + public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $processor = new Processor(); $config = $processor->processConfiguration($configuration, $configs); $loader = new XmlFileLoader( - $containerBuilder, + $container, new FileLocator(__DIR__.'/../Resources/config') ); $loader->load('services.xml'); @@ -263,11 +263,11 @@ file but also load a secondary one only if a certain parameter is set:: use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); $extension = new AcmeDemoExtension(); - $containerBuilder->registerExtension($extension); - $containerBuilder->loadFromExtension($extension->getAlias()); - $containerBuilder->compile(); + $container->registerExtension($extension); + $container->loadFromExtension($extension->getAlias()); + $container->compile(); .. note:: @@ -292,11 +292,11 @@ method is called by implementing { // ... - public function prepend(ContainerBuilder $containerBuilder) + public function prepend(ContainerBuilder $container) { // ... - $containerBuilder->prependExtensionConfig($name, $config); + $container->prependExtensionConfig($name, $config); // ... } @@ -323,7 +323,7 @@ compilation:: class AcmeDemoExtension implements ExtensionInterface, CompilerPassInterface { - public function process(ContainerBuilder $containerBuilder) + public function process(ContainerBuilder $container) { // ... do something during the compilation } @@ -377,7 +377,7 @@ class implementing the ``CompilerPassInterface``:: class CustomPass implements CompilerPassInterface { - public function process(ContainerBuilder $containerBuilder) + public function process(ContainerBuilder $container) { // ... do something during the compilation } @@ -387,8 +387,8 @@ You then need to register your custom pass with the container:: use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); - $containerBuilder->addCompilerPass(new CustomPass()); + $container = new ContainerBuilder(); + $container->addCompilerPass(new CustomPass()); .. note:: @@ -418,7 +418,7 @@ For example, to run your custom pass after the default removal passes have been run, use:: // ... - $containerBuilder->addCompilerPass( + $container->addCompilerPass( new CustomPass(), PassConfig::TYPE_AFTER_REMOVING ); @@ -460,11 +460,11 @@ serves at dumping the compiled container:: require_once $file; $container = new ProjectServiceContainer(); } else { - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); // ... - $containerBuilder->compile(); + $container->compile(); - $dumper = new PhpDumper($containerBuilder); + $dumper = new PhpDumper($container); file_put_contents($file, $dumper->dump()); } @@ -487,11 +487,11 @@ dump it:: require_once $file; $container = new MyCachedContainer(); } else { - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); // ... - $containerBuilder->compile(); + $container->compile(); - $dumper = new PhpDumper($containerBuilder); + $dumper = new PhpDumper($container); file_put_contents( $file, $dumper->dump(['class' => 'MyCachedContainer']) @@ -519,12 +519,12 @@ application:: require_once $file; $container = new MyCachedContainer(); } else { - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); // ... - $containerBuilder->compile(); + $container->compile(); if (!$isDebug) { - $dumper = new PhpDumper($containerBuilder); + $dumper = new PhpDumper($container); file_put_contents( $file, $dumper->dump(['class' => 'MyCachedContainer']) @@ -554,14 +554,14 @@ for these resources and use them as metadata for the cache:: $containerConfigCache = new ConfigCache($file, $isDebug); if (!$containerConfigCache->isFresh()) { - $containerBuilder = new ContainerBuilder(); + $container = new ContainerBuilder(); // ... - $containerBuilder->compile(); + $container->compile(); - $dumper = new PhpDumper($containerBuilder); + $dumper = new PhpDumper($container); $containerConfigCache->write( $dumper->dump(['class' => 'MyCachedContainer']), - $containerBuilder->getResources() + $container->getResources() ); } diff --git a/components/event_dispatcher.rst b/components/event_dispatcher.rst index 5459d27bdb3..1e281c084b0 100644 --- a/components/event_dispatcher.rst +++ b/components/event_dispatcher.rst @@ -186,22 +186,22 @@ determine which instance is passed. use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventDispatcher; - $containerBuilder = new ContainerBuilder(new ParameterBag()); + $container = new ContainerBuilder(new ParameterBag()); // register the compiler pass that handles the 'kernel.event_listener' // and 'kernel.event_subscriber' service tags - $containerBuilder->addCompilerPass(new RegisterListenersPass()); + $container->addCompilerPass(new RegisterListenersPass()); - $containerBuilder->register('event_dispatcher', EventDispatcher::class); + $container->register('event_dispatcher', EventDispatcher::class); // registers an event listener - $containerBuilder->register('listener_service_id', \AcmeListener::class) + $container->register('listener_service_id', \AcmeListener::class) ->addTag('kernel.event_listener', [ 'event' => 'acme.foo.action', 'method' => 'onFooAction', ]); // registers an event subscriber - $containerBuilder->register('subscriber_service_id', \AcmeSubscriber::class) + $container->register('subscriber_service_id', \AcmeSubscriber::class) ->addTag('kernel.event_subscriber'); ``RegisterListenersPass`` resolves aliased class names which for instance @@ -218,16 +218,16 @@ determine which instance is passed. use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventDispatcher; - $containerBuilder = new ContainerBuilder(new ParameterBag()); - $containerBuilder->addCompilerPass(new AddEventAliasesPass([ + $container = new ContainerBuilder(new ParameterBag()); + $container->addCompilerPass(new AddEventAliasesPass([ \AcmeFooActionEvent::class => 'acme.foo.action', ])); - $containerBuilder->addCompilerPass(new RegisterListenersPass(), PassConfig::TYPE_BEFORE_REMOVING); + $container->addCompilerPass(new RegisterListenersPass(), PassConfig::TYPE_BEFORE_REMOVING); - $containerBuilder->register('event_dispatcher', EventDispatcher::class); + $container->register('event_dispatcher', EventDispatcher::class); // registers an event listener - $containerBuilder->register('listener_service_id', \AcmeListener::class) + $container->register('listener_service_id', \AcmeListener::class) ->addTag('kernel.event_listener', [ // will be translated to 'acme.foo.action' by RegisterListenersPass. 'event' => \AcmeFooActionEvent::class, diff --git a/components/serializer.rst b/components/serializer.rst index cf09f0b7992..29c008ce2c4 100644 --- a/components/serializer.rst +++ b/components/serializer.rst @@ -998,8 +998,8 @@ faster alternative to the use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return static function (ContainerConfigurator $container) { + $container->services() // ... ->set('get_set_method_normalizer', GetSetMethodNormalizer::class) ->tag('serializer.normalizer') diff --git a/components/uid.rst b/components/uid.rst index ccd567f6ccf..1731c392dba 100644 --- a/components/uid.rst +++ b/components/uid.rst @@ -126,13 +126,13 @@ configure the behavior of the factory using configuration files:: // config/packages/uid.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator): void { - $services = $containerConfigurator->services() + return static function (ContainerConfigurator $container): void { + $services = $container->services() ->defaults() ->autowire() ->autoconfigure(); - $containerConfigurator->extension('framework', [ + $container->extension('framework', [ 'uid' => [ 'default_uuid_version' => 6, 'name_based_uuid_version' => 5, @@ -568,7 +568,7 @@ configuration in your application before using these commands: use Symfony\Component\Uid\Command\InspectUlidCommand; use Symfony\Component\Uid\Command\InspectUuidCommand; - return static function (ContainerConfigurator $containerConfigurator): void { + return static function (ContainerConfigurator $container): void { // ... $services diff --git a/components/var_dumper.rst b/components/var_dumper.rst index 6b0d3bc6ea1..e8a4d18d0c7 100644 --- a/components/var_dumper.rst +++ b/components/var_dumper.rst @@ -144,8 +144,8 @@ the :ref:`dump_destination option ` of the // config/packages/debug.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->extension('debug', [ + return static function (ContainerConfigurator $container) { + $container->extension('debug', [ 'dump_destination' => 'tcp://%env(VAR_DUMPER_SERVER)%', ]); }; diff --git a/configuration.rst b/configuration.rst index c56b895da8b..79d014f9170 100644 --- a/configuration.rst +++ b/configuration.rst @@ -73,18 +73,18 @@ shown in these three formats. { // ... - private function configureContainer(ContainerConfigurator $containerConfigurator): void + private function configureContainer(ContainerConfigurator $container): void { $configDir = $this->getConfigDir(); - $containerConfigurator->import($configDir.'/{packages}/*.{yaml,php}'); - $containerConfigurator->import($configDir.'/{packages}/'.$this->environment.'/*.{yaml,php}'); + $container->import($configDir.'/{packages}/*.{yaml,php}'); + $container->import($configDir.'/{packages}/'.$this->environment.'/*.{yaml,php}'); if (is_file($configDir.'/services.yaml')) { - $containerConfigurator->import($configDir.'/services.yaml'); - $containerConfigurator->import($configDir.'/{services}_'.$this->environment.'.yaml'); + $container->import($configDir.'/services.yaml'); + $container->import($configDir.'/{services}_'.$this->environment.'.yaml'); } else { - $containerConfigurator->import($configDir.'/{services}.php'); + $container->import($configDir.'/{services}.php'); } } } @@ -158,17 +158,17 @@ configuration files, even if they use a different format: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->import('legacy_config.php'); + return static function (ContainerConfigurator $container) { + $container->import('legacy_config.php'); // glob expressions are also supported to load multiple files - $containerConfigurator->import('/etc/myapp/*.yaml'); + $container->import('/etc/myapp/*.yaml'); // the third optional argument of import() is 'ignore_errors' // 'ignore_errors' set to 'not_found' silently discards errors if the loaded file doesn't exist - $containerConfigurator->import('my_config_file.yaml', null, 'not_found'); + $container->import('my_config_file.yaml', null, 'not_found'); // 'ignore_errors' set to true silently discards all errors (including invalid code and not found) - $containerConfigurator->import('my_config_file.yaml', null, true); + $container->import('my_config_file.yaml', null, true); }; // ... @@ -257,8 +257,8 @@ reusable configuration value. By convention, parameters are defined under the use App\Entity\BlogPost; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->parameters() + return static function (ContainerConfigurator $container) { + $container->parameters() // the parameter name is an arbitrary string (the 'app.' prefix is recommended // to better differentiate your parameters from Symfony parameters). ->set('app.admin_email', 'something@example.com') @@ -329,8 +329,8 @@ configuration file using a special syntax: wrap the parameter name in two ``%`` // config/packages/some_package.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->extension('some_package', [ + return static function (ContainerConfigurator $container) { + $container->extension('some_package', [ // any string surrounded by two % is replaced by that parameter value 'email_address' => '%app.admin_email%', @@ -366,8 +366,8 @@ configuration file using a special syntax: wrap the parameter name in two ``%`` // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->parameters() + return static function (ContainerConfigurator $container) { + $container->parameters() ->set('url_pattern', 'http://symfony.com/?foo=%%s&bar=%%d'); }; @@ -502,7 +502,7 @@ files directly in the ``config/packages/`` directory. use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Config\WebpackEncoreConfig; - return static function (WebpackEncoreConfig $webpackEncore, ContainerConfigurator $containerConfigurator) { + return static function (WebpackEncoreConfig $webpackEncore, ContainerConfigurator $container) { $webpackEncore ->outputPath('%kernel.project_dir%/public/build') ->strictMode(true) @@ -510,12 +510,12 @@ files directly in the ``config/packages/`` directory. ; // cache is enabled only in the "prod" environment - if ('prod' === $containerConfigurator->env()) { + if ('prod' === $container->env()) { $webpackEncore->cache(true); } // disable strict mode only in the "test" environment - if ('test' === $containerConfigurator->env()) { + if ('test' === $container->env()) { $webpackEncore->strictMode(false); } }; @@ -633,7 +633,7 @@ This example shows how you could configure the application secret using an env v // config/packages/framework.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator) { + return static function (ContainerConfigurator $container) { $container->extension('framework', [ // by convention the env var names are always uppercase 'secret' => '%env(APP_SECRET)%', @@ -989,8 +989,8 @@ doesn't work for parameters: use App\Service\MessageGenerator; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->parameters() + return static function (ContainerConfigurator $container) { + $container->parameters() ->set('app.contents_dir', '...'); $container->services() @@ -1046,8 +1046,8 @@ whenever a service/controller defines a ``$projectDir`` argument, use this: use App\Controller\LuckyController; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return static function (ContainerConfigurator $container) { + $container->services() ->defaults() // pass this value to any $projectDir argument for any service // that's created in this file (including controller arguments) diff --git a/configuration/env_var_processors.rst b/configuration/env_var_processors.rst index 358f3989a69..cc6782baabb 100644 --- a/configuration/env_var_processors.rst +++ b/configuration/env_var_processors.rst @@ -104,8 +104,8 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $containerBuilder, FrameworkConfig $framework) { - $containerBuilder->setParameter('env(SECRET)', 'some_secret'); + return static function (ContainerBuilder $container, FrameworkConfig $framework) { + $container->setParameter('env(SECRET)', 'some_secret'); $framework->secret(env('SECRET')->string()); }; @@ -150,8 +150,8 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $containerBuilder, FrameworkConfig $framework) { - $containerBuilder->setParameter('env(HTTP_METHOD_OVERRIDE)', 'true'); + return static function (ContainerBuilder $container, FrameworkConfig $framework) { + $container->setParameter('env(HTTP_METHOD_OVERRIDE)', 'true'); $framework->httpMethodOverride(env('HTTP_METHOD_OVERRIDE')->bool()); }; @@ -242,8 +242,8 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\SecurityConfig; - return static function (ContainerBuilder $containerBuilder, SecurityConfig $security) { - $containerBuilder->setParameter('env(HEALTH_CHECK_METHOD)', 'Symfony\Component\HttpFoundation\Request::METHOD_HEAD'); + return static function (ContainerBuilder $container, SecurityConfig $security) { + $container->setParameter('env(HEALTH_CHECK_METHOD)', 'Symfony\Component\HttpFoundation\Request::METHOD_HEAD'); $security->accessControl() ->path('^/health-check$') ->methods([env('HEALTH_CHECK_METHOD')->const()]); @@ -293,8 +293,8 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $containerBuilder, FrameworkConfig $framework) { - $containerBuilder->setParameter('env(TRUSTED_HOSTS)', '["10.0.0.1", "10.0.0.2"]'); + return static function (ContainerBuilder $container, FrameworkConfig $framework) { + $container->setParameter('env(TRUSTED_HOSTS)', '["10.0.0.1", "10.0.0.2"]'); $framework->trustedHosts(env('TRUSTED_HOSTS')->json()); }; @@ -379,8 +379,8 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $containerBuilder, FrameworkConfig $framework) { - $containerBuilder->setParameter('env(TRUSTED_HOSTS)', '10.0.0.1,10.0.0.2'); + return static function (ContainerBuilder $container, FrameworkConfig $framework) { + $container->setParameter('env(TRUSTED_HOSTS)', '10.0.0.1,10.0.0.2'); $framework->trustedHosts(env('TRUSTED_HOSTS')->csv()); }; diff --git a/configuration/micro_kernel_trait.rst b/configuration/micro_kernel_trait.rst index ce4b0ac46c2..185d301a657 100644 --- a/configuration/micro_kernel_trait.rst +++ b/configuration/micro_kernel_trait.rst @@ -43,10 +43,10 @@ Next, create an ``index.php`` file that defines the kernel class and runs it:: ]; } - protected function configureContainer(ContainerConfigurator $containerConfigurator): void + protected function configureContainer(ContainerConfigurator $container): void { // PHP equivalent of config/packages/framework.yaml - $containerConfigurator->extension('framework', [ + $container->extension('framework', [ 'secret' => 'S0ME_SECRET' ]); } @@ -88,7 +88,7 @@ that define your bundles, your services and your routes: **registerBundles()** This is the same ``registerBundles()`` that you see in a normal kernel. -**configureContainer(ContainerConfigurator $containerConfigurator)** +**configureContainer(ContainerConfigurator $container)** This method builds and configures the container. In practice, you will use ``extension()`` to configure different bundles (this is the equivalent of what you see in a normal ``config/packages/*`` file). You can also register @@ -191,12 +191,12 @@ hold the kernel. Now it looks like this:: return $bundles; } - protected function configureContainer(ContainerConfigurator $containerConfigurator): void + protected function configureContainer(ContainerConfigurator $container): void { - $containerConfigurator->import(__DIR__.'/../config/framework.yaml'); + $container->import(__DIR__.'/../config/framework.yaml'); // register all classes in /src/ as service - $containerConfigurator->services() + $container->services() ->load('App\\', __DIR__.'/*') ->autowire() ->autoconfigure() @@ -204,7 +204,7 @@ hold the kernel. Now it looks like this:: // configure WebProfilerBundle only if the bundle is enabled if (isset($this->bundles['WebProfilerBundle'])) { - $containerConfigurator->extension('web_profiler', [ + $container->extension('web_profiler', [ 'toolbar' => true, 'intercept_redirects' => false, ]); diff --git a/configuration/multiple_kernels.rst b/configuration/multiple_kernels.rst index cc50c27a1d4..9464fcf39f7 100644 --- a/configuration/multiple_kernels.rst +++ b/configuration/multiple_kernels.rst @@ -164,12 +164,12 @@ resources:: return ($_SERVER['APP_LOG_DIR'] ?? $this->getProjectDir().'/var/log').'/'.$this->id; } - protected function configureContainer(ContainerConfigurator $containerConfigurator): void + protected function configureContainer(ContainerConfigurator $container): void { // load common config files, such as the framework.yaml, as well as // specific configs required exclusively for the app itself - $this->doConfigureContainer($containerConfigurator, $this->getSharedConfigDir()); - $this->doConfigureContainer($containerConfigurator, $this->getAppConfigDir()); + $this->doConfigureContainer($container, $this->getSharedConfigDir()); + $this->doConfigureContainer($container, $this->getAppConfigDir()); } protected function configureRoutes(RoutingConfigurator $routes): void @@ -180,16 +180,16 @@ resources:: $this->doConfigureRoutes($routes, $this->getAppConfigDir()); } - private function doConfigureContainer(ContainerConfigurator $containerConfigurator, string $configDir): void + private function doConfigureContainer(ContainerConfigurator $container, string $configDir): void { - $containerConfigurator->import($configDir.'/{packages}/*.{php,yaml}'); - $containerConfigurator->import($configDir.'/{packages}/'.$this->environment.'/*.{php,yaml}'); + $container->import($configDir.'/{packages}/*.{php,yaml}'); + $container->import($configDir.'/{packages}/'.$this->environment.'/*.{php,yaml}'); if (is_file($configDir.'/services.yaml')) { - $containerConfigurator->import($configDir.'/services.yaml'); - $containerConfigurator->import($configDir.'/{services}_'.$this->environment.'.yaml'); + $container->import($configDir.'/services.yaml'); + $container->import($configDir.'/{services}_'.$this->environment.'.yaml'); } else { - $containerConfigurator->import($configDir.'/{services}.php'); + $container->import($configDir.'/{services}.php'); } } diff --git a/configuration/using_parameters_in_dic.rst b/configuration/using_parameters_in_dic.rst index 9eb629b4b20..05008114e01 100644 --- a/configuration/using_parameters_in_dic.rst +++ b/configuration/using_parameters_in_dic.rst @@ -135,9 +135,9 @@ And set it in the constructor of ``Configuration`` via the ``Extension`` class:: { // ... - public function getConfiguration(array $config, ContainerBuilder $containerBuilder) + public function getConfiguration(array $config, ContainerBuilder $container) { - return new Configuration($containerBuilder->getParameter('kernel.debug')); + return new Configuration($container->getParameter('kernel.debug')); } } diff --git a/console/lazy_commands.rst b/console/lazy_commands.rst index 553490c845e..6d1f245eb75 100644 --- a/console/lazy_commands.rst +++ b/console/lazy_commands.rst @@ -68,13 +68,13 @@ with command names as keys and service identifiers as values:: use Symfony\Component\Console\CommandLoader\ContainerCommandLoader; use Symfony\Component\DependencyInjection\ContainerBuilder; - $containerBuilder = new ContainerBuilder(); - $containerBuilder->register(FooCommand::class, FooCommand::class); - $containerBuilder->compile(); + $container = new ContainerBuilder(); + $container->register(FooCommand::class, FooCommand::class); + $container->compile(); - $commandLoader = new ContainerCommandLoader($containerBuilder, [ + $commandLoader = new ContainerCommandLoader($container, [ 'app:foo' => FooCommand::class, ]); Like this, executing the ``app:foo`` command will load the ``FooCommand`` service -by calling ``$containerBuilder->get(FooCommand::class)``. +by calling ``$container->get(FooCommand::class)``. diff --git a/controller/argument_value_resolver.rst b/controller/argument_value_resolver.rst index fcbe012ef33..eb100c258f0 100644 --- a/controller/argument_value_resolver.rst +++ b/controller/argument_value_resolver.rst @@ -230,8 +230,8 @@ and adding a priority. use App\ArgumentResolver\UserValueResolver; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(UserValueResolver::class) ->tag('controller.argument_value_resolver', ['priority' => 50]) diff --git a/controller/upload_file.rst b/controller/upload_file.rst index 0e5beb84eb3..886c772d98a 100644 --- a/controller/upload_file.rst +++ b/controller/upload_file.rst @@ -319,8 +319,8 @@ Then, define a service for this class: use App\Service\FileUploader; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(FileUploader::class) ->arg('$targetDirectory', '%brochures_directory%') diff --git a/create_framework/dependency_injection.rst b/create_framework/dependency_injection.rst index cd20a947251..de3c4e11e4e 100644 --- a/create_framework/dependency_injection.rst +++ b/create_framework/dependency_injection.rst @@ -109,30 +109,30 @@ Create a new file to host the dependency injection container configuration:: use Symfony\Component\HttpKernel; use Symfony\Component\Routing; - $containerBuilder = new DependencyInjection\ContainerBuilder(); - $containerBuilder->register('context', Routing\RequestContext::class); - $containerBuilder->register('matcher', Routing\Matcher\UrlMatcher::class) + $container = new DependencyInjection\ContainerBuilder(); + $container->register('context', Routing\RequestContext::class); + $container->register('matcher', Routing\Matcher\UrlMatcher::class) ->setArguments([$routes, new Reference('context')]) ; - $containerBuilder->register('request_stack', HttpFoundation\RequestStack::class); - $containerBuilder->register('controller_resolver', HttpKernel\Controller\ControllerResolver::class); - $containerBuilder->register('argument_resolver', HttpKernel\Controller\ArgumentResolver::class); + $container->register('request_stack', HttpFoundation\RequestStack::class); + $container->register('controller_resolver', HttpKernel\Controller\ControllerResolver::class); + $container->register('argument_resolver', HttpKernel\Controller\ArgumentResolver::class); - $containerBuilder->register('listener.router', HttpKernel\EventListener\RouterListener::class) + $container->register('listener.router', HttpKernel\EventListener\RouterListener::class) ->setArguments([new Reference('matcher'), new Reference('request_stack')]) ; - $containerBuilder->register('listener.response', HttpKernel\EventListener\ResponseListener::class) + $container->register('listener.response', HttpKernel\EventListener\ResponseListener::class) ->setArguments(['UTF-8']) ; - $containerBuilder->register('listener.exception', HttpKernel\EventListener\ErrorListener::class) + $container->register('listener.exception', HttpKernel\EventListener\ErrorListener::class) ->setArguments(['Calendar\Controller\ErrorController::exception']) ; - $containerBuilder->register('dispatcher', EventDispatcher\EventDispatcher::class) + $container->register('dispatcher', EventDispatcher\EventDispatcher::class) ->addMethodCall('addSubscriber', [new Reference('listener.router')]) ->addMethodCall('addSubscriber', [new Reference('listener.response')]) ->addMethodCall('addSubscriber', [new Reference('listener.exception')]) ; - $containerBuilder->register('framework', Framework::class) + $container->register('framework', Framework::class) ->setArguments([ new Reference('dispatcher'), new Reference('controller_resolver'), @@ -141,7 +141,7 @@ Create a new file to host the dependency injection container configuration:: ]) ; - return $containerBuilder; + return $container; The goal of this file is to configure your objects and their dependencies. Nothing is instantiated during this configuration step. This is purely a diff --git a/doctrine/events.rst b/doctrine/events.rst index 729e266db3d..80506081fbe 100644 --- a/doctrine/events.rst +++ b/doctrine/events.rst @@ -224,8 +224,8 @@ with the ``doctrine.event_listener`` tag: use App\EventListener\SearchIndexer; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); // listeners are applied by default to all Doctrine connections $services->set(SearchIndexer::class) @@ -357,8 +357,8 @@ with the ``doctrine.orm.entity_listener`` tag: use App\Entity\User; use App\EventListener\UserChangedNotifier; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(UserChangedNotifier::class) ->tag('doctrine.orm.entity_listener', [ @@ -498,8 +498,8 @@ Doctrine connection to use) you must do that in the manual service configuration use App\EventListener\DatabaseActivitySubscriber; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(DatabaseActivitySubscriber::class) ->tag('doctrine.event_subscriber'[ diff --git a/event_dispatcher.rst b/event_dispatcher.rst index c04e309eb46..a1e26412a85 100644 --- a/event_dispatcher.rst +++ b/event_dispatcher.rst @@ -91,8 +91,8 @@ notify Symfony that it is an event listener by using a special "tag": use App\EventListener\ExceptionListener; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(ExceptionListener::class) ->tag('kernel.event_listener') @@ -383,9 +383,9 @@ compiler pass ``AddEventAliasesPass``:: class Kernel extends BaseKernel { - protected function build(ContainerBuilder $containerBuilder) + protected function build(ContainerBuilder $container) { - $containerBuilder->addCompilerPass(new AddEventAliasesPass([ + $container->addCompilerPass(new AddEventAliasesPass([ MyCustomEvent::class => 'my_custom_event', ])); } diff --git a/frontend/custom_version_strategy.rst b/frontend/custom_version_strategy.rst index cdd4c6664be..ae64738e2df 100644 --- a/frontend/custom_version_strategy.rst +++ b/frontend/custom_version_strategy.rst @@ -141,8 +141,8 @@ After creating the strategy PHP class, register it as a Symfony service. use App\Asset\VersionStrategy\GulpBusterVersionStrategy; use Symfony\Component\DependencyInjection\Definition; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(GulpBusterVersionStrategy::class) ->args( diff --git a/http_cache/cache_invalidation.rst b/http_cache/cache_invalidation.rst index 48d451d3154..76c13ab975b 100644 --- a/http_cache/cache_invalidation.rst +++ b/http_cache/cache_invalidation.rst @@ -123,8 +123,8 @@ Then, register the class as a service that :doc:`decorates services(); + return function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(CacheKernel::class) ->decorate('http_cache') diff --git a/mailer.rst b/mailer.rst index ee69bd3b123..cdb6a259ede 100644 --- a/mailer.rst +++ b/mailer.rst @@ -57,8 +57,8 @@ over SMTP by configuring the DSN in your ``.env`` file (the ``user``, use function Symfony\Component\DependencyInjection\Loader\Configurator\env; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; - return static function (ContainerConfigurator $containerConfigurator): void { - $containerConfigurator->extension('framework', [ + return static function (ContainerConfigurator $container): void { + $container->extension('framework', [ 'mailer' => [ 'dsn' => env('MAILER_DSN'), ], diff --git a/messenger/multiple_buses.rst b/messenger/multiple_buses.rst index 08f788ec109..e96840fcb0d 100644 --- a/messenger/multiple_buses.rst +++ b/messenger/multiple_buses.rst @@ -204,8 +204,8 @@ you can determine the message bus based on an implemented interface: use App\MessageHandler\CommandHandlerInterface; use App\MessageHandler\QueryHandlerInterface; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // ... diff --git a/profiler.rst b/profiler.rst index 8ae4d9dab36..ed89cfe7a08 100644 --- a/profiler.rst +++ b/profiler.rst @@ -512,8 +512,8 @@ you'll need to configure the data collector explicitly: use App\DataCollector\RequestCollector; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(RequestCollector::class) ->tag('data_collector', [ diff --git a/quick_tour/the_architecture.rst b/quick_tour/the_architecture.rst index 3bd459d2e3e..f42b4205316 100644 --- a/quick_tour/the_architecture.rst +++ b/quick_tour/the_architecture.rst @@ -286,12 +286,12 @@ using the special ``when@`` keyword: use Symfony\Config\FrameworkConfig; - return static function (FrameworkConfig $framework, ContainerConfigurator $containerConfigurator) { + return static function (FrameworkConfig $framework, ContainerConfigurator $container) { $framework->router() ->utf8(true) ; - if ('prod' === $containerConfigurator->env()) { + if ('prod' === $container->env()) { $framework->router() ->strictRequirements(null) ; diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index c35eb5a575e..fa2b1daabe0 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -3356,8 +3356,8 @@ the `SMTP session`_. This value overrides any other recipient set in the code. // config/packages/mailer.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return static function (ContainerConfigurator $containerConfigurator): void { - $containerConfigurator->extension('framework', [ + return static function (ContainerConfigurator $container): void { + $container->extension('framework', [ 'mailer' => [ 'dsn' => 'smtp://localhost:25', 'envelope' => [ diff --git a/reference/dic_tags.rst b/reference/dic_tags.rst index e707808e7e2..64cac27255e 100644 --- a/reference/dic_tags.rst +++ b/reference/dic_tags.rst @@ -122,8 +122,8 @@ services: use App\Lock\PostgresqlLock; use App\Lock\SqliteLock; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set('app.mysql_lock', MysqlLock::class); $services->set('app.postgresql_lock', PostgresqlLock::class); @@ -184,8 +184,8 @@ the generic ``app.lock`` service can be defined as follows: use App\Lock\PostgresqlLock; use App\Lock\SqliteLock; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set('app.mysql_lock', MysqlLock::class); $services->set('app.postgresql_lock', PostgresqlLock::class); diff --git a/routing/custom_route_loader.rst b/routing/custom_route_loader.rst index 7c050010ed5..78fd55f99aa 100644 --- a/routing/custom_route_loader.rst +++ b/routing/custom_route_loader.rst @@ -328,8 +328,8 @@ Now define a service for the ``ExtraLoader``: use App\Routing\ExtraLoader; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(ExtraLoader::class) ->tag('routing.loader') diff --git a/security.rst b/security.rst index a492e38fac7..9fe3801d01b 100644 --- a/security.rst +++ b/security.rst @@ -1572,7 +1572,7 @@ and set the ``limiter`` option to its service ID: use Symfony\Config\FrameworkConfig; use Symfony\Config\SecurityConfig; - return static function (ContainerBuilder $containerBuilder, FrameworkConfig $framework, SecurityConfig $security) { + return static function (ContainerBuilder $container, FrameworkConfig $framework, SecurityConfig $security) { $framework->rateLimiter() ->limiter('username_ip_login') ->policy('token_bucket') @@ -1588,7 +1588,7 @@ and set the ``limiter`` option to its service ID: ->interval('15 minutes') ; - $containerBuilder->register('app.login_rate_limiter', DefaultLoginRateLimiter::class) + $container->register('app.login_rate_limiter', DefaultLoginRateLimiter::class) ->setArguments([ // 1st argument is the limiter for IP new Reference('limiter.ip_login'), @@ -2589,8 +2589,8 @@ for these events. use App\EventListener\LogoutSubscriber; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(LogoutSubscriber::class) ->tag('kernel.event_subscriber', [ diff --git a/security/access_control.rst b/security/access_control.rst index 81aae70c602..b8a5f557286 100644 --- a/security/access_control.rst +++ b/security/access_control.rst @@ -91,8 +91,8 @@ Take the following ``access_control`` entries as an example: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\SecurityConfig; - return static function (ContainerBuilder $containerBuilder, SecurityConfig $security) { - $containerBuilder->setParameter('env(TRUSTED_IPS)', '10.0.0.1, 10.0.0.2'); + return static function (ContainerBuilder $container, SecurityConfig $security) { + $container->setParameter('env(TRUSTED_IPS)', '10.0.0.1, 10.0.0.2'); // ... $security->accessControl() diff --git a/service_container.rst b/service_container.rst index 47a421f1345..afd5ea44bd7 100644 --- a/service_container.rst +++ b/service_container.rst @@ -205,9 +205,9 @@ each time you ask for it. // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // default configuration for services in *this* file - $services = $containerConfigurator->services() + $services = $container->services() ->defaults() ->autowire() // Automatically injects dependencies in your services. ->autoconfigure() // Automatically registers your services as commands, event subscribers, etc. @@ -500,7 +500,7 @@ pass here. No problem! In your configuration, you can explicitly set this argume use App\Service\SiteUpdateManager; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... // same as before @@ -575,8 +575,8 @@ parameter and in PHP config use the ``service()`` function: use App\Service\MessageGenerator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(MessageGenerator::class) // In versions earlier to Symfony 5.1 the service() function was called ref() @@ -682,7 +682,7 @@ But, you can control this and pass in a different logger: use App\Service\MessageGenerator; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... same code as before // explicitly configure the service @@ -783,8 +783,8 @@ You can also use the ``bind`` keyword to bind specific arguments by name or type use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services() + return function(ContainerConfigurator $container) { + $services = $container->services() ->defaults() // pass this value to any $adminEmail argument for any service // that's defined in this file (including controller arguments) @@ -918,7 +918,7 @@ setting: use App\Service\PublicService; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... same as code before // explicitly configure the service @@ -975,7 +975,7 @@ key. For example, the default Symfony configuration contains this: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... // makes classes in src/ available to be used as services @@ -1157,7 +1157,7 @@ admin email. In this case, each needs to have a unique service id: use App\Service\MessageGenerator; use App\Service\SiteUpdateManager; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... // site_update_manager.superadmin is the service's id diff --git a/service_container/alias_private.rst b/service_container/alias_private.rst index 44a8492a53d..e4f7604a846 100644 --- a/service_container/alias_private.rst +++ b/service_container/alias_private.rst @@ -55,8 +55,8 @@ You can also control the ``public`` option on a service-by-service basis: use App\Service\Foo; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Foo::class) ->public(); @@ -127,8 +127,8 @@ services. use App\Mail\PhpMailer; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(PhpMailer::class) ->private(); @@ -275,8 +275,8 @@ The following example shows how to inject an anonymous service into another serv use App\AnonymousBar; use App\Foo; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Foo::class) // In versions earlier to Symfony 5.1 the inline_service() function was called inline() @@ -327,8 +327,8 @@ Using an anonymous service as a factory looks like this: use App\AnonymousBar; use App\Foo; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Foo::class) ->factory([inline_service(AnonymousBar::class), 'constructFoo']); @@ -373,8 +373,8 @@ or you decided not to maintain it anymore), you can deprecate its definition: use App\Service\OldService; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(OldService::class) ->deprecate( diff --git a/service_container/autowiring.rst b/service_container/autowiring.rst index 60baa01b261..cd53bbeef35 100644 --- a/service_container/autowiring.rst +++ b/service_container/autowiring.rst @@ -104,8 +104,8 @@ both services: .. code-block:: php // config/services.php - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services() + return function(ContainerConfigurator $container) { + $services = $container->services() ->defaults() ->autowire() ->autoconfigure() @@ -243,7 +243,7 @@ adding a service alias: use App\Util\Rot13Transformer; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... // the id is not a class, so it won't be used for autowiring @@ -350,7 +350,7 @@ To fix that, add an :ref:`alias `: use App\Util\Rot13Transformer; use App\Util\TransformerInterface; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... $services->set(Rot13Transformer::class); @@ -520,7 +520,7 @@ the injection:: use App\Util\TransformerInterface; use App\Util\UppercaseTransformer; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... $services->set(Rot13Transformer::class)->autowire(); diff --git a/service_container/calls.rst b/service_container/calls.rst index a76cedbca2c..a40ca68e29c 100644 --- a/service_container/calls.rst +++ b/service_container/calls.rst @@ -66,7 +66,7 @@ To configure the container to call the ``setLogger`` method, use the ``calls`` k use App\Service\MessageGenerator; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... $services->set(MessageGenerator::class) diff --git a/service_container/compiler_passes.rst b/service_container/compiler_passes.rst index 34eee2e67df..fda044a1195 100644 --- a/service_container/compiler_passes.rst +++ b/service_container/compiler_passes.rst @@ -22,9 +22,9 @@ Compiler passes are registered in the ``build()`` method of the application kern // ... - protected function build(ContainerBuilder $containerBuilder): void + protected function build(ContainerBuilder $container): void { - $containerBuilder->addCompilerPass(new CustomPass()); + $container->addCompilerPass(new CustomPass()); } } @@ -50,14 +50,14 @@ and process the services inside the ``process()`` method:: // ... - public function process(ContainerBuilder $containerBuilder): void + public function process(ContainerBuilder $container): void { // in this method you can manipulate the service container: // for example, changing some container service: - $containerBuilder->getDefinition('app.some_private_service')->setPublic(true); + $container->getDefinition('app.some_private_service')->setPublic(true); // or processing tagged services: - foreach ($containerBuilder->findTaggedServiceIds('some_tag') as $id => $tags) { + foreach ($container->findTaggedServiceIds('some_tag') as $id => $tags) { // ... } } @@ -79,11 +79,11 @@ method in the extension):: class MyBundle extends Bundle { - public function build(ContainerBuilder $containerBuilder): void + public function build(ContainerBuilder $container): void { - parent::build($containerBuilder); + parent::build($container); - $containerBuilder->addCompilerPass(new CustomPass()); + $container->addCompilerPass(new CustomPass()); } } diff --git a/service_container/configurators.rst b/service_container/configurators.rst index 055eb541ae8..1d289580815 100644 --- a/service_container/configurators.rst +++ b/service_container/configurators.rst @@ -169,8 +169,8 @@ all the classes are already loaded as services. All you need to do is specify th use App\Mail\GreetingCardManager; use App\Mail\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // Registers all 4 classes as services, including App\Mail\EmailConfigurator $services->load('App\\', '../src/*'); @@ -239,8 +239,8 @@ Services can be configured via invokable configurators (replacing the use App\Mail\GreetingCardManager; use App\Mail\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // Registers all 4 classes as services, including App\Mail\EmailConfigurator $services->load('App\\', '../src/*'); diff --git a/service_container/expression_language.rst b/service_container/expression_language.rst index 908ad68da5a..f1de823e47b 100644 --- a/service_container/expression_language.rst +++ b/service_container/expression_language.rst @@ -55,7 +55,7 @@ to another service: ``App\Mailer``. One way to do this is with an expression: use App\Mail\MailerConfiguration; use App\Mailer; - return function(ContainerConfigurator $containerConfigurator) { + return function(ContainerConfigurator $container) { // ... $services->set(MailerConfiguration::class); @@ -110,8 +110,8 @@ via a ``container`` variable. Here's another example: use App\Mailer; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Mailer::class) ->args([expr("container.hasParameter('some_param') ? parameter('some_param') : 'default_value'")]); diff --git a/service_container/factories.rst b/service_container/factories.rst index 7c5c87dc004..a188bb2a046 100644 --- a/service_container/factories.rst +++ b/service_container/factories.rst @@ -74,8 +74,8 @@ create its object: use App\Email\NewsletterManager; use App\Email\NewsletterManagerStaticFactory; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) // the first argument is the class and the second argument is the static method @@ -156,8 +156,8 @@ You can omit the class on the factory declaration: use App\Email\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // Note that we are not using service() $services->set(NewsletterManager::class) @@ -218,8 +218,8 @@ Configuration of the service container then looks like this: use App\Email\NewsletterManager; use App\Email\NewsletterManagerFactory; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // first, create a service for the factory $services->set(NewsletterManagerFactory::class); @@ -297,8 +297,8 @@ method name: use App\Email\NewsletterManager; use App\Email\NewsletterManagerFactory; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) ->factory(service(InvokableNewsletterManagerFactory::class)); @@ -357,8 +357,8 @@ previous examples takes the ``templating`` service as an argument: use App\Email\NewsletterManager; use App\Email\NewsletterManagerFactory; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) ->factory([service(NewsletterManagerFactory::class), 'createNewsletterManager']) diff --git a/service_container/import.rst b/service_container/import.rst index 2fed44e16a5..1e0fcfb2cee 100644 --- a/service_container/import.rst +++ b/service_container/import.rst @@ -116,12 +116,12 @@ a relative or absolute path to the imported file: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $containerConfigurator->import('services/mailer.php'); + return function(ContainerConfigurator $container) { + $container->import('services/mailer.php'); // If you want to import a whole directory: - $containerConfigurator->import('services/'); + $container->import('services/'); - $services = $containerConfigurator->services() + $services = $container->services() ->defaults() ->autowire() ->autoconfigure() diff --git a/service_container/injection_types.rst b/service_container/injection_types.rst index d88e5139824..595ac79b185 100644 --- a/service_container/injection_types.rst +++ b/service_container/injection_types.rst @@ -71,8 +71,8 @@ service container configuration: use App\Mail\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) // In versions earlier to Symfony 5.1 the service() function was called ref() @@ -274,8 +274,8 @@ that accepts the dependency:: use App\Mail\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) ->call('setMailer', [service('mailer')]); @@ -356,8 +356,8 @@ Another possibility is setting public fields of the class directly:: use App\Mail\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set('app.newsletter_manager', NewsletterManager::class) ->property('mailer', service('mailer')); diff --git a/service_container/lazy_services.rst b/service_container/lazy_services.rst index bdac2a0bc46..bf45e100ef8 100644 --- a/service_container/lazy_services.rst +++ b/service_container/lazy_services.rst @@ -76,8 +76,8 @@ You can mark the service as ``lazy`` by manipulating its definition: use App\Twig\AppExtension; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(AppExtension::class)->lazy(); }; @@ -170,8 +170,8 @@ specific interfaces. use App\Twig\AppExtension; use Twig\Extension\ExtensionInterface; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(AppExtension::class) ->lazy() diff --git a/service_container/optional_dependencies.rst b/service_container/optional_dependencies.rst index 8317cd363df..86aa0c2eb22 100644 --- a/service_container/optional_dependencies.rst +++ b/service_container/optional_dependencies.rst @@ -38,8 +38,8 @@ if the service does not exist: use App\Newsletter\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) // In versions earlier to Symfony 5.1 the service() function was called ref() @@ -95,8 +95,8 @@ call if the service exists and remove the method call if it does not: use App\Newsletter\NewsletterManager; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(NewsletterManager::class) ->call('setLogger', [service('logger')->ignoreOnInvalid()]) diff --git a/service_container/parent_services.rst b/service_container/parent_services.rst index 9cab17e2254..b3792dc5a6a 100644 --- a/service_container/parent_services.rst +++ b/service_container/parent_services.rst @@ -119,8 +119,8 @@ avoid duplicated service definitions: use App\Repository\DoctrinePostRepository; use App\Repository\DoctrineUserRepository; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(BaseDoctrineRepository::class) ->abstract() @@ -229,8 +229,8 @@ the child class: use App\Repository\DoctrineUserRepository; // ... - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(BaseDoctrineRepository::class) // ... diff --git a/service_container/service_closures.rst b/service_container/service_closures.rst index 03e142b3455..723aa26e8bf 100644 --- a/service_container/service_closures.rst +++ b/service_container/service_closures.rst @@ -77,8 +77,8 @@ argument of type ``service_closure``: use App\Service\MyService; - return function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(MyService::class) ->args([service_closure('mailer')]); @@ -104,7 +104,7 @@ a service closure by wrapping the service reference into an instance of use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; - public function process(ContainerBuilder $containerBuilder): void + public function process(ContainerBuilder $container): void { // ... diff --git a/service_container/service_decoration.rst b/service_container/service_decoration.rst index 1bf0bf86d1e..5d663fbc797 100644 --- a/service_container/service_decoration.rst +++ b/service_container/service_decoration.rst @@ -41,8 +41,8 @@ When overriding an existing definition, the original service is lost: use App\Mailer; use App\NewMailer; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Mailer::class); @@ -98,8 +98,8 @@ but keeps a reference of the old one as ``.inner``: use App\DecoratingMailer; use App\Mailer; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Mailer::class); @@ -161,8 +161,8 @@ automatically changed to ``'.inner'``): use App\DecoratingMailer; use App\Mailer; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Mailer::class); @@ -233,8 +233,8 @@ automatically changed to ``'.inner'``): use App\DecoratingMailer; use App\Mailer; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Mailer::class); @@ -295,8 +295,8 @@ the ``decoration_priority`` option. Its value is an integer that defaults to // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(\Foo::class); @@ -382,8 +382,8 @@ ordered services, each one decorating the next: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return function(ContainerConfigurator $container) { + $container->services() ->stack('decorated_foo_stack', [ inline_service(\Baz::class)->args([service('.inner')]), inline_service(\Bar::class)->args([service('.inner')]), @@ -465,8 +465,8 @@ advanced example of composition: use App\Decorated; use App\Decorator; - return function(ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return function(ContainerConfigurator $container) { + $container->services() ->set('some_decorator', Decorator::class) ->stack('embedded_stack', [ @@ -583,8 +583,8 @@ Three different behaviors are available: use Symfony\Component\DependencyInjection\ContainerInterface; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(Foo::class); diff --git a/service_container/service_subscribers_locators.rst b/service_container/service_subscribers_locators.rst index 86389a71144..1b152ac6d68 100644 --- a/service_container/service_subscribers_locators.rst +++ b/service_container/service_subscribers_locators.rst @@ -233,8 +233,8 @@ service type to a service. use App\CommandBus; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(CommandBus::class) ->tag('container.service_subscriber', ['key' => 'logger', 'id' => 'monolog.logger.event']); @@ -325,8 +325,8 @@ or directly via PHP attributes: use App\CommandBus; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(CommandBus::class) ->args([service_locator([ @@ -409,8 +409,8 @@ other services. To do so, create a new service definition using the use Symfony\Component\DependencyInjection\ServiceLocator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set('app.command_handler_locator', ServiceLocator::class) // In versions earlier to Symfony 5.1 the service() function was called ref() @@ -471,8 +471,8 @@ Now you can inject the service locator in any other services: use App\CommandBus; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(CommandBus::class) ->args([service('app.command_handler_locator')]); @@ -490,7 +490,7 @@ will share identical locators among all the services referencing them:: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; - public function process(ContainerBuilder $containerBuilder): void + public function process(ContainerBuilder $container): void { // ... @@ -499,9 +499,9 @@ will share identical locators among all the services referencing them:: 'logger' => new Reference('logger'), ]; - $myService = $containerBuilder->findDefinition(MyService::class); + $myService = $container->findDefinition(MyService::class); - $myService->addArgument(ServiceLocatorTagPass::register($containerBuilder, $locateableServices)); + $myService->addArgument(ServiceLocatorTagPass::register($container, $locateableServices)); } Indexing the Collection of Services @@ -579,8 +579,8 @@ of the ``key`` tag attribute (as defined in the ``index_by`` locator option): // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(App\Handler\One::class) ->tag('app.handler', ['key' => 'handler_one']) @@ -686,8 +686,8 @@ attribute to the locator service defining the name of this custom method: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return function(ContainerConfigurator $container) { + $container->services() ->set(App\HandlerCollection::class) ->args([tagged_locator('app.handler', 'key', 'myOwnMethodName')]) ; diff --git a/service_container/shared.rst b/service_container/shared.rst index 003ad2914b7..435822fb25c 100644 --- a/service_container/shared.rst +++ b/service_container/shared.rst @@ -33,8 +33,8 @@ in your service definition: use App\SomeNonSharedService; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(SomeNonSharedService::class) ->share(false); diff --git a/service_container/synthetic_services.rst b/service_container/synthetic_services.rst index 4dfec92709f..fc26c6848d3 100644 --- a/service_container/synthetic_services.rst +++ b/service_container/synthetic_services.rst @@ -63,8 +63,8 @@ configuration: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // synthetic services don't specify a class $services->set('app.synthetic_service') diff --git a/service_container/tags.rst b/service_container/tags.rst index 8777639cd60..bcb30e7da3e 100644 --- a/service_container/tags.rst +++ b/service_container/tags.rst @@ -37,8 +37,8 @@ example: use App\Twig\AppExtension; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(AppExtension::class) ->tag('twig.extension'); @@ -103,8 +103,8 @@ If you want to apply tags automatically for your own services, use the use App\Security\CustomInterface; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); // this config only applies to the services created by this file $services @@ -147,9 +147,9 @@ In a Symfony application, call this method in your kernel class:: { // ... - protected function build(ContainerBuilder $containerBuilder): void + protected function build(ContainerBuilder $container): void { - $containerBuilder->registerForAutoconfiguration(CustomInterface::class) + $container->registerForAutoconfiguration(CustomInterface::class) ->addTag('app.custom_tag') ; } @@ -163,9 +163,9 @@ In a Symfony bundle, call this method in the ``load()`` method of the { // ... - public function load(array $configs, ContainerBuilder $containerBuilder): void + public function load(array $configs, ContainerBuilder $container): void { - $containerBuilder->registerForAutoconfiguration(CustomInterface::class) + $container->registerForAutoconfiguration(CustomInterface::class) ->addTag('app.custom_tag') ; } @@ -202,11 +202,11 @@ method:: { // ... - protected function build(ContainerBuilder $containerBuilder): void + protected function build(ContainerBuilder $container): void { // ... - $containerBuilder->registerAttributeForAutoconfiguration(SensitiveElement::class, static function (ChildDefinition $definition, SensitiveElement $attribute, \ReflectionClass $reflector): void { + $container->registerAttributeForAutoconfiguration(SensitiveElement::class, static function (ChildDefinition $definition, SensitiveElement $attribute, \ReflectionClass $reflector): void { // Apply the 'app.sensitive_element' tag to all classes with SensitiveElement // attribute, and attach the token value to the tag $definition->addTag('app.sensitive_element', ['token' => $attribute->getToken()]); @@ -284,8 +284,8 @@ Then, define the chain as a service: use App\Mail\TransportChain; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(TransportChain::class); }; @@ -338,8 +338,8 @@ For example, you may add the following transports as services: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(\MailerSmtpTransport::class) // the param() method was introduced in Symfony 5.2. @@ -374,17 +374,17 @@ container for any services with the ``app.mail_transport`` tag:: class MailTransportPass implements CompilerPassInterface { - public function process(ContainerBuilder $containerBuilder): void + public function process(ContainerBuilder $container): void { // always first check if the primary service is defined - if (!$containerBuilder->has(TransportChain::class)) { + if (!$container->has(TransportChain::class)) { return; } - $definition = $containerBuilder->findDefinition(TransportChain::class); + $definition = $container->findDefinition(TransportChain::class); // find all service IDs with the app.mail_transport tag - $taggedServices = $containerBuilder->findTaggedServiceIds('app.mail_transport'); + $taggedServices = $container->findTaggedServiceIds('app.mail_transport'); foreach ($taggedServices as $id => $tags) { // add the transport service to the TransportChain service @@ -411,9 +411,9 @@ or from your kernel:: { // ... - protected function build(ContainerBuilder $containerBuilder): void + protected function build(ContainerBuilder $container): void { - $containerBuilder->addCompilerPass(new MailTransportPass()); + $container->addCompilerPass(new MailTransportPass()); } } @@ -501,8 +501,8 @@ To answer this, change the service declaration: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(\MailerSmtpTransport::class) // the param() method was introduced in Symfony 5.2. @@ -545,7 +545,7 @@ use this, update the compiler:: class TransportCompilerPass implements CompilerPassInterface { - public function process(ContainerBuilder $containerBuilder): void + public function process(ContainerBuilder $container): void { // ... @@ -655,8 +655,8 @@ directly via PHP attributes: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(App\Handler\One::class) ->tag('app.handler') @@ -720,8 +720,8 @@ the number, the earlier the tagged service will be located in the collection: use App\Handler\One; - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function(ContainerConfigurator $container) { + $services = $container->services(); $services->set(One::class) ->tag('app.handler', ['priority' => 20]) @@ -796,8 +796,8 @@ you can define it in the configuration of the collecting service: use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; - return function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function (ContainerConfigurator $container) { + $services = $container->services(); // ... @@ -884,8 +884,8 @@ indexed by the ``key`` attribute: use App\Handler\Two; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; - return function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(One::class) ->tag('app.handler', ['key' => 'handler_one']); @@ -998,8 +998,8 @@ array element. For example, to retrieve the ``handler_two`` handler:: use App\HandlerCollection; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; - return function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return function (ContainerConfigurator $container) { + $services = $container->services(); // ... diff --git a/session.rst b/session.rst index 1124eea36a8..621749eadb0 100644 --- a/session.rst +++ b/session.rst @@ -723,8 +723,8 @@ To use it, first register a new handler service with your database credentials: use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler; - return static function (ContainerConfigurator $containerConfiguratorConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(PdoSessionHandler::class) ->args([ @@ -838,8 +838,8 @@ passed to the ``PdoSessionHandler`` service: use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler; - return static function (ContainerConfigurator $containerConfiguratorConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(PdoSessionHandler::class) ->args([ @@ -1011,8 +1011,8 @@ the MongoDB connection as argument: use Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler; - return static function (ContainerConfigurator $containerConfiguratorConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(MongoDbSessionHandler::class) ->args([ @@ -1130,8 +1130,8 @@ configure these values with the second argument passed to the use Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler; - return static function (ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); + return static function (ContainerConfigurator $container) { + $services = $container->services(); $services->set(MongoDbSessionHandler::class) ->args([ diff --git a/testing.rst b/testing.rst index ed0ab1a8e2c..24326be908a 100644 --- a/testing.rst +++ b/testing.rst @@ -357,8 +357,8 @@ the ``test`` environment as follows: use App\Contracts\Repository\NewsRepositoryInterface; use App\Repository\NewsRepository; - return static function (ContainerConfigurator $containerConfigurator) { - $containerConfigurator->services() + return static function (ContainerConfigurator $container) { + $container->services() // redefine the alias as it should be while making it public ->alias(NewsRepositoryInterface::class, NewsRepository::class) ->public() From 2426ce44af403fde87d4989d2824c0f8d8e11bdf Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Sat, 11 Mar 2023 14:25:14 +0100 Subject: [PATCH 032/670] Be consistent in code examples --- service_container/service_closures.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/service_container/service_closures.rst b/service_container/service_closures.rst index d490bcb3769..1a6b6542680 100644 --- a/service_container/service_closures.rst +++ b/service_container/service_closures.rst @@ -58,6 +58,9 @@ argument of type ``service_closure``: App\Service\MyService: arguments: [!service_closure '@mailer'] + # In case the dependency is optional + # arguments: [!service_closure '@?mailer'] + .. code-block:: xml @@ -69,6 +72,11 @@ argument of type ``service_closure``: + + From f7e1af2b238c60ce47e4f746359c0f7bcbbd7ad2 Mon Sep 17 00:00:00 2001 From: Antoine Makdessi Date: Fri, 12 May 2023 09:42:28 +0200 Subject: [PATCH 033/670] Add some typehint --- controller/service.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/controller/service.rst b/controller/service.rst index 1510f7b8278..50ee34a1aac 100644 --- a/controller/service.rst +++ b/controller/service.rst @@ -31,6 +31,7 @@ apply the ``controller.service_arguments`` tag to your controller services:: // src/Controller/HelloController.php namespace App\Controller; + use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\Routing\Annotation\Route; @@ -38,7 +39,7 @@ apply the ``controller.service_arguments`` tag to your controller services:: class HelloController { #[Route('/hello', name: 'hello', methods: ['GET'])] - public function index() + public function index(): Response { // ... } @@ -71,7 +72,7 @@ a service like: ``App\Controller\HelloController::index``: /** * @Route("/hello", name="hello", methods={"GET"}) */ - public function index() + public function index(): Response { // ... } @@ -82,12 +83,13 @@ a service like: ``App\Controller\HelloController::index``: // src/Controller/HelloController.php namespace App\Controller; + use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class HelloController { #[Route('/hello', name: 'hello', methods: ['GET'])] - public function index() + public function index(): Response { // ... } @@ -151,7 +153,7 @@ which is a common practice when following the `ADR pattern`_ */ class Hello { - public function __invoke($name = 'World') + public function __invoke(string $name = 'World'): Response { return new Response(sprintf('Hello %s!', $name)); } @@ -168,7 +170,7 @@ which is a common practice when following the `ADR pattern`_ #[Route('/hello/{name}', name: 'hello')] class Hello { - public function __invoke($name = 'World') + public function __invoke(string $name = 'World'): Response { return new Response(sprintf('Hello %s!', $name)); } @@ -228,14 +230,14 @@ service and use it directly:: class HelloController { - private $twig; + private Environment $twig; public function __construct(Environment $twig) { $this->twig = $twig; } - public function index($name) + public function index(string $name): Response { $content = $this->twig->render( 'hello/index.html.twig', From 02d5477d1f4ee3557069a20a1c638c5e59acabb7 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Fri, 19 May 2023 10:17:23 +0200 Subject: [PATCH 034/670] Use DOCtor-RST 1.46.1 --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 79f2c12e4fb..744cc957c6c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.45.0 + uses: docker://oskarstark/doctor-rst:1.46.1 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache From e32ee28127f277f4ccb208046541004f08328b3c Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Fri, 19 May 2023 10:22:52 +0200 Subject: [PATCH 035/670] Enable new DOCtor rule `no_duplicate_use_statements` --- .doctor-rst.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.doctor-rst.yaml b/.doctor-rst.yaml index 318d55b688a..a1623233d96 100644 --- a/.doctor-rst.yaml +++ b/.doctor-rst.yaml @@ -34,6 +34,7 @@ rules: no_brackets_in_method_directive: ~ no_composer_req: ~ no_directive_after_shorthand: ~ + no_duplicate_use_statements: ~ no_explicit_use_of_code_block_php: ~ no_inheritdoc: ~ no_merge_conflict: ~ From e419c65fb40eebceef743bfc14e6c6b8ba6ab254 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Fri, 19 May 2023 21:56:44 +0200 Subject: [PATCH 036/670] Use `ubuntu-latest` --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 744cc957c6c..492d38ff045 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -79,7 +79,7 @@ jobs: symfony-code-block-checker: name: Code Blocks - runs-on: Ubuntu-20.04 + runs-on: ubuntu-latest continue-on-error: true steps: - name: Checkout code From e73b674985714d18b328c6bd1a6f6d1ed3732424 Mon Sep 17 00:00:00 2001 From: uncaught Date: Mon, 22 May 2023 08:36:34 +0200 Subject: [PATCH 037/670] Fix non-working examples of `json` and `csv` env var processors (closes https://github.com/symfony/symfony/issues/50341). --- configuration/env_var_processors.rst | 32 ++++++++++++---------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/configuration/env_var_processors.rst b/configuration/env_var_processors.rst index cc6782baabb..0a76793cc2c 100644 --- a/configuration/env_var_processors.rst +++ b/configuration/env_var_processors.rst @@ -262,9 +262,8 @@ Symfony provides the following env var processors: # config/packages/framework.yaml parameters: - env(TRUSTED_HOSTS): '["10.0.0.1", "10.0.0.2"]' - framework: - trusted_hosts: '%env(json:TRUSTED_HOSTS)%' + env(ALLOWED_LANGUAGES): '["en","de","es"]' + app_allowed_languages: '%env(json:ALLOWED_LANGUAGES)%' .. code-block:: xml @@ -279,10 +278,9 @@ Symfony provides the following env var processors: https://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> - ["10.0.0.1", "10.0.0.2"] + ["en","de","es"] + %env(json:ALLOWED_LANGUAGES)% - - .. code-block:: php @@ -293,9 +291,9 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $container, FrameworkConfig $framework) { - $container->setParameter('env(TRUSTED_HOSTS)', '["10.0.0.1", "10.0.0.2"]'); - $framework->trustedHosts(env('TRUSTED_HOSTS')->json()); + return static function (ContainerBuilder $container) { + $container->setParameter('env(ALLOWED_LANGUAGES)', '["en","de","es"]'); + $container->setParameter('app_allowed_languages', '%env(json:ALLOWED_LANGUAGES)%'); }; ``env(resolve:FOO)`` @@ -348,9 +346,8 @@ Symfony provides the following env var processors: # config/packages/framework.yaml parameters: - env(TRUSTED_HOSTS): "10.0.0.1,10.0.0.2" - framework: - trusted_hosts: '%env(csv:TRUSTED_HOSTS)%' + env(ALLOWED_LANGUAGES): "en,de,es" + app_allowed_languages: '%env(csv:ALLOWED_LANGUAGES)%' .. code-block:: xml @@ -365,10 +362,9 @@ Symfony provides the following env var processors: https://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> - 10.0.0.1,10.0.0.2 + en,de,es + %env(csv:ALLOWED_LANGUAGES)% - - .. code-block:: php @@ -379,9 +375,9 @@ Symfony provides the following env var processors: use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Config\FrameworkConfig; - return static function (ContainerBuilder $container, FrameworkConfig $framework) { - $container->setParameter('env(TRUSTED_HOSTS)', '10.0.0.1,10.0.0.2'); - $framework->trustedHosts(env('TRUSTED_HOSTS')->csv()); + return static function (ContainerBuilder $container) { + $container->setParameter('env(ALLOWED_LANGUAGES)', 'en,de,es'); + $container->setParameter('app_allowed_languages', '%env(csv:ALLOWED_LANGUAGES)%'); }; ``env(file:FOO)`` From 84b52284bc5f3509f7daf3534a2f9e2337db5104 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Fri, 19 May 2023 10:05:14 +0200 Subject: [PATCH 038/670] Use DOCtor-RST 1.47.1 --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 744cc957c6c..0f17933d8ae 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.46.1 + uses: docker://oskarstark/doctor-rst:1.47.1 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache From 64cb70171f51b82d747bd396ce1cb5ad498d2a15 Mon Sep 17 00:00:00 2001 From: Bruno Casali Date: Fri, 12 May 2023 12:46:42 -0300 Subject: [PATCH 039/670] [Serializer] Fix data type according to the field name on serializer.rst --- serializer.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serializer.rst b/serializer.rst index b7b62efa843..7bf972e908e 100644 --- a/serializer.rst +++ b/serializer.rst @@ -312,7 +312,7 @@ to your class:: private $name; /** - * @ORM\Column(type="integer") + * @ORM\Column(type="text") * @Groups({"show_product"}) */ private $description; From 6f74096cdc0105dba561bac1637159791b747d36 Mon Sep 17 00:00:00 2001 From: Antoine M Date: Wed, 17 May 2023 20:22:49 +0200 Subject: [PATCH 040/670] [FormCollection] mention Symfony UX live collection --- form/form_collections.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/form/form_collections.rst b/form/form_collections.rst index 540f8d50377..601d49f689d 100644 --- a/form/form_collections.rst +++ b/form/form_collections.rst @@ -213,6 +213,11 @@ Previously you added two tags to your task in the controller. Now let the users add as many tag forms as they need directly in the browser. This requires a bit of JavaScript code. +.. tip:: + + You can leverage Symfony UX via https://ux.symfony.com/live-component/demos/form-collection-type + if you do not want to handle the JavaScript code yourself. + But first, you need to let the form collection know that instead of exactly two, it will receive an *unknown* number of tags. Otherwise, you'll see a *"This form should not contain extra fields"* error. This is done with the From 7f6a8e2cfdb72b607d0f2c48af0a8c98868f275b Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 22 May 2023 10:59:14 +0200 Subject: [PATCH 041/670] Tweaks --- form/form_collections.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/form/form_collections.rst b/form/form_collections.rst index 601d49f689d..a2726ed1ed6 100644 --- a/form/form_collections.rst +++ b/form/form_collections.rst @@ -215,8 +215,9 @@ of JavaScript code. .. tip:: - You can leverage Symfony UX via https://ux.symfony.com/live-component/demos/form-collection-type - if you do not want to handle the JavaScript code yourself. + Instead of writing the needed JavaScript code yourself, you can use Symfony + UX to implement this feature with only PHP and Twig code. See the + `Symfony UX Demo of Form Collections`_. But first, you need to let the form collection know that instead of exactly two, it will receive an *unknown* number of tags. Otherwise, you'll see a @@ -662,3 +663,4 @@ the relationship between the removed ``Tag`` and ``Task`` object. .. _`@a2lix/symfony-collection`: https://github.com/a2lix/symfony-collection .. _`symfony-collection`: https://github.com/ninsuo/symfony-collection .. _`ArrayCollection`: https://www.doctrine-project.org/projects/doctrine-collections/en/1.6/index.html +.. _`Symfony UX Demo of Form Collections`: https://ux.symfony.com/live-component/demos/form-collection-type From fee66c0fb88044a3b433720190f4926ea3f42572 Mon Sep 17 00:00:00 2001 From: Jacob Dreesen Date: Wed, 24 May 2023 10:01:51 +0200 Subject: [PATCH 042/670] Fix code block --- lock.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lock.rst b/lock.rst index 3e93173aedc..8d5dc62617f 100644 --- a/lock.rst +++ b/lock.rst @@ -281,7 +281,7 @@ case version of its name suffixed by ``LockFactory``. For instance, the ``invoice`` lock can be injected by naming the argument ``$invoiceLockFactory`` and type-hinting it with -:class:`Symfony\\Component\\Lock\\LockFactory`: +:class:`Symfony\\Component\\Lock\\LockFactory`:: // src/Controller/PdfController.php namespace App\Controller; From 0cc61f75d762244e14c4267fa4e3d8b111c207dd Mon Sep 17 00:00:00 2001 From: Terence Eden Date: Sun, 21 May 2023 21:03:46 +0100 Subject: [PATCH 043/670] Update error_pages.rst I couldn't find any explicit documentation about `{{ exception.message }}` This adds it in and provides a link to to class so that readers can find the other methods available. --- controller/error_pages.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/controller/error_pages.rst b/controller/error_pages.rst index 7ccb05cdf65..5cad96b742c 100644 --- a/controller/error_pages.rst +++ b/controller/error_pages.rst @@ -114,10 +114,14 @@ store the HTTP status code and message respectively. and its required ``getStatusCode()`` method. Otherwise, the ``status_code`` will default to ``500``. -Additionally you have access to the Exception with ``exception``, which for example -allows you to output the stack trace using ``{{ exception.traceAsString }}`` or -access any other method on the object. You should be careful with this though, -as this is very likely to expose sensitive data. +Additionally you have access to the Exception with ``exception``. +This allows you to access any method of :class:`Symfony\\Component\\HttpKernel\\Exception\\HttpException`. +For example, if an exception message has been set, using +``throw $this->createNotFoundException('The product does not exist');``, +this can be accessed with ``{{ exception.message }}``. +You can output the stack trace using ``{{ exception.traceAsString }}`` +You should be careful with this though, as it is very likely to expose +sensitive data. .. tip:: From 93a056bb231c8f033f2b0c8117c3b518b3909f9d Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 24 May 2023 15:31:49 +0200 Subject: [PATCH 044/670] Tweaks --- controller/error_pages.rst | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/controller/error_pages.rst b/controller/error_pages.rst index 5cad96b742c..56f8e60a408 100644 --- a/controller/error_pages.rst +++ b/controller/error_pages.rst @@ -114,14 +114,12 @@ store the HTTP status code and message respectively. and its required ``getStatusCode()`` method. Otherwise, the ``status_code`` will default to ``500``. -Additionally you have access to the Exception with ``exception``. -This allows you to access any method of :class:`Symfony\\Component\\HttpKernel\\Exception\\HttpException`. -For example, if an exception message has been set, using -``throw $this->createNotFoundException('The product does not exist');``, -this can be accessed with ``{{ exception.message }}``. -You can output the stack trace using ``{{ exception.traceAsString }}`` -You should be careful with this though, as it is very likely to expose -sensitive data. +Additionally you have access to the :class:`Symfony\\Component\\HttpKernel\\Exception\\HttpException` +object via the ``exception`` Twig variable. For example, if the exception sets a +message (e.g. using ``throw $this->createNotFoundException('The product does not exist')``), +use ``{{ exception.message }}`` to print that message. You can also output the +stack trace using ``{{ exception.traceAsString }}``, but don't do that for end +users because the trace contains sensitive data. .. tip:: From 815b159ce016a5dff7d1c3e51f86256cf04f573d Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Fri, 26 May 2023 13:46:57 -0400 Subject: [PATCH 045/670] Updating UX docs to install the new StimulusBundle --- frontend/encore/simple-example.rst | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/frontend/encore/simple-example.rst b/frontend/encore/simple-example.rst index d41da8daf84..2e5043c5f83 100644 --- a/frontend/encore/simple-example.rst +++ b/frontend/encore/simple-example.rst @@ -5,10 +5,7 @@ After :doc:`installing Encore `, your app already has a few files, organized into an ``assets/`` directory: * ``assets/app.js`` -* ``assets/bootstrap.js`` -* ``assets/controllers.json`` * ``assets/styles/app.css`` -* ``assets/controllers/hello_controller.js`` With Encore, think of your ``app.js`` file like a standalone JavaScript application: it will *require* all of the dependencies it needs (e.g. jQuery or React), @@ -27,9 +24,6 @@ statements and create one final ``app.js`` (and ``app.css``) that contains *ever your app needs. Encore can do a lot more: minify files, pre-process Sass/LESS, support React, Vue.js, etc. -The other files - ``bootstrap.js``, ``controllers.json`` and ``hello_controller.js`` -relate to a topic you'll learn about soon: `Stimulus & Symfony UX`_. - Configuring Encore/Webpack -------------------------- @@ -222,10 +216,18 @@ easy to attach behavior to HTML. It's powerful, and you will love it! Symfony even provides packages to add more features to Stimulus. These are called the Symfony UX Packages. -If you followed the setup instructions, you should already have Stimulus installed -and ready to go! In fact, that's the purpose of the ``assets/bootstrap.js`` file: -to initialize Stimulus and automatically load any "controllers" from the -``assets/controllers/`` directory. +To use Stimulus, first install StimulusBundle: + +.. code-block:: terminal + + $ composer require symfony/stimulus-bundle + +The Flex recipe should add several files/directories: + +* ``assets/bootstrap.js`` - initializes Stimulus; +* ``assets/controllers/`` - a directory where you'll put your Stimulus controllers; +* ``assets/controllers.json`` - file that helps load Stimulus controllers form UX + packages that you'll install. Let's look at a simple Stimulus example. In a Twig template, suppose you have: From 07c7ba942aa0f10b23baf88b9fa5c4a9e892682f Mon Sep 17 00:00:00 2001 From: jmsche Date: Fri, 26 May 2023 21:11:58 +0200 Subject: [PATCH 046/670] Update docs about creating a UX bundle after stimulus bundle release --- frontend/create_ux_bundle.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/create_ux_bundle.rst b/frontend/create_ux_bundle.rst index 8bc04725bcd..095b9c6d84b 100644 --- a/frontend/create_ux_bundle.rst +++ b/frontend/create_ux_bundle.rst @@ -108,7 +108,7 @@ To use your controller in a template (e.g. one defined in your bundle) you can u ... -Don't forget to add ``symfony/webpack-encore-bundle:^1.12`` as a composer dependency to use +Don't forget to add ``symfony/stimulus-bundle:^2.9`` as a composer dependency to use Twig ``stimulus_*`` functions. .. tip:: From 20a7e795009d942db4031ad2d8a42f972a913091 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 30 May 2023 12:01:25 +0200 Subject: [PATCH 047/670] [Security] Use POST method for logout route --- security.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/security.rst b/security.rst index 9fe3801d01b..ad62fed4ba8 100644 --- a/security.rst +++ b/security.rst @@ -1686,7 +1686,7 @@ Next, you need to create a route for this URL (but not a controller): class SecurityController extends AbstractController { /** - * @Route("/logout", name="app_logout", methods={"GET"}) + * @Route("/logout", name="app_logout", methods={"POST"}) */ public function logout(): void { @@ -1705,7 +1705,7 @@ Next, you need to create a route for this URL (but not a controller): class SecurityController extends AbstractController { - #[Route('/logout', name: 'app_logout', methods: ['GET'])] + #[Route('/logout', name: 'app_logout', methods: ['POST'])] public function logout() { // controller can be blank: it will never be called! @@ -1718,7 +1718,7 @@ Next, you need to create a route for this URL (but not a controller): # config/routes.yaml app_logout: path: /logout - methods: GET + methods: POST .. code-block:: xml @@ -1729,7 +1729,7 @@ Next, you need to create a route for this URL (but not a controller): xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd"> - + .. code-block:: php @@ -1739,7 +1739,7 @@ Next, you need to create a route for this URL (but not a controller): return function (RoutingConfigurator $routes) { $routes->add('app_logout', '/logout') - ->methods(['GET']) + ->methods(['POST']) ; }; From c714cadea9e46c601b24cd95d25251b37dacaef8 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 30 May 2023 13:43:48 +0200 Subject: [PATCH 048/670] Minor tweaks --- setup/flex_private_recipes.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/setup/flex_private_recipes.rst b/setup/flex_private_recipes.rst index 14300e70258..abecdfd5039 100644 --- a/setup/flex_private_recipes.rst +++ b/setup/flex_private_recipes.rst @@ -32,9 +32,9 @@ the **repository name**, select the **Private** radio button, and click the Gitlab ~~~~~~ -Log in to your Gitlab.com account, click the **New project** button, select **Create blank project**, fill in -the **Project name**, select the **Private** radio button, and click the -**Create project** button. +Log in to your Gitlab.com account, click the **New project** button, select +**Create blank project**, fill in the **Project name**, select the **Private** +radio button, and click the **Create project** button. Create Your Private Recipes --------------------------- @@ -184,7 +184,8 @@ The ``index.json`` file has the following format: } Create an entry in ``"recipes"`` for each of your bundle recipes. Replace -``your-gitlab-account-name``, ``your-gitlab-repository`` and ``your-gitlab-project-id`` with your own details. +``your-gitlab-account-name``, ``your-gitlab-repository`` and ``your-gitlab-project-id`` +with your own details. Store Your Recipes in the Private Repository -------------------------------------------- From ace3eb9398f0b5e17e1de4c519d1fcca9462382f Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 1 Jun 2023 11:59:42 +0200 Subject: [PATCH 049/670] Fix an RST syntax issue of some missing headline --- reference/twig_reference.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/twig_reference.rst b/reference/twig_reference.rst index 0ee70b0929d..5d13a79abaf 100644 --- a/reference/twig_reference.rst +++ b/reference/twig_reference.rst @@ -330,7 +330,7 @@ absolute URLs instead of relative URLs. .. _reference-twig-function-t: t -~ +~~~ .. code-block:: twig From 425f34af54bd45d11bd85a6a815f5faf59e5f333 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 1 Jun 2023 18:01:01 +0200 Subject: [PATCH 050/670] Use DOCtor-RST 1.47.2 --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d91a7046960..af90b9308a3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.47.1 + uses: docker://oskarstark/doctor-rst:1.47.2 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache From 1c6c06d743a59bcd144ebf052003f53133f66297 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Fri, 2 Jun 2023 11:01:50 +0200 Subject: [PATCH 051/670] [Cache] Fix redis adapter option type --- components/cache/adapters/redis_adapter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/cache/adapters/redis_adapter.rst b/components/cache/adapters/redis_adapter.rst index 821fbb14050..a7530e6d3f0 100644 --- a/components/cache/adapters/redis_adapter.rst +++ b/components/cache/adapters/redis_adapter.rst @@ -210,7 +210,7 @@ Available Options ``error``, ``distribute`` or ``slaves``. For ``\Predis\ClientInterface`` valid options are ``slaves`` or ``distribute``. -``ssl`` (type: ``bool``, default: ``null``) +``ssl`` (type: ``array``, default: ``null``) SSL context options. See `php.net/context.ssl`_ for more information. .. note:: From ba4d99e7675bb4d8c19b2c49ac656b2cdab54a69 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Fri, 2 Jun 2023 16:42:59 +0200 Subject: [PATCH 052/670] Update flex_private_recipes.rst Fix bad anchor flex_private_recipes --- setup/flex_private_recipes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/flex_private_recipes.rst b/setup/flex_private_recipes.rst index abecdfd5039..d4d3156466d 100644 --- a/setup/flex_private_recipes.rst +++ b/setup/flex_private_recipes.rst @@ -16,7 +16,7 @@ perform their own installation tasks. To do this, you need to complete several s * Configure your project's ``composer.json`` file; and * Install the recipes in your project. -.. _create-a-private-github-repository +.. _create-a-private-github-repository: Create a Private Repository --------------------------- From 1b24769ab39af5298a0305834dfbac04b6ba5f0c Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Mon, 5 Jun 2023 15:02:19 +0200 Subject: [PATCH 053/670] [Session] Fix missing `code-block` directive --- session.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/session.rst b/session.rst index 621749eadb0..058c0984b8c 100644 --- a/session.rst +++ b/session.rst @@ -517,6 +517,8 @@ a Symfony service for the connection to the Redis server: .. configuration-block:: + .. code-block:: yaml + # config/services.yaml services: # ... From 4ac5d8984a4e1edf2cfb1f7638b57e083b149d51 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Mon, 5 Jun 2023 16:37:10 +0200 Subject: [PATCH 054/670] [Lock] Add Redis Secure DSN example --- lock.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/lock.rst b/lock.rst index 8d5dc62617f..7a05152429e 100644 --- a/lock.rst +++ b/lock.rst @@ -50,6 +50,7 @@ this behavior by using the ``lock`` key like: lock: ['memcached://m1.docker', 'memcached://m2.docker'] lock: 'redis://r1.docker' lock: ['redis://r1.docker', 'redis://r2.docker'] + lock: 'rediss://r1.docker?ssl[verify_peer]=1&ssl[cafile]=...' lock: 'zookeeper://z1.docker' lock: 'zookeeper://z1.docker,z2.docker' lock: 'sqlite:///%kernel.project_dir%/var/lock.db' From a4c126123cddaa04a3d1d0191ff6103743229d43 Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Fri, 6 Jan 2023 17:00:17 +0100 Subject: [PATCH 055/670] [Config] Introducing the new `param()` function as early as possible --- configuration.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/configuration.rst b/configuration.rst index 79d014f9170..386e1453f1f 100644 --- a/configuration.rst +++ b/configuration.rst @@ -304,8 +304,6 @@ configuration file using a special syntax: wrap the parameter name in two ``%`` # any string surrounded by two % is replaced by that parameter value email_address: '%app.admin_email%' - # ... - .. code-block:: xml @@ -328,13 +326,17 @@ configuration file using a special syntax: wrap the parameter name in two ``%`` // config/packages/some_package.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; + use function Symfony\Component\DependencyInjection\Loader\Configurator\param; return static function (ContainerConfigurator $container) { $container->extension('some_package', [ - // any string surrounded by two % is replaced by that parameter value - 'email_address' => '%app.admin_email%', + // when using the param() function, you only have to pass the parameter name... + 'email_address' => param('app.admin_email'), - // ... + // ... but if you prefer it, you can also pass the name as a string + // surrounded by two % (same as in YAML and XML formats) and Symfony will + // replace it by that parameter value + 'email_address' => '%app.admin_email%', ]); }; From 0c3c0f5d5e3b0e8f1bac4e23fe212918a4f97307 Mon Sep 17 00:00:00 2001 From: Quentin Dequippe Date: Sun, 23 Apr 2023 10:36:41 +0400 Subject: [PATCH 056/670] Add missing type monolog config php config --- logging/monolog_email.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/logging/monolog_email.rst b/logging/monolog_email.rst index e6da3dbeb51..3302707bea3 100644 --- a/logging/monolog_email.rst +++ b/logging/monolog_email.rst @@ -293,6 +293,7 @@ get logged on the server as well as the emails being sent: ; $monolog->handler('group') + ->type('group') ->members(['streamed', 'deduplicated']) ; From 44f23883483860f7c2a3238b1074ca95d5553395 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 6 Jun 2023 12:59:01 +0200 Subject: [PATCH 057/670] Tweaks --- configuration.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configuration.rst b/configuration.rst index 2b84c4cfb24..f423a15c85b 100644 --- a/configuration.rst +++ b/configuration.rst @@ -59,9 +59,9 @@ shown in these three formats. .. note:: - By default, Symfony only loads the configuration - files defined in YAML format. If you define configuration in XML and/or PHP - formats, update the ``src/Kernel.php`` file:: + By default, Symfony only loads the configuration files defined in YAML + format. If you define configuration in XML and/or PHP formats, update the + ``src/Kernel.php`` file:: // src/Kernel.php use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; @@ -88,8 +88,8 @@ shown in these three formats. } There isn't any practical difference between formats. In fact, Symfony -transforms all of them into PHP and caches them before running the application, so -there's not even any performance difference. +transforms all of them into PHP and caches them before running the application, +so there's not even any performance difference. YAML is used by default when installing packages because it's concise and very readable. These are the main advantages and disadvantages of each format: From 013395040d08538f97c2c544b563f8eda9e37ba5 Mon Sep 17 00:00:00 2001 From: Thibault Miscoria Date: Wed, 7 Jun 2023 21:12:40 +0200 Subject: [PATCH 058/670] Fix Cmder broken link --- contributing/code/tests.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/code/tests.rst b/contributing/code/tests.rst index 15487740301..8bffc4aa4bc 100644 --- a/contributing/code/tests.rst +++ b/contributing/code/tests.rst @@ -65,7 +65,7 @@ what's going on and if the tests are broken because of the new code. to see colored test results. .. _`install Composer`: https://getcomposer.org/download/ -.. _Cmder: https://cmder.net/ +.. _Cmder: https://cmder.app/ .. _ConEmu: https://conemu.github.io/ .. _ANSICON: https://github.com/adoxa/ansicon/releases .. _Mintty: https://mintty.github.io/ From 7ecb2530a3ce35964894c21805dffdd7d5e15215 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 8 Jun 2023 13:48:08 +0200 Subject: [PATCH 059/670] [Mailer] Document the optional HttpClient dependency --- mailer.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mailer.rst b/mailer.rst index cdb6a259ede..6fe753ae44c 100644 --- a/mailer.rst +++ b/mailer.rst @@ -215,6 +215,12 @@ Provider SMTP HTTP The usage of ``default_socket_timeout`` as the default timeout was introduced in Symfony 5.1. +.. note:: + + Besides SMTP, many 3rd party transports offer a web API to send emails. + To do so, you have to install (additionally to the bridge) + the HttpClient component via ``composer require symfony/http-client``. + .. note:: To use Google Gmail, you must have a Google Account with 2-Step-Verification (2FA) From 4f63c92294b19398ec5f892aaf83ad9e3d7ff4ba Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 9 Jun 2023 10:00:37 +0200 Subject: [PATCH 060/670] Move contents to the main DI article --- service_container.rst | 25 +++++++++++++++++++++++++ service_container/remove.rst | 23 ----------------------- 2 files changed, 25 insertions(+), 23 deletions(-) delete mode 100644 service_container/remove.rst diff --git a/service_container.rst b/service_container.rst index afd5ea44bd7..5c33d16e069 100644 --- a/service_container.rst +++ b/service_container.rst @@ -702,6 +702,31 @@ For a full list of *all* possible services in the container, run: $ php bin/console debug:container +Remove Services +--------------- + +A service can be removed from the service container if needed. This is useful +for example to make a service unavailable in some :ref:`configuration environment ` +(e.g. in the ``test`` environment): + +.. configuration-block:: + + .. code-block:: php + + // config/services_test.php + namespace Symfony\Component\DependencyInjection\Loader\Configurator; + + use App\RemovedService; + + return function(ContainerConfigurator $containerConfigurator) { + $services = $containerConfigurator->services(); + + $services->remove(RemovedService::class); + }; + +Now, the container will not contain the ``App\RemovedService`` in the ``test`` +environment. + .. _services-binding: Binding Arguments by Name or Type diff --git a/service_container/remove.rst b/service_container/remove.rst deleted file mode 100644 index da4fbf2e54e..00000000000 --- a/service_container/remove.rst +++ /dev/null @@ -1,23 +0,0 @@ -How to Remove a Service -======================= - -A service can be removed from the service container if needed -(for instance in the test or a specific environment): - -.. configuration-block:: - - .. code-block:: php - - // config/services_test.php - namespace Symfony\Component\DependencyInjection\Loader\Configurator; - - use App\RemovedService; - - return function(ContainerConfigurator $containerConfigurator) { - $services = $containerConfigurator->services(); - - $services->remove(RemovedService::class); - }; - -Now, the container will not contain the ``App\RemovedService`` -in the test environment. From 335c8cf5ea8548ec3a2b9968c2ea01bf0d345f2b Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Wed, 1 Mar 2023 21:37:53 +0100 Subject: [PATCH 061/670] [HttpClient] Replace a few classes and methods occurrences by their source code link --- http_client.rst | 93 +++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/http_client.rst b/http_client.rst index d0c49e7050e..b81934520e9 100644 --- a/http_client.rst +++ b/http_client.rst @@ -738,7 +738,7 @@ original HTTP client:: $client = new RetryableHttpClient(HttpClient::create()); -The ``RetryableHttpClient`` uses a +The :class:`Symfony\\Component\\HttpClient\\RetryableHttpClient` uses a :class:`Symfony\\Component\\HttpClient\\Retry\\RetryStrategyInterface` to decide if the request should be retried, and to define the waiting time between each retry. @@ -776,7 +776,8 @@ called when new data is uploaded or downloaded and at least once per second:: ]); Any exceptions thrown from the callback will be wrapped in an instance of -``TransportExceptionInterface`` and will abort the request. +:class:`Symfony\\Contracts\\HttpClient\\Exception\\TransportExceptionInterface` +and will abort the request. HTTPS Certificates ~~~~~~~~~~~~~~~~~~ @@ -857,9 +858,10 @@ This component supports both the native PHP streams and cURL to make the HTTP requests. Although both are interchangeable and provide the same features, including concurrent requests, HTTP/2 is only supported when using cURL. -``HttpClient::create()`` selects the cURL transport if the `cURL PHP extension`_ -is enabled and falls back to PHP streams otherwise. If you prefer to select -the transport explicitly, use the following classes to create the client:: +The :method:`Symfony\\Component\\HttpClient\\HttpClient::create` method +selects the cURL transport if the `cURL PHP extension`_ is enabled and falls +back to PHP streams otherwise. If you prefer to select the transport +explicitly, use the following classes to create the client:: use Symfony\Component\HttpClient\CurlHttpClient; use Symfony\Component\HttpClient\NativeHttpClient; @@ -1040,8 +1042,9 @@ following methods:: Streaming Responses ~~~~~~~~~~~~~~~~~~~ -Call the ``stream()`` method of the HTTP client to get *chunks* of the -response sequentially instead of waiting for the entire response:: +Call the :method:`Symfony\\Contracts\\HttpClient\\HttpClientInterface::stream` +method to get *chunks* of the response sequentially instead of waiting for the +entire response:: $url = 'https://releases.ubuntu.com/18.04.1/ubuntu-18.04.1-desktop-amd64.iso'; $response = $client->request('GET', $url); @@ -1071,8 +1074,7 @@ Canceling Responses To abort a request (e.g. because it didn't complete in due time, or you want to fetch only the first bytes of the response, etc.), you can either use the -``cancel()`` method of -:class:`Symfony\\Contracts\\HttpClient\\ResponseInterface`:: +:method:`Symfony\\Contracts\\HttpClient\\ResponseInterface::cancel`:: $response->cancel(); @@ -1190,10 +1192,12 @@ If you look again at the snippet above, responses are read in requests' order. But maybe the 2nd response came back before the 1st? Fully asynchronous operations require being able to deal with the responses in whatever order they come back. -In order to do so, the ``stream()`` method of HTTP clients accepts a list of -responses to monitor. As mentioned :ref:`previously `, -this method yields response chunks as they arrive from the network. By replacing -the "foreach" in the snippet with this one, the code becomes fully async:: +In order to do so, the +:method:`Symfony\\Contracts\\HttpClient\\HttpClientInterface::stream` +accepts a list of responses to monitor. As mentioned +:ref:`previously `, this method yields response +chunks as they arrive from the network. By replacing the "foreach" in the +snippet with this one, the code becomes fully async:: foreach ($client->stream($responses) as $response => $chunk) { if ($chunk->isFirst()) { @@ -1330,7 +1334,8 @@ installed in your application:: // this won't hit the network if the resource is already in the cache $response = $client->request('GET', 'https://example.com/cacheable-resource'); -``CachingHttpClient`` accepts a third argument to set the options of the ``HttpCache``. +:class:`Symfony\\Component\\HttpClient\\CachingHttpClient`` accepts a third argument +to set the options of the :class:`Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache`. Consuming Server-Sent Events ---------------------------- @@ -1496,8 +1501,8 @@ it. As such, you should not use it in newly written code. The component is still interoperable with libraries that require it thanks to the :class:`Symfony\\Component\\HttpClient\\HttplugClient` class. Similarly to :class:`Symfony\\Component\\HttpClient\\Psr18Client` implementing relevant parts of PSR-17, -``HttplugClient`` also implements the factory methods defined in the related -``php-http/message-factory`` package. +:class:`Symfony\\Component\\HttpClient\\HttplugClient` also implements the factory methods +defined in the related ``php-http/message-factory`` package. .. code-block:: terminal @@ -1528,15 +1533,16 @@ that requires HTTPlug dependencies:: // [...] } -Because ``HttplugClient`` implements the three interfaces, you can use it this way:: +Because :class:`Symfony\\Component\\HttpClient\\HttplugClient` implements the +three interfaces,you can use it this way:: use Symfony\Component\HttpClient\HttplugClient; $httpClient = new HttplugClient(); $apiClient = new SomeSdk($httpClient, $httpClient, $httpClient); -If you'd like to work with promises, ``HttplugClient`` also implements the -``HttpAsyncClient`` interface. To use it, you need to install the +If you'd like to work with promises, :class:`Symfony\\Component\\HttpClient\\HttplugClient` +also implements the ``HttpAsyncClient`` interface. To use it, you need to install the ``guzzlehttp/promises`` package: .. code-block:: terminal @@ -1716,20 +1722,24 @@ external service. By not making actual HTTP requests there is no need to worry a the service being online or the request changing state, for example deleting a resource. -``MockHttpClient`` implements the ``HttpClientInterface``, just like any actual -HTTP client in this component. When you type-hint with ``HttpClientInterface`` -your code will accept the real client outside tests, while replacing it with -``MockHttpClient`` in the test. +:class:`Symfony\\Component\\HttpClient\\MockHttpClient` implements the +:class:`Symfony\\Contracts\\HttpClient\\HttpClientInterface`, just like any actual +HTTP client in this component. When you type-hint with +:class:`Symfony\\Contracts\\HttpClient\\HttpClientInterface` your code will accept +the real client outside tests, while replacing it with +:class:`Symfony\\Component\\HttpClient\\MockHttpClient` in the test. -When the ``request`` method is used on ``MockHttpClient``, it will respond with -the supplied ``MockResponse``. There are a few ways to use it, as described -below. +When the ``request`` method is used on :class:`Symfony\\Component\\HttpClient\\MockHttpClient`, +it will respond with the supplied +:class:`Symfony\\Component\\HttpClient\\Response\\MockResponse`. There are a few ways to use +it, as described below. HTTP Client and Responses ~~~~~~~~~~~~~~~~~~~~~~~~~ -The first way of using ``MockHttpClient`` is to pass a list of responses to its -constructor. These will be yielded in order when requests are made:: +The first way of using :class:`Symfony\\Component\\HttpClient\\MockHttpClient` +is to pass a list of responses to its constructor. These will be yielded +in order when requests are made:: use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\HttpClient\Response\MockResponse; @@ -1744,8 +1754,8 @@ constructor. These will be yielded in order when requests are made:: $response1 = $client->request('...'); // returns $responses[0] $response2 = $client->request('...'); // returns $responses[1] -Another way of using ``MockHttpClient`` is to pass a callback that generates the -responses dynamically when it's called:: +Another way of using :class:`Symfony\\Component\\HttpClient\\MockHttpClient` is to +pass a callback that generates the responses dynamically when it's called:: use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\HttpClient\Response\MockResponse; @@ -1787,7 +1797,9 @@ assertions on the request before returning the mocked response:: .. tip:: Instead of using the first argument, you can also set the (list of) - responses or callbacks using the ``setResponseFactory()`` method:: + responses or callbacks using the + :method:`Symfony\\Component\\HttpClient\\MockHttpClient::setResponseFactory` + method:: $responses = [ new MockResponse($body1, $info1), @@ -1799,7 +1811,8 @@ assertions on the request before returning the mocked response:: .. versionadded:: 5.4 - The ``setResponseFactory()`` method was introduced in Symfony 5.4. + The :method:`Symfony\\Component\\HttpClient\\MockHttpClient::setResponseFactory` + method was introduced in Symfony 5.4. If you need to test responses with HTTP status codes different than 200, define the ``http_code`` option:: @@ -1815,10 +1828,12 @@ define the ``http_code`` option:: $response = $client->request('...'); The responses provided to the mock client don't have to be instances of -``MockResponse``. Any class implementing ``ResponseInterface`` will work (e.g. -``$this->createMock(ResponseInterface::class)``). +:class:`Symfony\\Component\\HttpClient\\Response\\MockResponse`. Any class +implementing :class:`Symfony\\Contracts\\HttpClient\\ResponseInterface` +will work (e.g. ``$this->createMock(ResponseInterface::class)``). -However, using ``MockResponse`` allows simulating chunked responses and timeouts:: +However, using :class:`Symfony\\Component\\HttpClient\\Response\\MockResponse` +allows simulating chunked responses and timeouts:: $body = function () { yield 'hello'; @@ -1910,7 +1925,8 @@ Then configure Symfony to use your callback: Testing Request Data ~~~~~~~~~~~~~~~~~~~~ -The ``MockResponse`` class comes with some helper methods to test the request: +The :class:`Symfony\\Component\\HttpClient\\Response\\MockResponse` class comes +with some helper methods to test the request: * ``getRequestMethod()`` - returns the HTTP method; * ``getRequestUrl()`` - returns the URL the request would be sent to; @@ -1919,8 +1935,9 @@ The ``MockResponse`` class comes with some helper methods to test the request: .. versionadded:: 5.2 - The ``getRequestMethod()`` and ``getRequestUrl()`` methods were introduced - in Symfony 5.2. + The :method:`Symfony\\Component\\HttpClient\\Response\\MockResponse::getRequestMethod` + and :method:`Symfony\\Component\\HttpClient\\Response\\MockResponse::getRequestUrl` + methods were introduced in Symfony 5.2. Usage example:: From b55fcfb4adf3c339a4e712c964c49a6e43ecc188 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Mon, 12 Jun 2023 13:53:00 +0200 Subject: [PATCH 062/670] [Console] Call command with options without value --- console/command_in_controller.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/console/command_in_controller.rst b/console/command_in_controller.rst index 887bdeb147d..64475bff103 100644 --- a/console/command_in_controller.rst +++ b/console/command_in_controller.rst @@ -42,6 +42,8 @@ Imagine you want to run the ``debug:twig`` from inside your controller:: 'fooArgument' => 'barValue', // (optional) pass options to the command '--bar' => 'fooValue', + // (optional) pass options without value + '--baz' => true, ]); // You can use NullOutput() if you don't need the output @@ -59,9 +61,10 @@ Imagine you want to run the ``debug:twig`` from inside your controller:: Showing Colorized Command Output -------------------------------- -By telling the ``BufferedOutput`` it is decorated via the second parameter, -it will return the Ansi color-coded content. The `SensioLabs AnsiToHtml converter`_ -can be used to convert this to colorful HTML. +By telling the :class:`Symfony\\Component\\Console\\Output\\BufferedOutput` +it is decorated via the second parameter, it will return the Ansi color-coded +content. The `SensioLabs AnsiToHtml converter`_ can be used to convert this to +colorful HTML. First, require the package: From ed6bf81958012267b4df565c4cfa9990c04ab89b Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Mon, 12 Jun 2023 15:03:54 +0200 Subject: [PATCH 063/670] [Standards] Update code guidelines --- contributing/code/standards.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contributing/code/standards.rst b/contributing/code/standards.rst index 967edb0115e..2668269dfcc 100644 --- a/contributing/code/standards.rst +++ b/contributing/code/standards.rst @@ -190,6 +190,14 @@ Structure * Exception and error messages must start with a capital letter and finish with a dot ``.``; +* Exception, error and deprecation messages containing a class name must + use ``get_debug_type()`` instead of ``::class`` to retrieve it: + + .. code-block:: diff + + - throw new \Exception(sprintf('Command "%s" failed.', $command::class)); + + throw new \Exception(sprintf('Command "%s" failed.', get_debug_type($command))); + * Do not use ``else``, ``elseif``, ``break`` after ``if`` and ``case`` conditions which return or throw something; From 6856b7196f38b662da6ff96aaebfb9111672ae5b Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 12 Jun 2023 17:30:56 +0200 Subject: [PATCH 064/670] Minor tweaks --- forms.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forms.rst b/forms.rst index a78eb2f4fe5..68feeb0af1d 100644 --- a/forms.rst +++ b/forms.rst @@ -755,9 +755,9 @@ Set the ``label`` option on fields to define their labels explicitly:: Changing the Action and HTTP Method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -By default, the ``
`` tag will be rendered with a ``method="post"`` attribute, -and no ``action`` attribute, causing it to be submitted via an HTTP POST request to the same -URL under which it was rendered. When building the form, +By default, the ```` tag is rendered with a ``method="post"`` attribute, +and no ``action`` attribute. This means that the form is submitted via an HTTP +POST request to the same URL under which it was rendered. When building the form, use the ``setAction()`` and ``setMethod()`` methods to change this:: // src/Controller/TaskController.php From 68642ae4782d28d4423d05a2640cf0497cd1910a Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Wed, 14 Jun 2023 14:16:32 +0200 Subject: [PATCH 065/670] [Process] Remove wrong note about `create_new_console` option --- components/process.rst | 5 ----- 1 file changed, 5 deletions(-) diff --git a/components/process.rst b/components/process.rst index a0a312512bc..12ee096df4e 100644 --- a/components/process.rst +++ b/components/process.rst @@ -113,11 +113,6 @@ You can configure the options passed to the ``other_options`` argument of // this option allows a subprocess to continue running after the main script exited $process->setOptions(['create_new_console' => true]); -.. note:: - - The ``create_new_console`` option is only available on Windows! - - Using Features From the OS Shell -------------------------------- From dd12eb5986b7a8b8ed5153a48384b11ca34efe74 Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Thu, 15 Jun 2023 10:47:14 +0200 Subject: [PATCH 066/670] Mention that `default_locale` is used as the default for `framework.translator.fallbacks` --- translation.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/translation.rst b/translation.rst index e36fb9ff321..b368c00d7f4 100644 --- a/translation.rst +++ b/translation.rst @@ -943,6 +943,9 @@ the framework: $framework->defaultLocale('en'); }; +This ``default_locale`` is also relevant for the translator, as we will see +in the next section. + .. _translation-fallback: Fallback Translation Locales @@ -963,7 +966,8 @@ checks translation resources for several locales: (Spanish) translation resource (e.g. ``messages.es.yaml``); #. If the translation still isn't found, Symfony uses the ``fallbacks`` option, - which can be configured as follows: + which can be configured as follows. When this option is not defined, it + defaults to the ``default_locale`` setting mentioned in the previous section. .. configuration-block:: From 720e9f7b65d6dd17802e448490e181144e4e0baf Mon Sep 17 00:00:00 2001 From: Bastien Picharles Date: Wed, 12 Oct 2022 16:06:01 +0200 Subject: [PATCH 067/670] [DependencyInjection] Typo on how default defaultIndexMethod work --- service_container/tags.rst | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/service_container/tags.rst b/service_container/tags.rst index 94d7d2036b3..9a94006ce8d 100644 --- a/service_container/tags.rst +++ b/service_container/tags.rst @@ -804,9 +804,21 @@ array element. For example, to retrieve the ``handler_two`` handler:: .. tip:: - Just like the priority, you can also implement a static - ``getDefaultIndexName()`` method in the handlers and omit the + Just like the priority, if you set the attribute (``index_by``) on the :tagged_iterator, you can also implement a static + ``getDefault(``index_by``)Name()`` method in the handlers and omit the index attribute (``key``):: + + + .. code-block:: yaml + + # config/services.yaml + services: + # ... + + App\HandlerCollection: + arguments: [!tagged_iterator { tag: 'app.handler', index_by: 'handler' }] + + .. code-block:: php // src/Handler/One.php namespace App\Handler; @@ -814,7 +826,7 @@ array element. For example, to retrieve the ``handler_two`` handler:: class One { // ... - public static function getDefaultIndexName(): string + public static function getDefaultHandlerName(): string { return 'handler_one'; } From f347595de3f080c657057d985c69e963ea1f99ce Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 15 Jun 2023 16:49:08 +0200 Subject: [PATCH 068/670] Reword --- service_container/tags.rst | 153 +++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 76 deletions(-) diff --git a/service_container/tags.rst b/service_container/tags.rst index c4de67b7506..1c17e4e95da 100644 --- a/service_container/tags.rst +++ b/service_container/tags.rst @@ -919,109 +919,110 @@ array element. For example, to retrieve the ``handler_two`` handler:: } } -.. tip:: +You can omit the index attribute (``key`` in the previous example) by setting +the ``index_by`` attribute on the ``tagged_iterator`` tag. In this case, you +must define a static method whose name follows the pattern: +``getDefaultName``. - Just like the priority, if you set the attribute (``index_by``) on the :tagged_iterator, you can also implement a static - ``getDefault(``index_by``)Name()`` method in the handlers and omit the - index attribute (``key``):: - +For example, if ``index_by`` is ``handler``, the method name must be +``getDefaultHandlerName()``: - .. code-block:: yaml - - # config/services.yaml - services: - # ... +.. code-block:: yaml - App\HandlerCollection: - arguments: [!tagged_iterator { tag: 'app.handler', index_by: 'handler' }] - - .. code-block:: php + # config/services.yaml + services: + # ... + + App\HandlerCollection: + arguments: [!tagged_iterator { tag: 'app.handler', index_by: 'handler' }] - // src/Handler/One.php - namespace App\Handler; +.. code-block:: php - class One + // src/Handler/One.php + namespace App\Handler; + + class One + { + // ... + public static function getDefaultHandlerName(): string { - // ... - public static function getDefaultHandlerName(): string - { - return 'handler_one'; - } + return 'handler_one'; } + } - You also can define the name of the static method to implement on each service - with the ``default_index_method`` attribute on the tagged argument: +You also can define the name of the static method to implement on each service +with the ``default_index_method`` attribute on the tagged argument: - .. configuration-block:: +.. configuration-block:: - .. code-block:: php-attributes + .. code-block:: php-attributes - // src/HandlerCollection.php - namespace App; + // src/HandlerCollection.php + namespace App; - use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; + use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; - class HandlerCollection - { - public function __construct( - #[TaggedIterator('app.handler', defaultIndexMethod: 'getIndex')] - iterable $handlers - ) { - } + class HandlerCollection + { + public function __construct( + #[TaggedIterator('app.handler', defaultIndexMethod: 'getIndex')] + iterable $handlers + ) { } + } - .. code-block:: yaml + .. code-block:: yaml - # config/services.yaml - services: - # ... + # config/services.yaml + services: + # ... - App\HandlerCollection: - # use getIndex() instead of getDefaultIndexName() - arguments: [!tagged_iterator { tag: 'app.handler', default_index_method: 'getIndex' }] + App\HandlerCollection: + # use getIndex() instead of getDefaultIndexName() + arguments: [!tagged_iterator { tag: 'app.handler', default_index_method: 'getIndex' }] - .. code-block:: xml + .. code-block:: xml - - - + + + - - + + - - - - - - + + + + + + - .. code-block:: php + .. code-block:: php - // config/services.php - namespace Symfony\Component\DependencyInjection\Loader\Configurator; + // config/services.php + namespace Symfony\Component\DependencyInjection\Loader\Configurator; - use App\HandlerCollection; - use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; + use App\HandlerCollection; + use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; - return function (ContainerConfigurator $container) { - $services = $container->services(); + return function (ContainerConfigurator $container) { + $services = $container->services(); - // ... + // ... - // use getIndex() instead of getDefaultIndexName() - $services->set(HandlerCollection::class) - ->args([ - tagged_iterator('app.handler', null, 'getIndex'), - ]) - ; - }; + // use getIndex() instead of getDefaultIndexName() + $services->set(HandlerCollection::class) + ->args([ + tagged_iterator('app.handler', null, 'getIndex'), + ]) + ; + }; .. _tags_as-tagged-item: From 57c18a898023ce3c174a428a8c7d63fe120e4ecf Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Thu, 15 Jun 2023 18:12:21 +0200 Subject: [PATCH 069/670] Fix xml example for defaut-index-name for tagged service provider --- service_container/tags.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service_container/tags.rst b/service_container/tags.rst index 1c17e4e95da..87f354434c2 100644 --- a/service_container/tags.rst +++ b/service_container/tags.rst @@ -997,7 +997,7 @@ with the ``default_index_method`` attribute on the tagged argument: From 5431d14d3c9198931a53c5c4bd6ce2f27d978a31 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 16 Jun 2023 11:23:03 +0200 Subject: [PATCH 070/670] Tweak --- rate_limiter.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rate_limiter.rst b/rate_limiter.rst index 226567060f0..cbf960f5f9a 100644 --- a/rate_limiter.rst +++ b/rate_limiter.rst @@ -35,7 +35,8 @@ Fixed Window Rate Limiter ~~~~~~~~~~~~~~~~~~~~~~~~~ This is the simplest technique and it's based on setting a limit for a given -interval of time. +interval of time (e.g. 5,000 requests per hour or 3 login attempts every 15 +minutes). In the diagram below, the limit is set to "5 tokens per hour". Each window starts at the first hit (i.e. 10:15, 11:30 and 12:30). As soon as there are From 811e52e8e33428039a6f1d2c3d1fbb47e65209ba Mon Sep 17 00:00:00 2001 From: Franck Ranaivo-Harisoa Date: Tue, 20 Jun 2023 09:31:28 +0200 Subject: [PATCH 071/670] Typo in yaml component "supports" instead of "sports" --- components/yaml.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/yaml.rst b/components/yaml.rst index f179d306ca1..0f4f76ef05f 100644 --- a/components/yaml.rst +++ b/components/yaml.rst @@ -41,7 +41,7 @@ compact block collections and multi-document files. Real Parser ~~~~~~~~~~~ -It sports a real parser and is able to parse a large subset of the YAML +It supports a real parser and is able to parse a large subset of the YAML specification, for all your configuration needs. It also means that the parser is pretty robust, easy to understand, and simple enough to extend. From 1179b159139c354cb27da92201d18c09b95386cd Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 20 Jun 2023 11:14:13 +0200 Subject: [PATCH 072/670] Minor reword --- translation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translation.rst b/translation.rst index b368c00d7f4..1d23f9171a9 100644 --- a/translation.rst +++ b/translation.rst @@ -943,8 +943,8 @@ the framework: $framework->defaultLocale('en'); }; -This ``default_locale`` is also relevant for the translator, as we will see -in the next section. +This ``default_locale`` is also relevant for the translator, as shown in the +next section. .. _translation-fallback: From a0ecf1810c7d8aa566ade48f5b341499d219e38d Mon Sep 17 00:00:00 2001 From: Laurent VOULLEMIER Date: Wed, 4 Jan 2023 10:23:30 +0100 Subject: [PATCH 073/670] Add YAML encoder to serializer diagram --- .../serializer/serializer_workflow.svg | 284 +++++++++++++++++- .../serializer/serializer_workflow.dia | Bin 1770 -> 1957 bytes 2 files changed, 283 insertions(+), 1 deletion(-) diff --git a/_images/components/serializer/serializer_workflow.svg b/_images/components/serializer/serializer_workflow.svg index f3906506878..b6e9c254778 100644 --- a/_images/components/serializer/serializer_workflow.svg +++ b/_images/components/serializer/serializer_workflow.svg @@ -1 +1,283 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/sources/components/serializer/serializer_workflow.dia b/_images/sources/components/serializer/serializer_workflow.dia index 6cb44280d0d2c31a623cf915db6c39110b230959..3e2ea62558fa955d02743c735fb5fcfa87d01be4 100644 GIT binary patch literal 1957 zcmV;W2U_?aiwFP!000021MOT}Z`(E$e$THE+?Ne-Xz?bIb(5kkPz*ya1JVuKlR;aI zqg9p+NlxND?6;4U6klY^cC5?nR4UrS4s$+|KIh|ij*s-_?c>BV?qwLcfq&J3!0Z^( z9|exq2f)wzq~>FZwa;o$*z^GL)&2t0QN zBH8;_c%JB~LA}oPg<-53a6~Nhd)d1pjzf1ii>2XaI3+ z!)D>UX5qqS;oN924Z=7SZoCOO3<6IIKSjM2UL=nPibldyKDKLJC6;mP#&J;50@Ak^ z;r86n9fz*7J95`X6j*WQ>VJ2%XGw85EAf#$xK4aGc&zCoNv+RovVQMI?$DFlX7BoO zW#;GAn9qAaa!4$Hy`;yb)(TG{he;~wF{jXY<~lOk`WQBnRK-3K!~)09wNO zopi@{@ecFmamI&1=*V#2}*hob3Vuq6%L&jQL!FAuJn(n02uUOpdG?V-VYb(*%bgt4}N)gBSxyjzv8z2FtGPkO*Wo zh95qQ=yTNpb4c(x&h2n`BEeTEezivpLgBcxXxG*up1Y32n+nHS&tvmQ$JveLW8B%3 zHsr<>?R!$pSsRzH`-GvG7nFW>D6XR1JMiOeX!?EQR%Nl?{HpWYH{(Y5k?}=@Verr~ zqIj;=jpD@A$cJDSx-wjqVb7n*MsRM+IRUbgkDo$_2;>l#!(6B8ZInh(7el~J(=LaU z57)wyqiL>&>@iR(%^CX>x&3pM{%o=(1KuUow<+fmXY7j5{iZ`=rRi4HSdh{R9dih)dfRX1nk-0x-3g;@h#6xETEDdodrIThT9 z(#NHhzB;Xx?6&LF`3j|5 zDQzMfV1P3Vx7k4D*}x~)ms`$ZQuZ7s5SWm0T>v8(k{XX=b^Kb4X&`KItFM4D;Y=UU z)F#JrrSA`^)+MJmUcvo+jh-KNzp2|kEA%wmAGx4 zP*UP457;l}QC8(coS6utW7DcO1FF7|&#EcpBV2bOAE8AdUqwtag?xnDLVjDwZwvX2 z3Gc57d9@Y$<|_7xv=#eC`*(N+o$81%JL$YawpDMldWvK!A0f1_WT*}GYXqQWqjSjP zBN^&DTmF%4PhdkmfrakbCi7=mcZ8*Htsxu`Xg5Jv3#5#&Cp%8@N$HQrTJ<}Z&TCCh6j7lp zJE0u+iSj|+XM`R;MeJIZE!r;ep`1yAhwPl1#Bh{*^2B+`WfxL+t+~T&R ztOlohl^JZR2Dh=!9Yd`WThi9xPA7PZbb0CS+4Me4TJJ-&G>8p2XDVb8Jey#veay$Y z`i_+J-qhT`Nbg?8?nucTJu3w~?yMWiduT|U)EAGWsJv}Zo+K8{GpBQ(Fkuv{` rgXGa3#`33%m#oc4*5<6{i7$PfJQDQ!V(pos*BAc*B@mY+O2m9^T} literal 1770 zcmVBF6K$tDQG*Mnk`ScRLTP??=(`u{AJb4&k5n3#9x_H~*r-VBE~H#ZMDEL!@|vQ!_OYy3prDhSjlhIt{wdnqK@l@ipy^2izxB6NxE8WnN;{OKOfi> zR*5zWXBV%2A+PdVDlXjn+I6FqAn9DjGe6wM(R&l*8-V~v2?aIBcTJrwgPy9)scHO-nrblzXI*$ADr<2k5{jWDX z4Y{|<{NQm#6@7Ysm@R!zB?pe#rcH&X>%we!XxGbjkKLI3QYl+!5P@8&xN!geK2KZ4 z2dooIyi~R&r>Xz_?%jhui6(!mX<97yGL@kxW6yeRy^n6~dl8}~i0_@-U!2X&Dlbnv z(?qznTZ?FYq_8tU5HJV9@*Zq6NEO0lQU-|i5@a|FR6*?m2x@RBMQ}t3aOi+&R9Y8R z1!_K?Msc{U6^^*J3?(C#?e(p*7HQ!7TKTikfcU{(?j}5Hg4w z!EKVlK}GsBjO04H8Sjw2yHa8nQu|Tzi+QY71>eUYx|v?fIIWC6*f{$506V}Dh_x7f z*fr5-a0p@}!c6pG3?QkC`pD>OxVFbcA8#@E@JYm;ABK+#Js~+A$dfujTFC*3So2uK?J|M<*K6C-6IgIs*Na2 zccGc<)|H(5!Rp-p{i}5;!^HY5<2bsptt4F;O`{nxck&@x#=eRl3a_W%$yR9YQt|+? z?Bk~pA_4`(%`i8KdKaM)G{6uD9j?ug%E4OMVsV^iK)N)Yg>$w0Q&r(|zN4zxS6A$k z#tri819AJ+1jK_DTajN;)BK9i0P!}3t@iH%hmSHKfavq*j31URAmZjlC?VKIl(kJ4 zrL*@En8Im+DXI$d?3T(waephg6M>H#3w)iXwAyytl=m89fSK0#BZ>eY5G|1~#jQ&F zMyq;MSq%YgQ`-Z`DRL>{4&|B{#LE)<$o%WY{>u{kAES6KQ|qT+FTZ>qSbzQYX<&W0 z{PX7@HlH(r^$Rf$8KpX}cOn0URuQaM|3_B;pZrkmNWP?L@+A;BkPFl7A{deubFj|2 zjB^8onP4LgjEUeTD^r)$rN}TGtI*5VQ)`ubO!a-$ZCvYvGhLK#XV*7WPs%!}R$=3u zQ))}T!@kFX3TOK>HEj-ZPz}%{XxGEVGi@9`7*I#x0VV(;M%xUZJ0u-H4x=MNfr}Y8 z$i!tQP*i8*K&mgTJ1VU!Pi9|aKf5CPFj2AQ-=YBmX;uWcOjK(mS`d}a``F2lPlKpD z)e}{RL{)h*d!l;IL{(9cxQ&U50Kw=0Y585dE_fVI5i@E-3=+YZj|^YA44QMugzL6k zkyI^nwk|fC~yo znNr63J^H*356ut(2z0xkt2I(VSGr8V z5Srgm~z$O?8)i`dyWtu;cHxkAMva~XS$V3btIj8hs*Yz*SEpFjHy_UC zz_gTd(JopoOgNy3yP3A40*{D3ffQjgv%?X_Z5Jn1>)dUMi>EF`T^>FCVWPf;aMVa; z$LhbC=X0RwqW`vj45{e9nSiMM{L_>BZ(Hl!W6BzAN#B3#FnIF!*`Kz%INSK!cNb^> M0g Date: Fri, 23 Jun 2023 15:22:18 +0200 Subject: [PATCH 074/670] Mention Rector in the upgrading articles --- setup/upgrade_major.rst | 7 +++++++ setup/upgrade_minor.rst | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/setup/upgrade_major.rst b/setup/upgrade_major.rst index d6faf5f81c5..ed81d4e21d7 100644 --- a/setup/upgrade_major.rst +++ b/setup/upgrade_major.rst @@ -54,6 +54,12 @@ And sometimes, the warning may come from a third-party library or bundle that you're using. If that's true, there's a good chance that those deprecations have already been updated. In that case, upgrade the library to fix them. +.. tip:: + + `Rector`_ is a third-party project that automates the upgrading and + refactoring of PHP projects. Rector includes some rules to fix certain + Symfony deprecations automatically. + Once all the deprecation warnings are gone, you can upgrade with a lot more confidence. @@ -314,3 +320,4 @@ Classes in the ``vendor/`` directory are always ignored. Now, you can safely allow ``^6.0`` for the Symfony dependencies. .. _`PHP CS Fixer`: https://github.com/friendsofphp/php-cs-fixer +.. _`Rector`: https://github.com/rectorphp/rector diff --git a/setup/upgrade_minor.rst b/setup/upgrade_minor.rst index bb1cfda62fa..9e8c6943d1f 100644 --- a/setup/upgrade_minor.rst +++ b/setup/upgrade_minor.rst @@ -84,6 +84,12 @@ included in the Symfony directory that describes these changes. If you follow the instructions in the document and update your code accordingly, it should be safe to update in the future. +.. tip:: + + `Rector`_ is a third-party project that automates the upgrading and + refactoring of PHP projects. Rector includes some rules to fix certain + Symfony deprecations automatically. + These documents can also be found in the `Symfony Repository`_. .. _updating-flex-recipes: @@ -92,3 +98,4 @@ These documents can also be found in the `Symfony Repository`_. .. _`Symfony Repository`: https://github.com/symfony/symfony .. _`UPGRADE-5.4.md`: https://github.com/symfony/symfony/blob/5.4/UPGRADE-5.4.md +.. _`Rector`: https://github.com/rectorphp/rector From 1945dba92b22d1dd25f03bd364fcc6bae4c5a417 Mon Sep 17 00:00:00 2001 From: Tim Krase <38947626+timkrase@users.noreply.github.com> Date: Sun, 25 Jun 2023 13:33:47 +0200 Subject: [PATCH 075/670] [Tests] Update PHPUnit documentation links --- best_practices.rst | 2 +- components/phpunit_bridge.rst | 8 ++++---- create_framework/unit_testing.rst | 4 ++-- form/unit_testing.rst | 2 +- testing.rst | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/best_practices.rst b/best_practices.rst index 02896abc627..02315856d00 100644 --- a/best_practices.rst +++ b/best_practices.rst @@ -463,4 +463,4 @@ you must set up a redirection. .. _`feature toggles`: https://en.wikipedia.org/wiki/Feature_toggle .. _`smoke testing`: https://en.wikipedia.org/wiki/Smoke_testing_(software) .. _`Webpack`: https://webpack.js.org/ -.. _`PHPUnit data providers`: https://docs.phpunit.de/en/9.5/writing-tests-for-phpunit.html#data-providers +.. _`PHPUnit data providers`: https://docs.phpunit.de/en/9.6/writing-tests-for-phpunit.html#data-providers diff --git a/components/phpunit_bridge.rst b/components/phpunit_bridge.rst index 558fd808db6..288989dcd87 100644 --- a/components/phpunit_bridge.rst +++ b/components/phpunit_bridge.rst @@ -1064,11 +1064,11 @@ not find the SUT: .. _`PHPUnit`: https://phpunit.de .. _`PHPUnit event listener`: https://docs.phpunit.de/en/10.0/extending-phpunit.html#phpunit-s-event-system .. _`ErrorHandler component`: https://github.com/symfony/error-handler -.. _`PHPUnit's assertStringMatchesFormat()`: https://docs.phpunit.de/en/9.5/assertions.html#assertstringmatchesformat +.. _`PHPUnit's assertStringMatchesFormat()`: https://docs.phpunit.de/en/9.6/assertions.html#assertstringmatchesformat .. _`PHP error handler`: https://www.php.net/manual/en/book.errorfunc.php -.. _`environment variable`: https://docs.phpunit.de/en/9.5/configuration.html#the-env-element +.. _`environment variable`: https://docs.phpunit.de/en/9.6/configuration.html#the-env-element .. _`@-silencing operator`: https://www.php.net/manual/en/language.operators.errorcontrol.php .. _`Travis CI`: https://travis-ci.org/ -.. _`test listener`: https://docs.phpunit.de/en/9.5/configuration.html#the-extensions-element -.. _`@covers`: https://docs.phpunit.de/en/9.5/annotations.html#covers +.. _`test listener`: https://docs.phpunit.de/en/9.6/configuration.html#the-extensions-element +.. _`@covers`: https://docs.phpunit.de/en/9.6/annotations.html#covers .. _`PHP namespace resolutions rules`: https://www.php.net/manual/en/language.namespaces.rules.php diff --git a/create_framework/unit_testing.rst b/create_framework/unit_testing.rst index cd3b30cac6c..916711de0ce 100644 --- a/create_framework/unit_testing.rst +++ b/create_framework/unit_testing.rst @@ -220,6 +220,6 @@ Symfony code. Now that we are confident (again) about the code we have written, we can safely think about the next batch of features we want to add to our framework. -.. _`PHPUnit`: https://docs.phpunit.de/en/9.5/ -.. _`test doubles`: https://docs.phpunit.de/en/9.5/test-doubles.html +.. _`PHPUnit`: https://docs.phpunit.de/en/9.6/ +.. _`test doubles`: https://docs.phpunit.de/en/9.6/test-doubles.html .. _`XDebug`: https://xdebug.org/ diff --git a/form/unit_testing.rst b/form/unit_testing.rst index 3c4a7b780a3..bcd82a1ee38 100644 --- a/form/unit_testing.rst +++ b/form/unit_testing.rst @@ -241,4 +241,4 @@ guessers using the :method:`Symfony\\Component\\Form\\Test\\FormIntegrationTestC and :method:`Symfony\\Component\\Form\\Test\\FormIntegrationTestCase::getTypeGuessers` methods. -.. _`PHPUnit data providers`: https://docs.phpunit.de/en/9.5/writing-tests-for-phpunit.html#data-providers +.. _`PHPUnit data providers`: https://docs.phpunit.de/en/9.6/writing-tests-for-phpunit.html#data-providers diff --git a/testing.rst b/testing.rst index 24326be908a..fb041937052 100644 --- a/testing.rst +++ b/testing.rst @@ -1116,12 +1116,12 @@ Learn more .. _`PHPUnit`: https://phpunit.de/ .. _`documentation`: https://docs.phpunit.de/ -.. _`Writing Tests for PHPUnit`: https://docs.phpunit.de/en/9.5/writing-tests-for-phpunit.html -.. _`PHPUnit documentation`: https://docs.phpunit.de/en/9.5/configuration.html +.. _`Writing Tests for PHPUnit`: https://docs.phpunit.de/en/9.6/writing-tests-for-phpunit.html +.. _`PHPUnit documentation`: https://docs.phpunit.de/en/9.6/configuration.html .. _`unit test`: https://en.wikipedia.org/wiki/Unit_testing .. _`DAMADoctrineTestBundle`: https://github.com/dmaicher/doctrine-test-bundle .. _`Doctrine data fixtures`: https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html .. _`DoctrineFixturesBundle documentation`: https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html .. _`SymfonyMakerBundle`: https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html -.. _`PHPUnit Assertion`: https://docs.phpunit.de/en/9.5/assertions.html +.. _`PHPUnit Assertion`: https://docs.phpunit.de/en/9.6/assertions.html .. _`section 4.1.18 of RFC 3875`: https://tools.ietf.org/html/rfc3875#section-4.1.18 From 77c98fea66e51da771360fe6edaeaf0b2a780c13 Mon Sep 17 00:00:00 2001 From: Jan Klan Date: Mon, 26 Jun 2023 11:58:10 +0930 Subject: [PATCH 076/670] Fix incorrect placement of is_empty_callback --- reference/forms/types/form.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reference/forms/types/form.rst b/reference/forms/types/form.rst index 9ef474a0063..9891ea28cb4 100644 --- a/reference/forms/types/form.rst +++ b/reference/forms/types/form.rst @@ -61,6 +61,10 @@ The actual default value of this option depends on other field options: * If ``data_class`` is not set and ``compound`` is ``false``, then ``''`` (empty string). +.. include:: /reference/forms/types/options/empty_data_description.rst.inc + +.. _reference-form-option-error-bubbling: + ``is_empty_callback`` ~~~~~~~~~~~~~~~~~~~~~ @@ -68,9 +72,6 @@ The actual default value of this option depends on other field options: This callable takes form data and returns whether value is considered empty. -.. include:: /reference/forms/types/options/empty_data_description.rst.inc - -.. _reference-form-option-error-bubbling: .. include:: /reference/forms/types/options/error_bubbling.rst.inc From e48b20d329addf5defc9d7d4aab7f2fe4695617a Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Mon, 26 Jun 2023 10:48:13 +0200 Subject: [PATCH 077/670] Minor --- reference/forms/types/form.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reference/forms/types/form.rst b/reference/forms/types/form.rst index 9891ea28cb4..60d6bde2793 100644 --- a/reference/forms/types/form.rst +++ b/reference/forms/types/form.rst @@ -63,8 +63,6 @@ The actual default value of this option depends on other field options: .. include:: /reference/forms/types/options/empty_data_description.rst.inc -.. _reference-form-option-error-bubbling: - ``is_empty_callback`` ~~~~~~~~~~~~~~~~~~~~~ @@ -72,6 +70,7 @@ The actual default value of this option depends on other field options: This callable takes form data and returns whether value is considered empty. +.. _reference-form-option-error-bubbling: .. include:: /reference/forms/types/options/error_bubbling.rst.inc From 8c0c806ce5c1f5f16da4d73033b81644a04addd8 Mon Sep 17 00:00:00 2001 From: 6e0d0a <73163496+6e0d0a@users.noreply.github.com> Date: Thu, 29 Jun 2023 12:43:42 +0200 Subject: [PATCH 078/670] Update routing.rst In the i18n configuration you have a small mistake with the host configuration. --- routing.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/routing.rst b/routing.rst index 56f969cc331..3c08ccef960 100644 --- a/routing.rst +++ b/routing.rst @@ -2429,8 +2429,8 @@ locale. resource: '../../src/Controller/' type: annotation host: - en: 'https://www.example.com' - nl: 'https://www.example.nl' + en: 'www.example.com' + nl: 'www.example.nl' .. code-block:: xml @@ -2441,8 +2441,8 @@ locale. xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd"> - https://www.example.com - https://www.example.nl + www.example.com + www.example.nl @@ -2453,8 +2453,8 @@ locale. return function (RoutingConfigurator $routes) { $routes->import('../../src/Controller/', 'annotation') ->host([ - 'en' => 'https://www.example.com', - 'nl' => 'https://www.example.nl', + 'en' => 'www.example.com', + 'nl' => 'www.example.nl', ]) ; }; From fc94456249d1d888c656d235a669f7b4fb3ce4f8 Mon Sep 17 00:00:00 2001 From: Antoine M Date: Thu, 29 Jun 2023 19:50:07 +0200 Subject: [PATCH 079/670] [Form][Validator] Add new unique entity validation on form type --- reference/constraints/UniqueEntity.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/reference/constraints/UniqueEntity.rst b/reference/constraints/UniqueEntity.rst index 59840bbfe9b..f0bf8c6879a 100644 --- a/reference/constraints/UniqueEntity.rst +++ b/reference/constraints/UniqueEntity.rst @@ -126,6 +126,29 @@ between all of the rows in your user table: } } + // src/Form/Type/UserType.php + namespace App\Form\Type; + + // ... + // DON'T forget the following use statement!!! + use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; + + class UserType extends AbstractType + { + // ... + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + // ... + 'data_class' => User::class, + 'constraints' => [ + new UniqueEntity(fields: ['email']), + ], + ]); + } + } + .. caution:: This constraint doesn't provide any protection against `race conditions`_. From 0ec56cd0aae64a3d58c680b1538d0ba2fad66f9a Mon Sep 17 00:00:00 2001 From: jmsche Date: Wed, 5 Jul 2023 08:56:28 +0200 Subject: [PATCH 080/670] [Encore] Webpack Dev Server & Symfony CLI HTTPS: add note for Node 17+ --- frontend/encore/dev-server.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/encore/dev-server.rst b/frontend/encore/dev-server.rst index 52a4fa83b05..6fcdaee6fd6 100644 --- a/frontend/encore/dev-server.rst +++ b/frontend/encore/dev-server.rst @@ -58,7 +58,6 @@ method in your ``webpack.config.js`` file: }) ; - Enabling HTTPS using the Symfony Web Server ------------------------------------------- @@ -84,6 +83,19 @@ server SSL certificate: + } + }) +.. note:: + + If you are using Node.js 17 or newer, you have to run the ``dev-server`` command with the + ``--openssl-legacy-provider`` option: + + .. code-block:: terminal + + # if you use the Yarn package manager + $ NODE_OPTIONS=--openssl-legacy-provider yarn encore dev-server + + # if you use the npm package manager + $ NODE_OPTIONS=--openssl-legacy-provider npm run dev-server + CORS Issues ----------- From 3114363e638d57e601ed9e2d5aa706a4a8397297 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Wed, 5 Jul 2023 21:43:02 +0200 Subject: [PATCH 081/670] Fix comma space --- http_client.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/http_client.rst b/http_client.rst index b81934520e9..d63648b40cb 100644 --- a/http_client.rst +++ b/http_client.rst @@ -1534,7 +1534,7 @@ that requires HTTPlug dependencies:: } Because :class:`Symfony\\Component\\HttpClient\\HttplugClient` implements the -three interfaces,you can use it this way:: +three interfaces, you can use it this way:: use Symfony\Component\HttpClient\HttplugClient; From c34c5cb9320dd3a66e48ee7bdd1a16d1006e2789 Mon Sep 17 00:00:00 2001 From: Maxime Pinot Date: Fri, 7 Jul 2023 12:08:46 +0200 Subject: [PATCH 082/670] [Testing] Mention the `KernelBrowser::disableReboot` method --- testing.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/testing.rst b/testing.rst index fb041937052..8a5a7b904c8 100644 --- a/testing.rst +++ b/testing.rst @@ -622,6 +622,7 @@ This allows you to create all types of requests you can think of: Also, it means that entities loaded by Doctrine repositories will be "detached", so they will need to be refreshed by the manager or queried again from a repository. + You can disable this behavior by calling the :method:`disableReboot() ` method. Browsing the Site ................. From e2968569ccb2539825a71ad13945cd959d120fdb Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Fri, 7 Jul 2023 15:50:41 +0200 Subject: [PATCH 083/670] Minor typo --- contributing/documentation/format.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/documentation/format.rst b/contributing/documentation/format.rst index f6492ec4277..8df3fb45610 100644 --- a/contributing/documentation/format.rst +++ b/contributing/documentation/format.rst @@ -21,7 +21,7 @@ tutorial and the `reStructuredText Reference`_. If you are familiar with Markdown, be careful as things are sometimes very similar but different: - * Lists starts at the beginning of a line (no indentation is allowed); + * Lists start at the beginning of a line (no indentation is allowed); * Inline code blocks use double-ticks (````like this````). Sphinx From 8b2b0ea722b67550958718d9385b7bf152fbddaa Mon Sep 17 00:00:00 2001 From: Peter Hauke <90506472+peterhauke@users.noreply.github.com> Date: Tue, 11 Jul 2023 08:17:51 +0200 Subject: [PATCH 084/670] Fix typos Remove unnecessary hyphen after "pure". "server side" should be hyphenated: "server-side". --- frontend.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend.rst b/frontend.rst index da0564a5550..ad30b996462 100644 --- a/frontend.rst +++ b/frontend.rst @@ -6,7 +6,7 @@ Managing CSS and JavaScript Do you prefer video tutorials? Check out the `Webpack Encore screencast series`_. -Symfony ships with a pure-JavaScript library - called Webpack Encore - that makes +Symfony ships with a pure JavaScript library - called Webpack Encore - that makes it a joy to work with CSS and JavaScript. You can use it, use something else, or create static CSS and JS files in your ``public/`` directory directly and include them in your templates. @@ -18,7 +18,7 @@ Webpack Encore `Webpack Encore`_ is a simpler way to integrate `Webpack`_ into your application. It *wraps* Webpack, giving you a clean & powerful API for bundling JavaScript modules, -pre-processing CSS & JS and compiling and minifying assets. Encore gives you professional +pre-processing CSS & JS and compiling and minifying assets. Encore gives you a professional asset system that's a *delight* to use. Encore is inspired by `Webpacker`_ and `Mix`_, but stays in the spirit of Webpack: @@ -28,7 +28,7 @@ to solve the most common Webpack use cases. .. tip:: Encore is made by `Symfony`_ and works *beautifully* in Symfony applications. - But it can be used in any PHP application and even with other server side + But it can be used in any PHP application and even with other server-side programming languages! .. _encore-toc: @@ -45,7 +45,7 @@ Getting Started Adding more Features .................... -* :doc:`CSS Preprocessors: Sass, LESS, etc ` +* :doc:`CSS Preprocessors: Sass, LESS, etc. ` * :doc:`PostCSS and autoprefixing ` * :doc:`Enabling React.js ` * :doc:`Enabling Vue.js (vue-loader) ` From 4851eddf45c73038dd79aed9a0a5362a86c696b6 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 11 Jul 2023 16:44:49 +0200 Subject: [PATCH 085/670] [Console] Minor tweaks --- console/calling_commands.rst | 2 +- console/verbosity.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/console/calling_commands.rst b/console/calling_commands.rst index 2defb04d49a..1a9cce4e6c3 100644 --- a/console/calling_commands.rst +++ b/console/calling_commands.rst @@ -27,7 +27,7 @@ method):: { // ... - protected function execute(InputInterface $input, OutputInterface $output): void + protected function execute(InputInterface $input, OutputInterface $output): int { $command = $this->getApplication()->find('demo:greet'); diff --git a/console/verbosity.rst b/console/verbosity.rst index 7df68d30f23..f7a1a1e5e59 100644 --- a/console/verbosity.rst +++ b/console/verbosity.rst @@ -69,7 +69,7 @@ level. For example:: OutputInterface::VERBOSITY_VERBOSE ); - return 0; + return Command::SUCCESS; } } From 39e8e1e467cb2eac7fabfeaef864bbb05b903fa5 Mon Sep 17 00:00:00 2001 From: Alexis Lefebvre Date: Wed, 12 Jul 2023 20:03:18 +0200 Subject: [PATCH 086/670] Response Assertions: add examples of headers --- testing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing.rst b/testing.rst index 8a5a7b904c8..d3705a9984a 100644 --- a/testing.rst +++ b/testing.rst @@ -971,10 +971,10 @@ Response Assertions Asserts the response is a redirect response (optionally, you can check the target location and status code). ``assertResponseHasHeader(string $headerName, string $message = '')``/``assertResponseNotHasHeader(string $headerName, string $message = '')`` - Asserts the given header is (not) available on the response. + Asserts the given header is (not) available on the response, e.g. ``assertResponseHasHeader('content-type');``. ``assertResponseHeaderSame(string $headerName, string $expectedValue, string $message = '')``/``assertResponseHeaderNotSame(string $headerName, string $expectedValue, string $message = '')`` Asserts the given header does (not) contain the expected value on the - response. + response, e.g. ``assertResponseHeaderSame('content-type', 'application/octet-stream');``. ``assertResponseHasCookie(string $name, string $path = '/', string $domain = null, string $message = '')``/``assertResponseNotHasCookie(string $name, string $path = '/', string $domain = null, string $message = '')`` Asserts the given cookie is present in the response (optionally checking for a specific cookie path or domain). From 6da9f16e1edd1535d2a035c89b10415903dddd38 Mon Sep 17 00:00:00 2001 From: Mert Simsek Date: Wed, 19 Jan 2022 19:04:12 +0300 Subject: [PATCH 087/670] Update configuration.rst and deployment.rst for dotenv:dump command --- configuration.rst | 23 ++++++++++++++++++++--- deployment.rst | 6 +++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/configuration.rst b/configuration.rst index 5e62421dd6c..a5662985dde 100644 --- a/configuration.rst +++ b/configuration.rst @@ -772,13 +772,30 @@ In production, the ``.env`` files are also parsed and loaded on each request. So the easiest way to define env vars is by deploying a ``.env.local`` file to your production server(s) with your production values. -To improve performance, you can optionally run the ``dump-env`` command (available -in :ref:`Symfony Flex ` 1.2 or later): +To improve performance, you can optionally run the ``dotenv:dump`` command (available +in :ref:`Symfony Flex ` 1.2 or later). The command is not registered by default. +In order to enable it, you must add it to their services.yaml file: + +.. code-block:: yaml + + services: + Symfony\Component\Dotenv\Command\DotenvDumpCommand: + - '%kernel.project_dir%/.env' + - '%kernel.environment%' + +On PHP >= 8, the two arguments can be removed when autoconfiguration is enabled (which is the default): + +.. code-block:: yaml + + services: + Symfony\Component\Dotenv\Command\DotenvDumpCommand: ~ + +Running command: .. code-block:: terminal # parses ALL .env files and dumps their final values to .env.local.php - $ composer dump-env prod + $ php bin/console dotenv:dump prod After running this command, Symfony will load the ``.env.local.php`` file to get the environment variables and will not spend time parsing the ``.env`` files. diff --git a/deployment.rst b/deployment.rst index 1de29ae5b16..f61f8e1509b 100644 --- a/deployment.rst +++ b/deployment.rst @@ -164,14 +164,14 @@ most natural in your hosting environment. .. code-block:: terminal - $ composer dump-env prod + $ php bin/console dotenv:dump prod - The generated file will contain all the configuration stored in ``.env``. If you + The generated file will contain all the configurations stored in ``.env``. If you want to rely only on environment variables, generate one without any values using: .. code-block:: terminal - $ composer dump-env prod --empty + $ php bin/console dotenv:dump prod --empty C) Install/Update your Vendors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 679be09e566e61f8287f00648c10722d650b9838 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 13 Jul 2023 17:54:47 +0200 Subject: [PATCH 088/670] Tweaks --- configuration.rst | 11 +++++++---- deployment.rst | 9 ++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/configuration.rst b/configuration.rst index f439e6ade5e..bdbbc69ec12 100644 --- a/configuration.rst +++ b/configuration.rst @@ -827,24 +827,27 @@ the easiest way to define env vars is by creating a ``.env.local`` file on your production server(s) with your production values. To improve performance, you can optionally run the ``dotenv:dump`` command (available -in :ref:`Symfony Flex ` 1.2 or later). The command is not registered by default. -In order to enable it, you must add it to their services.yaml file: +in :ref:`Symfony Flex ` 1.2 or later). The command is not registered +by default, so you must register first in your services: .. code-block:: yaml + # config/services.yaml services: Symfony\Component\Dotenv\Command\DotenvDumpCommand: - '%kernel.project_dir%/.env' - '%kernel.environment%' -On PHP >= 8, the two arguments can be removed when autoconfiguration is enabled (which is the default): +In PHP >= 8, you can remove the the two arguments when autoconfiguration is enabled +(which is the default): .. code-block:: yaml + # config/services.yaml services: Symfony\Component\Dotenv\Command\DotenvDumpCommand: ~ -Running command: +Then, run the command: .. code-block:: terminal diff --git a/deployment.rst b/deployment.rst index 702996f0f91..2c755158faa 100644 --- a/deployment.rst +++ b/deployment.rst @@ -154,14 +154,17 @@ most natural in your hosting environment. .. code-block:: terminal - $ php bin/console dotenv:dump prod + $ composer dump-env prod - The generated file will contain all the configurations stored in ``.env``. If you + The generated file will contain all the configuration stored in ``.env``. If you want to rely only on environment variables, generate one without any values using: .. code-block:: terminal - $ php bin/console dotenv:dump prod --empty + $ composer dump-env prod --empty + + If you don't have Composer installed on the production server, use instead + :ref:`the dotenv:dump Symfony command `. C) Install/Update your Vendors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From de9cd62177e5d61cf27eac95756a5f661d4596a6 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Sat, 15 Jul 2023 15:07:17 +0200 Subject: [PATCH 089/670] fix typo --- configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration.rst b/configuration.rst index bdbbc69ec12..85a7a23db35 100644 --- a/configuration.rst +++ b/configuration.rst @@ -838,7 +838,7 @@ by default, so you must register first in your services: - '%kernel.project_dir%/.env' - '%kernel.environment%' -In PHP >= 8, you can remove the the two arguments when autoconfiguration is enabled +In PHP >= 8, you can remove the two arguments when autoconfiguration is enabled (which is the default): .. code-block:: yaml From 2653b56da6362370feae7a0fe7f6d80a453e98f4 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Fri, 14 Jul 2023 21:59:48 +0200 Subject: [PATCH 090/670] [Validator] Add `EnableAutoMapping` and `DisableAutoMapping` constraints --- reference/configuration/doctrine.rst | 2 + reference/constraints.rst | 2 + reference/constraints/DisableAutoMapping.rst | 119 +++++++++++++++++++ reference/constraints/EnableAutoMapping.rst | 119 +++++++++++++++++++ reference/constraints/map.rst.inc | 2 + 5 files changed, 244 insertions(+) create mode 100644 reference/constraints/DisableAutoMapping.rst create mode 100644 reference/constraints/EnableAutoMapping.rst diff --git a/reference/configuration/doctrine.rst b/reference/configuration/doctrine.rst index d2dec43171b..c49122575a0 100644 --- a/reference/configuration/doctrine.rst +++ b/reference/configuration/doctrine.rst @@ -299,6 +299,8 @@ This option is ``false`` by default and it's considered a legacy option. It was only useful in previous Symfony versions, when it was recommended to use bundles to organize the application code. +.. _doctrine_auto-mapping: + Custom Mapping Entities in a Bundle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/reference/constraints.rst b/reference/constraints.rst index aa9829b535a..aa341d95883 100644 --- a/reference/constraints.rst +++ b/reference/constraints.rst @@ -78,6 +78,8 @@ Validation Constraints Reference constraints/Traverse constraints/CssColor constraints/Cascade + constraints/EnableAutoMapping + constraints/DisableAutoMapping The Validator is designed to validate objects against *constraints*. In real life, a constraint could be: "The cake must not be burned". In diff --git a/reference/constraints/DisableAutoMapping.rst b/reference/constraints/DisableAutoMapping.rst new file mode 100644 index 00000000000..322df5949e0 --- /dev/null +++ b/reference/constraints/DisableAutoMapping.rst @@ -0,0 +1,119 @@ +DisableAutoMapping +================== + +This constraint allows to disable Doctrine's ``auto_mapping`` on a class or a +property. You can read more about it +:ref:`here `. Automapping allows to determine +validation rules based on Doctrine's annotations and attributes. You may +use this constraint when automapping is globally enabled, but you still want to +disable this feature for a class or a property specifically. + +========== =================================================================== +Applies to :ref:`property or method ` +Class :class:`Symfony\\Component\\Validator\\Constraints\\DisableAutoMapping` +========== =================================================================== + +Basic Usage +----------- + +In the following example, the +:class:`Symfony\\Component\\Validator\\Constraints\\DisableAutoMapping` +constraint will tell the validator to not gather constraints from Doctrine's +metadata: + +.. configuration-block:: + + .. code-block:: php-annotations + + // src/Model/BookCollection.php + namespace App\Model; + + use App\Model\Author; + use App\Model\BookMetadata; + use Doctrine\ORM\Mapping as ORM; + use Symfony\Component\Validator\Constraints as Assert; + + /** + * @Assert\DisableAutoMapping + */ + class BookCollection + { + /** + * @ORM\Column(nullable=false) + */ + protected $name = ''; + + /** + * @ORM\ManyToOne(targetEntity=Author::class) + */ + public Author $author; + + // ... + } + + .. code-block:: php-attributes + + // src/Model/BookCollection.php + namespace App\Model; + + use App\Model\Author; + use App\Model\BookMetadata; + use Doctrine\ORM\Mapping as ORM; + use Symfony\Component\Validator\Constraints as Assert; + + #[Assert\DisableAutoMapping] + class BookCollection + { + #[ORM\Column(nullable: false)] + protected string $name = ''; + + #[ORM\ManyToOne(targetEntity: Author::class)] + public Author $author; + + // ... + } + + .. code-block:: yaml + + # config/validator/validation.yaml + App\Entity\BookCollection: + constraints: + - DisableAutoMapping: ~ + + .. code-block:: xml + + + + + + + + + + + .. code-block:: php + + // src/Entity/BookCollection.php + namespace App\Entity; + + use Symfony\Component\Validator\Constraints as Assert; + use Symfony\Component\Validator\Mapping\ClassMetadata; + + class BookCollection + { + // ... + + public static function loadValidatorMetadata(ClassMetadata $metadata) + { + $metadata->addConstraint(new Assert\DisableAutoMapping()); + } + } + +Options +------- + +The ``groups`` option is not available for this constraint. + +.. include:: /reference/constraints/_payload-option.rst.inc diff --git a/reference/constraints/EnableAutoMapping.rst b/reference/constraints/EnableAutoMapping.rst new file mode 100644 index 00000000000..77a544ac5cb --- /dev/null +++ b/reference/constraints/EnableAutoMapping.rst @@ -0,0 +1,119 @@ +EnableAutoMapping +================= + +This constraint allows to enable Doctrine's ``auto_mapping`` on a class or a +property. You can read more about it +:ref:`here `. Automapping allows to determine +validation rules based on Doctrine's annotations and attributes. You may +use this constraint when automapping is globally disabled, but you still want +to enable this feature for a class or a property specifically. + +========== =================================================================== +Applies to :ref:`property or method ` +Class :class:`Symfony\\Component\\Validator\\Constraints\\EnableAutoMapping` +========== =================================================================== + +Basic Usage +----------- + +In the following example, the +:class:`Symfony\\Component\\Validator\\Constraints\\EnableAutoMapping` +constraint will tell the validator to gather constraints from Doctrine's +metadata: + +.. configuration-block:: + + .. code-block:: php-annotations + + // src/Model/BookCollection.php + namespace App\Model; + + use App\Model\Author; + use App\Model\BookMetadata; + use Doctrine\ORM\Mapping as ORM; + use Symfony\Component\Validator\Constraints as Assert; + + /** + * @Assert\EnableAutoMapping + */ + class BookCollection + { + /** + * @ORM\Column(nullable=false) + */ + protected $name = ''; + + /** + * @ORM\ManyToOne(targetEntity=Author::class) + */ + public Author $author; + + // ... + } + + .. code-block:: php-attributes + + // src/Model/BookCollection.php + namespace App\Model; + + use App\Model\Author; + use App\Model\BookMetadata; + use Doctrine\ORM\Mapping as ORM; + use Symfony\Component\Validator\Constraints as Assert; + + #[Assert\EnableAutoMapping] + class BookCollection + { + #[ORM\Column(nullable: false)] + protected string $name = ''; + + #[ORM\ManyToOne(targetEntity: Author::class)] + public Author $author; + + // ... + } + + .. code-block:: yaml + + # config/validator/validation.yaml + App\Entity\BookCollection: + constraints: + - EnableAutoMapping: ~ + + .. code-block:: xml + + + + + + + + + + + .. code-block:: php + + // src/Entity/BookCollection.php + namespace App\Entity; + + use Symfony\Component\Validator\Constraints as Assert; + use Symfony\Component\Validator\Mapping\ClassMetadata; + + class BookCollection + { + // ... + + public static function loadValidatorMetadata(ClassMetadata $metadata) + { + $metadata->addConstraint(new Assert\EnableAutoMapping()); + } + } + +Options +------- + +The ``groups`` option is not available for this constraint. + +.. include:: /reference/constraints/_payload-option.rst.inc diff --git a/reference/constraints/map.rst.inc b/reference/constraints/map.rst.inc index a0c1324dd1e..1d56346b096 100644 --- a/reference/constraints/map.rst.inc +++ b/reference/constraints/map.rst.inc @@ -101,3 +101,5 @@ Other Constraints * :doc:`Collection ` * :doc:`Count ` * :doc:`UniqueEntity ` +* :doc:`EnableAutoMapping ` +* :doc:`DisableAutoMapping ` From 3f53254a8c0f2c564bf146c99983c705d85f65dc Mon Sep 17 00:00:00 2001 From: jmsche Date: Sun, 16 Jul 2023 21:36:04 +0200 Subject: [PATCH 091/670] Fix typo --- console/input.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/input.rst b/console/input.rst index db1e1fcb2b8..6a242185034 100644 --- a/console/input.rst +++ b/console/input.rst @@ -375,7 +375,7 @@ Testing the Completion script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Console component comes with a special -:class:`Symfony\\Component\\Console\\Tester\\CommandCompletionTester`` class +:class:`Symfony\\Component\\Console\\Tester\\CommandCompletionTester` class to help you unit test the completion logic:: // ... From b61cb59368082ac7a69c979e118abefee6143a05 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 13 Jul 2023 21:16:19 +0200 Subject: [PATCH 092/670] [Format] Add `tabs` directive --- contributing/documentation/format.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/contributing/documentation/format.rst b/contributing/documentation/format.rst index 8df3fb45610..a357a2c7da7 100644 --- a/contributing/documentation/format.rst +++ b/contributing/documentation/format.rst @@ -124,6 +124,31 @@ Markup Format Use It to Display ``php-standalone`` PHP code to be used in any PHP application using standalone Symfony components =================== ============================================================================== +Display Tabs +~~~~~~~~~~~~ + +It is possible to display tabs in the documentation. Even though their display +looks like configuration blocks, tabs can contain any type of content: + +.. code-block:: rst + + .. tabs:: UX Installation + + .. tab:: Webpack Encore + + Introduction to Webpack + + .. code-block:: yaml + + webpack: + # ... + + .. tab:: AssetMapper + + Introduction to AssetMapper + + Something else about AssetMapper + Adding Links ~~~~~~~~~~~~ From 0b3b3af10ea765ec233a02b28f1a8a4444923e81 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 17 Jul 2023 09:20:38 +0200 Subject: [PATCH 093/670] Minor tweak --- contributing/documentation/format.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contributing/documentation/format.rst b/contributing/documentation/format.rst index a357a2c7da7..33798d48da3 100644 --- a/contributing/documentation/format.rst +++ b/contributing/documentation/format.rst @@ -124,11 +124,11 @@ Markup Format Use It to Display ``php-standalone`` PHP code to be used in any PHP application using standalone Symfony components =================== ============================================================================== -Display Tabs -~~~~~~~~~~~~ +Displaying Tabs +~~~~~~~~~~~~~~~ -It is possible to display tabs in the documentation. Even though their display -looks like configuration blocks, tabs can contain any type of content: +It is possible to display tabs in the documentation. They look similar to +configuration blocks when rendered, but tabs can hold any type of content: .. code-block:: rst From ffb2cc1ffdc3a87a4ff5ac937584512528d9b691 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 17 Jul 2023 10:00:13 +0200 Subject: [PATCH 094/670] Tweaks --- reference/constraints/DisableAutoMapping.rst | 11 +++++------ reference/constraints/EnableAutoMapping.rst | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/reference/constraints/DisableAutoMapping.rst b/reference/constraints/DisableAutoMapping.rst index 322df5949e0..463d47f5b4d 100644 --- a/reference/constraints/DisableAutoMapping.rst +++ b/reference/constraints/DisableAutoMapping.rst @@ -1,12 +1,11 @@ DisableAutoMapping ================== -This constraint allows to disable Doctrine's ``auto_mapping`` on a class or a -property. You can read more about it -:ref:`here `. Automapping allows to determine -validation rules based on Doctrine's annotations and attributes. You may -use this constraint when automapping is globally enabled, but you still want to -disable this feature for a class or a property specifically. +This constraint allows to disable :ref:`Doctrine's auto mapping ` +on a class or a property. Automapping allows to determine validation rules based +on Doctrine's annotations and attributes. You may use this constraint when +automapping is globally enabled, but you still want to disable this feature for +a class or a property specifically. ========== =================================================================== Applies to :ref:`property or method ` diff --git a/reference/constraints/EnableAutoMapping.rst b/reference/constraints/EnableAutoMapping.rst index 77a544ac5cb..4ea5fd74f6d 100644 --- a/reference/constraints/EnableAutoMapping.rst +++ b/reference/constraints/EnableAutoMapping.rst @@ -1,12 +1,11 @@ EnableAutoMapping ================= -This constraint allows to enable Doctrine's ``auto_mapping`` on a class or a -property. You can read more about it -:ref:`here `. Automapping allows to determine -validation rules based on Doctrine's annotations and attributes. You may -use this constraint when automapping is globally disabled, but you still want -to enable this feature for a class or a property specifically. +This constraint allows to enable :ref:`Doctrine's auto mapping ` +on a class or a property. Automapping allows to determine validation rules based +on Doctrine's annotations and attributes. You may use this constraint when +automapping is globally disabled, but you still want to enable this feature for +a class or a property specifically. ========== =================================================================== Applies to :ref:`property or method ` From 603f6aa734f95d302034bb4e037a765e43acf698 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 18 Jul 2023 17:20:53 +0200 Subject: [PATCH 095/670] [Console] Add `ProgressIndicator` page --- components/console/helpers/progressbar.rst | 6 + .../console/helpers/progressindicator.rst | 126 ++++++++++++++++++ console.rst | 1 + 3 files changed, 133 insertions(+) create mode 100644 components/console/helpers/progressindicator.rst diff --git a/components/console/helpers/progressbar.rst b/components/console/helpers/progressbar.rst index fb3f2acfe7b..3e43452a737 100644 --- a/components/console/helpers/progressbar.rst +++ b/components/console/helpers/progressbar.rst @@ -81,6 +81,12 @@ The progress will then be displayed as a throbber: 1/3 [=========>------------------] 33% 3/3 [============================] 100% +.. tip:: + + An alternative to this is to use a + :doc:`/components/console/helpers/progressindicator` instead of a + progress bar. + Whenever your task is finished, don't forget to call :method:`Symfony\\Component\\Console\\Helper\\ProgressBar::finish` to ensure that the progress bar display is refreshed with a 100% completion. diff --git a/components/console/helpers/progressindicator.rst b/components/console/helpers/progressindicator.rst new file mode 100644 index 00000000000..9cd82b0aed1 --- /dev/null +++ b/components/console/helpers/progressindicator.rst @@ -0,0 +1,126 @@ +Progress Indicator +================== + +When executing longer-running commands without knowing if the the processing +is nearly done or not, it may be helpful to show that something is actually +happening and that updates as your command runs. + +To do so, use the +:class:`Symfony\\Component\\Console\\Helper\\ProgressIndicator` and advance the +progress as the command executes:: + + use Symfony\Component\Console\Helper\ProgressIndicator; + + // creates a new progress indicator + $progressIndicator = new ProgressIndicator($output); + + // starts and displays the progress indicator with a custom message + $progressIndicator->start('Processing...'); + + $i = 0; + while ($i++ < 50) { + // ... do some work + + // advances the progress indicator + $progressIndicator->advance(); + } + + // ensures that the progress indicator shows a final message + $progressIndicator->finish('Finished'); + +Customizing the Progress Indicator +---------------------------------- + +Built-in Formats +~~~~~~~~~~~~~~~~ + +By default, the information rendered on a progress indicator depends on the current +level of verbosity of the ``OutputInterface`` instance: + +.. code-block:: text + + # OutputInterface::VERBOSITY_NORMAL (CLI with no verbosity flag) + \ Processing... + | Processing... + / Processing... + - Processing... + + # OutputInterface::VERBOSITY_VERBOSE (-v) + \ Processing... (1 sec) + | Processing... (1 sec) + / Processing... (1 sec) + - Processing... (1 sec) + + # OutputInterface::VERBOSITY_VERY_VERBOSE (-vv) and OutputInterface::VERBOSITY_DEBUG (-vvv) + \ Processing... (1 sec, 6.0 MiB) + | Processing... (1 sec, 6.0 MiB) + / Processing... (1 sec, 6.0 MiB) + - Processing... (1 sec, 6.0 MiB) + +.. note:: + + If you call a command with the quiet flag (``-q``), the progress indicator won't + be displayed. + +Instead of relying on the verbosity mode of the current command, you can also +force a format via the second argument of the ``ProgressIndicator`` +constructor:: + + $progressIndicator = new ProgressIndicator($output, 'verbose'); + +The built-in formats are the following: + +* ``normal`` +* ``verbose`` +* ``very_verbose`` + +If your terminal doesn't support ANSI, use the ``no_ansi`` variants: + +* ``normal_no_ansi`` +* ``verbose_no_ansi`` +* ``very_verbose_no_ansi`` + +Custom Indicator Values +~~~~~~~~~~~~~~~~~~~~~~~ + +Instead of using the built-in indicator values, you can also set your own:: + + $progressIndicator = new ProgressIndicator($output, 'verbose', 100, ['⠏', '⠛', '⠹', '⢸', '⣰', '⣤', '⣆', '⡇']); + +The progress indicator will now look like this: + +.. code-block:: text + + ⠏ Processing... + ⠛ Processing... + ⠹ Processing... + ⢸ Processing... + +Customize Placeholders +~~~~~~~~~~~~~~~~~~~~~~ + +A progress indicator uses placeholders (a name enclosed with the ``%`` +character) to determine the output format. Here is a list of the +built-in placeholders: + +* ``indicator``: The current indicator; +* ``elapsed``: The time elapsed since the start of the progress indicator; +* ``memory``: The current memory usage; +* ``message``: used to display arbitrary messages in the progress indicator. + +If you want to customize a placeholder, for example the ``message`` one, here +is how you should do this:: + + ProgressIndicator::setPlaceholderFormatterDefinition( + 'message', + static function (ProgressIndicator $progressIndicator): string { + // Return any arbitrary string + return 'My custom message'; + } + ); + +.. note:: + + Placeholders customization is applied globally, which means that any + progress indicator displayed after the + ``setPlaceholderFormatterDefinition()`` call will be affected. diff --git a/console.rst b/console.rst index 04c53fddae9..4078bfc221d 100644 --- a/console.rst +++ b/console.rst @@ -587,6 +587,7 @@ tools capable of helping you with different tasks: * :doc:`/components/console/helpers/questionhelper`: interactively ask the user for information * :doc:`/components/console/helpers/formatterhelper`: customize the output colorization * :doc:`/components/console/helpers/progressbar`: shows a progress bar +* :doc:`/components/console/helpers/progressindicator`: shows a progress indicator * :doc:`/components/console/helpers/table`: displays tabular data as a table * :doc:`/components/console/helpers/debug_formatter`: provides functions to output debug information when running an external program From aeee3056b4ce0efd133cfff6038c3c7060b1733e Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Thu, 20 Jul 2023 10:28:59 +0200 Subject: [PATCH 096/670] [Form] Improve form type methods explanation --- form/create_custom_field_type.rst | 41 +++++++++++++++++-------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/form/create_custom_field_type.rst b/form/create_custom_field_type.rst index 2ae299fbd18..cfd8a872a0d 100644 --- a/form/create_custom_field_type.rst +++ b/form/create_custom_field_type.rst @@ -116,25 +116,6 @@ These are the most important methods that a form type class can define: .. _form-type-methods-explanation: -``buildForm()`` - It adds and configures other types into this type. It's the same method used - when :ref:`creating Symfony form classes `. - -``buildView()`` - It sets any extra variables you'll need when rendering the field in a template. - -``finishView()`` - This method allows to modify the "view" of any rendered widget. This is useful - if your form type consists of many fields, or contains a type that produces - many HTML elements (e.g. ``ChoiceType``). For any other use case, it's - recommended to use ``buildView()`` instead. - -``configureOptions()`` - It defines the options configurable when using the form type, which are also - the options that can be used in ``buildForm()`` and ``buildView()`` - methods. Options are inherited from parent types and parent type - extensions, but you can create any custom option you need. - ``getParent()`` If your custom type is based on another type (i.e. they share some functionality), add this method to return the fully-qualified class name @@ -149,6 +130,28 @@ These are the most important methods that a form type class can define: :class:`Symfony\\Component\\Form\\Extension\\Core\\Type\\FormType` type, which is the root parent for all form types in the Form component. +``configureOptions()`` + It defines the options configurable when using the form type, which are also + the options that can be used in the following methods. Options are inherited + from parent types and parent type extensions, but you can create any custom + option you need. + +``buildForm()`` + It configures the current form and may add nested fields. It's the same + method used when + :ref:`creating Symfony form classes `. + +``buildView()`` + It sets any extra variables you'll need when rendering the field in a form + theme template. + +``finishView()`` + Same as ``buildView()``. This is useful only if your form type consists of + many fields (i.e. A ``ChoiceType`` composed of many radio or checkboxes), + as this method will allow accessing child views with + ``$view['child_name']``. For any other use case, it's recommended to use + ``buildView()`` instead. + Defining the Form Type ~~~~~~~~~~~~~~~~~~~~~~ From f041d70e925bf86355b92eaa1dde60f4e8478885 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Thu, 20 Jul 2023 11:19:20 +0200 Subject: [PATCH 097/670] [Form] Fix form data related events definition --- form/events.rst | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/form/events.rst b/form/events.rst index 092be472012..37c3918d67d 100644 --- a/form/events.rst +++ b/form/events.rst @@ -48,10 +48,12 @@ A) The ``FormEvents::PRE_SET_DATA`` Event ......................................... The ``FormEvents::PRE_SET_DATA`` event is dispatched at the beginning of the -``Form::setData()`` method. It can be used to: - -* Modify the data given during pre-population; -* Modify a form depending on the pre-populated data (adding or removing fields dynamically). +``Form::setData()`` method. It is used to modify the data given during +pre-population with +:method:`FormEvent::setData() `. +The method :method:`Form::setData() ` +is locked since the event is dispatched from it and will throw an exception +if called from a listener. =============== ======== Data Type Value @@ -66,13 +68,6 @@ View data ``null`` See all form events at a glance in the :ref:`Form Events Information Table `. -.. caution:: - - During ``FormEvents::PRE_SET_DATA``, - :method:`Form::setData() ` - is locked and will throw an exception if used. If you wish to modify - data, you should use - :method:`FormEvent::setData() ` instead. .. sidebar:: ``FormEvents::PRE_SET_DATA`` in the Form component @@ -88,8 +83,8 @@ B) The ``FormEvents::POST_SET_DATA`` Event The ``FormEvents::POST_SET_DATA`` event is dispatched at the end of the :method:`Form::setData() ` -method. This event is mostly here for reading data after having pre-populated -the form. +method. This event can be used to modify a form depending on the populated data +(adding or removing fields dynamically). =============== ==================================================== Data Type Value From 57bf70792c08f559aa2a54deaa65fa0e1fc43499 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 20 Jul 2023 11:36:42 +0200 Subject: [PATCH 098/670] Minor tweaks --- .../console/helpers/progressindicator.rst | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/components/console/helpers/progressindicator.rst b/components/console/helpers/progressindicator.rst index 9cd82b0aed1..d64ec6367b7 100644 --- a/components/console/helpers/progressindicator.rst +++ b/components/console/helpers/progressindicator.rst @@ -1,13 +1,13 @@ Progress Indicator ================== -When executing longer-running commands without knowing if the the processing -is nearly done or not, it may be helpful to show that something is actually -happening and that updates as your command runs. +Progress indicators are useful to let users know that a command isn't stalled. +Unlike :doc:`progress bars `, these +indicators are used when the command duration is indeterminate (e.g. long-running +commands, unquantifiable tasks, etc.) -To do so, use the -:class:`Symfony\\Component\\Console\\Helper\\ProgressIndicator` and advance the -progress as the command executes:: +They work by instantiating the :class:`Symfony\\Component\\Console\\Helper\\ProgressIndicator` +class and advancing the progress as the command executes:: use Symfony\Component\Console\Helper\ProgressIndicator; @@ -57,10 +57,9 @@ level of verbosity of the ``OutputInterface`` instance: / Processing... (1 sec, 6.0 MiB) - Processing... (1 sec, 6.0 MiB) -.. note:: +.. tip:: - If you call a command with the quiet flag (``-q``), the progress indicator won't - be displayed. + Call a command with the quiet flag (``-q``) to not display any progress indicator. Instead of relying on the verbosity mode of the current command, you can also force a format via the second argument of the ``ProgressIndicator`` @@ -108,8 +107,7 @@ built-in placeholders: * ``memory``: The current memory usage; * ``message``: used to display arbitrary messages in the progress indicator. -If you want to customize a placeholder, for example the ``message`` one, here -is how you should do this:: +For example, this is how you can customize the ``message`` placeholder:: ProgressIndicator::setPlaceholderFormatterDefinition( 'message', From 887f6f504f28e05a3b70770d35057a3e5aa6f4e4 Mon Sep 17 00:00:00 2001 From: PululuK Date: Mon, 17 Jul 2023 12:46:19 +0200 Subject: [PATCH 099/670] add `OptionsResolverIntrospector`usage doc --- components/options_resolver.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/components/options_resolver.rst b/components/options_resolver.rst index 3e7c657b79f..9c9ce53e524 100644 --- a/components/options_resolver.rst +++ b/components/options_resolver.rst @@ -944,3 +944,24 @@ method ``clearOptionsConfig()`` and call it periodically:: That's it! You now have all the tools and knowledge needed to process options in your code. + +Get More Insights +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The `OptionsResolverIntrospector` inspect options definitions inside an `OptionsResolver` instance. + +method:: + + use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; + use Symfony\Component\OptionsResolver\OptionsResolver; + + $resolver = new OptionsResolver(); + $resolver->setDefaults([ + 'host' => 'smtp.example.org', + 'port' => 25, + ]); + + $introspector = new OptionsResolverIntrospector($resolver); + $introspector->getDefault('host'); // Retrieves "smtp.example.org" + + From ad6e24af52c2e26ee4d192216354527fd6bf294c Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 20 Jul 2023 13:02:09 +0200 Subject: [PATCH 100/670] Minor tweaks --- components/options_resolver.rst | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/components/options_resolver.rst b/components/options_resolver.rst index 9c9ce53e524..89864774d8f 100644 --- a/components/options_resolver.rst +++ b/components/options_resolver.rst @@ -945,12 +945,11 @@ method ``clearOptionsConfig()`` and call it periodically:: That's it! You now have all the tools and knowledge needed to process options in your code. -Get More Insights -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Getting More Insights +~~~~~~~~~~~~~~~~~~~~~ -The `OptionsResolverIntrospector` inspect options definitions inside an `OptionsResolver` instance. - -method:: +Use the ``OptionsResolverIntrospector`` to inspect the options definitions +inside an ``OptionsResolver`` instance:: use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -963,5 +962,3 @@ method:: $introspector = new OptionsResolverIntrospector($resolver); $introspector->getDefault('host'); // Retrieves "smtp.example.org" - - From 847c1a00a76eb414091474ea1632789b16ef5df6 Mon Sep 17 00:00:00 2001 From: Julien Gidel Date: Mon, 17 Jul 2023 23:07:09 +0200 Subject: [PATCH 101/670] Update definition.rst --- components/config/definition.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/config/definition.rst b/components/config/definition.rst index eaae06c4450..1779f6ae3db 100644 --- a/components/config/definition.rst +++ b/components/config/definition.rst @@ -870,3 +870,9 @@ Otherwise the result is a clean array of configuration values:: $databaseConfiguration, $configs ); + +.. caution:: + + When processing the configuration tree, the processor assumes the top level + array key is already stripped off. If you want a root name, you should + add it to your tree builder as an array node. From 53acc819a55d25650f0348ceddb05d816eb034b6 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 20 Jul 2023 13:26:13 +0200 Subject: [PATCH 102/670] Minor tweak --- components/config/definition.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/config/definition.rst b/components/config/definition.rst index 1779f6ae3db..437c93322d6 100644 --- a/components/config/definition.rst +++ b/components/config/definition.rst @@ -873,6 +873,5 @@ Otherwise the result is a clean array of configuration values:: .. caution:: - When processing the configuration tree, the processor assumes the top level - array key is already stripped off. If you want a root name, you should - add it to your tree builder as an array node. + When processing the configuration tree, the processor assumes that the top + level array key (which matches the extension name) is already stripped off. From 0b3ff045de8c4f23af3c396e8700925d16678933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lud=C4=9Bk=20Uiberlay?= Date: Fri, 7 Jul 2023 22:02:36 +0200 Subject: [PATCH 103/670] [Encore] Webpack Dev Server: live reload & HMR --- frontend/encore/dev-server.rst | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/frontend/encore/dev-server.rst b/frontend/encore/dev-server.rst index 6fcdaee6fd6..4feecb3deec 100644 --- a/frontend/encore/dev-server.rst +++ b/frontend/encore/dev-server.rst @@ -128,6 +128,34 @@ your page. HMR works automatically with CSS (as long as you're using the ``dev-server`` and Encore 1.0 or higher) but only works with some JavaScript (like :doc:`Vue.js `). +Live Reloading when changing PHP / Twig Files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To utilize the HMR superpower along with live reload for your PHP code and +templates, set the following options: + + +.. code-block:: javascript + + // webpack.config.js + // ... + + Encore + // ... + + .configureDevServerOptions(options => { + options.liveReload = true; + options.static = { + watch: false + }; + options.watchFiles = { + paths: ['src/**/*.php', 'templates/**/*'], + }; + }) + +The ``static.watch`` option is required to disable the default reloading of +files from the static directory, as those files are already handled by HMR. + .. versionadded:: 1.0.0 Before Encore 1.0, you needed to pass a ``--hot`` flag at the command line From 92529650875153b330b0f61db2c4ba0b015ddf8d Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Fri, 21 Jul 2023 09:28:53 +0200 Subject: [PATCH 104/670] [OptionsResolver] Fix indentation --- components/options_resolver.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/options_resolver.rst b/components/options_resolver.rst index 89864774d8f..5f9cd2659a9 100644 --- a/components/options_resolver.rst +++ b/components/options_resolver.rst @@ -951,8 +951,8 @@ Getting More Insights Use the ``OptionsResolverIntrospector`` to inspect the options definitions inside an ``OptionsResolver`` instance:: - use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; - use Symfony\Component\OptionsResolver\OptionsResolver; + use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; + use Symfony\Component\OptionsResolver\OptionsResolver; $resolver = new OptionsResolver(); $resolver->setDefaults([ From bb15e8945480f2122f7589af2e0f48a3c93f8c07 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Fri, 21 Jul 2023 11:41:47 +0200 Subject: [PATCH 105/670] [Form] Improve form validation section --- forms.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/forms.rst b/forms.rst index 68feeb0af1d..aefaffbea5c 100644 --- a/forms.rst +++ b/forms.rst @@ -461,7 +461,8 @@ Before using validation, add support for it in your application: $ composer require symfony/validator Validation is done by adding a set of rules, called (validation) constraints, -to a class. You can add them either to the entity class or to the form class. +to a class. You can add them either to the entity class or by using the +:ref:`constraints option ` of form types. To see the first approach - adding constraints to the entity - in action, add the validation constraints, so that the ``task`` field cannot be empty, @@ -567,9 +568,9 @@ object. That's it! If you re-submit the form with invalid data, you'll see the corresponding errors printed out with the form. -To see the second approach - adding constraints to the form - and to -learn more about the validation constraints, please refer to the -:doc:`Symfony validation documentation `. +To see the second approach - adding constraints to the form - please refer to +this :ref:`section `. +Both approaches can be used together. Form Validation Messages ~~~~~~~~~~~~~~~~~~~~~~~~ From 92e1dbfa2139df8bc897194bfb9c4abbf4fd6c47 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 21 Jul 2023 12:22:03 +0200 Subject: [PATCH 106/670] Minor tweak --- forms.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forms.rst b/forms.rst index aefaffbea5c..b3dd9e207a0 100644 --- a/forms.rst +++ b/forms.rst @@ -568,9 +568,8 @@ object. That's it! If you re-submit the form with invalid data, you'll see the corresponding errors printed out with the form. -To see the second approach - adding constraints to the form - please refer to -this :ref:`section `. -Both approaches can be used together. +To see the second approach - adding constraints to the form - refer to +:ref:`this section `. Both approaches can be used together. Form Validation Messages ~~~~~~~~~~~~~~~~~~~~~~~~ From dba67946c6194ef19a3f36e5cca1f7ad75357925 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 24 Jul 2023 09:05:32 +0200 Subject: [PATCH 107/670] Backport #18598 to 5.4 --- configuration/micro_kernel_trait.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/micro_kernel_trait.rst b/configuration/micro_kernel_trait.rst index 185d301a657..8a8d8795bb2 100644 --- a/configuration/micro_kernel_trait.rst +++ b/configuration/micro_kernel_trait.rst @@ -124,7 +124,7 @@ events directly from the kernel, again it will be registered automatically:: public function onKernelException(ExceptionEvent $event): void { - if ($event->getException() instanceof Danger) { + if ($event->getThrowable() instanceof Danger) { $event->setResponse(new Response('It\'s dangerous to go alone. Take this ⚔')); } } From 9168b9da6279bb0ab166cc14f654d67185664670 Mon Sep 17 00:00:00 2001 From: iraouf Date: Mon, 24 Jul 2023 22:03:10 +0100 Subject: [PATCH 108/670] [micro_kernel] Fix deleted method AnnotationRegistry::registerLoader [Dropping AnnotationRegistry completely, relying on native autoloading instead](https://github.com/doctrine/annotations/pull/205) --- configuration/micro_kernel_trait.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/configuration/micro_kernel_trait.rst b/configuration/micro_kernel_trait.rst index 8a8d8795bb2..5940b918183 100644 --- a/configuration/micro_kernel_trait.rst +++ b/configuration/micro_kernel_trait.rst @@ -328,12 +328,9 @@ Finally, you need a front controller to boot and run the application. Create a // public/index.php use App\Kernel; - use Doctrine\Common\Annotations\AnnotationRegistry; use Symfony\Component\HttpFoundation\Request; - $loader = require __DIR__.'/../vendor/autoload.php'; - // auto-load annotations - AnnotationRegistry::registerLoader([$loader, 'loadClass']); + require __DIR__.'/../vendor/autoload.php'; $kernel = new Kernel('dev', true); $request = Request::createFromGlobals(); From 1ee41e8b868f344edd9992043596e0ca2fdbac82 Mon Sep 17 00:00:00 2001 From: jmsche Date: Mon, 24 Jul 2023 09:58:48 +0200 Subject: [PATCH 109/670] [Translation] Add docs for pseudolocalization translator --- .../pseudolocalization-interface-original.png | Bin 0 -> 5051 bytes ...seudolocalization-interface-translated.png | Bin 0 -> 5739 bytes ...eudolocalization-symfony-demo-disabled.png | Bin 0 -> 66509 bytes ...seudolocalization-symfony-demo-enabled.png | Bin 0 -> 80487 bytes translation.rst | 134 +++++++++++++++++- 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 _images/translation/pseudolocalization-interface-original.png create mode 100644 _images/translation/pseudolocalization-interface-translated.png create mode 100644 _images/translation/pseudolocalization-symfony-demo-disabled.png create mode 100644 _images/translation/pseudolocalization-symfony-demo-enabled.png diff --git a/_images/translation/pseudolocalization-interface-original.png b/_images/translation/pseudolocalization-interface-original.png new file mode 100644 index 0000000000000000000000000000000000000000..d89f4e63a241a47a58581e109063c451c8ad15c7 GIT binary patch literal 5051 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 literal 0 HcmV?d00001 diff --git a/_images/translation/pseudolocalization-interface-translated.png b/_images/translation/pseudolocalization-interface-translated.png new file mode 100644 index 0000000000000000000000000000000000000000..496d5a0f86f10cf308d2889fa67d46167e4d7c58 GIT binary patch literal 5739 zcmb7|bx_pbzs7+j1O!AtIs{Y@m3CQJX{15AyZlNiDY>Y0HwXwyNiQMNEF~RM(yT~G z=MtNr%XfZv?%aRwA9tQJC;mBe<~7ebXWmcD3msJ&DmE%2A|e`fHD!GwA`oyr_q%c3 z5w*z%QxFl|5mQ%IFnmkAKcf@|GGkF$V{ma>`tJTet<7HR--R5Qm&8w~fjiY0aJr`ANSGh!~XGam3I>knnrHjv=euhfKYr?5`7 z)aEGuy_JLBcHVhAZ~7%*&BI^nDfnLd-H9`f?Sd*27eUmPnTr+u4oq_opf60M5ewGc z(rW^gZp(*8@F9J%NTqivkJ`&sqIc^EO-7Rq7CNf7b@w@`ED}Dcfm?bH^Nx^b!`m?b z>&@M5mHrWJHg{&-1E{kx_|(|9k#oJ>VqXA~aiZ(1bq#f|LO$B30q<`}=L34euF1=6G zkrPCF>Jv(*kOg39ZBPv`Co6SJjeYRq%(2$FvRLj;nA65h8E>caqkvAB6{*NTUdRB~qHcOPQN)%k~#GH1r>!Z&+LkuRF4=YE?fM zo{ZC)DotKIt5HqLXFWBVB)~yii$@o6-$}UAYlxj?k8#f)M4?>j>|AQ92+t-ikqDWh z%sr#-9MbQhPquAb?h7t9>z)vNS++n2IxiOzjq(Wo(1@Qy53fQzV($m5PZAobi~N!$ z+R0Qtjxe!b6WRWk$X0m(1CjWO*rVwV8!G4dqO;0cSV*(m>!5KV@;|KRU%@p}-l=pm zjX}faE2TyAC^uRUqtIT_nI|^Z_|J zKzH^35&`sosNmyeQ{}G5wjC1Mm7}&K3H^Gx8gztz_3sdJpOIcErZ8QlkIaYI36hB{ z;B~c<4{!AMsTP{bRGT*CseKej`S_M-c(`M}xcKj22|?>zrwIrUB8m4J!*(27(6J91(j>kNCr4rSWe}SXQa*iE<)ft0>ArR(MamPSMjf98#5+aZt72JWW>GP_#+T-1DQgL zzMEy^7eUA+uKWej5O`~ChOM`jrpjqy05{)I)f<}Yq5K@w3D68~@IonYmcFrJR%iG* zMThem`g~jFK*_v=GKkb1yZucL zTxxh?UTx6RmV0!b%u(NlN^;%rUJwm*zYJu2Toxs18SOaDV9KcfsjGZ`mt&d`v>(Es zQIq3*WVq3o^nuq|QnYQ`sAKt{LDmoz;xh|9*VC-}GB)v3Kdzp{64rtU`ZRq_E5_Ei z7Nh67PGkffqj9J_1b!vd#|1}+gz-lHv~h7@eDmZF?K{9}O8BQOuRca>hg~-r!Mhn+ z&5s`@4Zvb&iV!S%5x_f;&ABQR{UMbfUmwIu(5+I4Iz;f%$h$FrjP$0L&w;fNOsdIz z+_}t%`00F=dJR6TYzXjvd*4`BUnUnoBtLIp_FOE+p17Mx7|lOpf6-hd4W zs~%191NP)3JL)KUZ80)VH$^?lajlFHU2@tALYyl$HOyB9et{sP2N@9PoJpc#T~;py zr*{{=q;^|1yKAWc$4LS-sln8B zp!#)bkSRHo6}}(tUqJu{2}^QMjJ#1Y2u$9YT#2&LmFHDXL4XCCcIW-sL~&Er1=629 zMHa8U7_}@vK8rzh8wrH>`MJQdw0W3U=6c`zY0h4n{O2);i1N=34@Xg2 zR|p2CnpfE$Vp%U${r?pHH)#4dyZ^{OY`oCzXpXK9wu@zF(TYA13y+U5V??qABrg)g z7CrmcGLMlroEIu#u^UOU>K`(8Ua~Gdma}pPWRi!%Al;M#_BZgpPoIm9t1N#xmV1tQ zP_Lqo4mic~3!#(rzwE-EwwP(y$Do=VD^XTC$7YT{FT#UWscbMvfcNg4PKP=^Bvd;2 z^O%2TRbO4n)Z|cMlV|p$KF-yd9#)9Ciia{CWE$XzDC{KjJN-5J0HgUL%-fOTkvX02 zpw{wV5&>;9JEFw2lkNMLzeD;9Q`#j4VDoAnZuGQiNyJ%isu@`Bc{88D_^BS}0JK%- zX#vecZS&$*Nhz-l&TOOSs{R+`eyM4$YqvyKyPnij)Ir0CPa+~4 zvX}R#h20g4b*a}X))1h{G{;T7rm4R?p7w};Ic_&H$_yI2m4LR0GFXEDq&|K|r8Gj* zu6a1^w>{Yl@3US*(2v%e*o2KZN?wRka_gj8x&s+BEHC>{Lgnd|Ucwt#en>IDiRuBM zJK({0IGofhtcgDac?ko+8bcMp++b5Ni$`kb2^Ilh`FA272Gglq^uR-rCYnHfIv{9) ze6qKm4&+ZSft7im=fXchKlEyrIK0x^;aQ5+w|BI3fIKX#3j_SsiwIJ``5=#trE^f& z4lbV0XtRNckHOg#-nJakO{Rq}L}|4L4-MxUSTI3noZ+9R$yxshx+ln*N(e;48)_fJt~ST2|=A& zi)V=%3A@0#AYf1;7pU4>Nu^tlwdmwUZ)BF>VGmdNJ-YLATFcQ~k46BI-C%)%Pfc6v zY(jdn6F{dR;9jhUe9$Xo{r=H1|B8tAt7q-QFjsB4p}+TiD(Gxl%1`-kMOxQSUtwW+ zhp_L*04-~D_(=12CQ3~-x0(vA#ymOo5T8_CGGKpw!I3W;KWDMlQUR4O)J|!jjH1T8 ze@i0^64zxQ1s}5Q!CxN;^i%c%#>ECMJd1{trV+x?YLbHU&>vZ7_js0(LtSLkUxI@GgK@nQWf)EEX@^A0Wm# z_ts*cT#xb9RU!4m%9PKi5_9@hpm0OMiRsuW=bj>aF#`RzSNiLUC z&E!j1FBRd&iYx&n9Cx{|9b+DKA%Qd>g)I`LzZ7na8C>8xK2e5MSLv#)EWO-(@ z`X9c%7wx+QZ@$-xm#|XqYe4bd^!@_4zcKJ+f`<*NiGTxF5|}mR>JT^?gsbV5+zFrl z#=SJuuWtaS&BXylJ;Dl;pSg*J^Z%YX2){8?GXpHC!5_!;G~`Bm^&Ur{($+iG z0$^tE*AQhe&KSwr6jyRo9EY7<)ZT49L>b^N=4T_58%FYq4p|lx!|A}6oPs5v8su;+ zSY>>+1o(w>cI2=SU%&qB`X0>BAMeUhO9E!`8+6095Vb50zdq>!n8UFBe&tAP&)th0 z-bz=7uS|JbeTf(-$Cqfmkiy~?7MJX#OKAw5kXLyfD|mr4z-0Z2X>cTf<2_{?N!Ix4 z*6I5zzL~3t__63@xMR_z7np3et+*z4F4vFO-^S{P}3nq6iVf-3r$RLrMUaKNQRN}OwC&=u2upG2?_l+X& zLOWM0qgLFaV; zIpn}h!7*VnEHiuC=t|C-BXZkHr(Rn7Im#$9QPz~P;;PX0jOa+!?!bx)NU+UBU@~cv z!8ZI$4ZZY!Jhd2t{~FCMVFK0r{6Fqf!#z+v3i@$*-u|0oc_lCAB0yv?<1=g5+#pm0 zeG1V<_Mr|O0(;?QaH%M!*gA5?C-0uFbosbwAgsThM8-kmNbtR6R9e#Sz2Tg`!a;>D z)83?3q2mf#I|kO{&;BshP3~o9tz8lMrt3BfKw1h1#fj%IiB-*>|OpSd&(^X@&F}$nR-Dn>r=YxVlF2>_5+Sl$vQj*NA zz((95GM_K{Z~2+Uh;$SIcUWJ*h%6s}LFh2L^n}yL4>0bVR67}!R-0Cm{VJ@w>mYO` z4$UWH@#MjAN%Xt6b`v^;WV4p0{D4%5fInr}Yy$5>9I>1Gt%a}w@h}Rn>ZcRz zg`i;*G#m80JsOt{a$8JHn({aGCWWhb{UtWg(X?Fd8{6z!1~4gd!r8na=5OQ2M#X=5 zL^j!sV+%@qFc*%|TD<-1NnuHq?@Gw0enp6kP#Ny(jnjEuF|-g4!545p}Fe zh2+X>@~l2WN0jci72p2!J4&Kkw}|AIfLK$NAGZoVw{g}a29*%Nzn#hfry|O{ExG?+ z!G1-DJ4UEhUF;AKCX&YX9J5-~xi1M;{dZIr1pYo&6Yt(pO_)BSalnRd_P3PCQ9F!w z&cin4SJXp33W@aZXW*GF{jF%vS8BY=J=tz<6&H2GhQRe{^P@nj+=H#uc>wUrPY?9R3);~Xa%J(>+@CRzK0jp%0N5Z6GN0Sd4TKKg~EU||&^Rj1`hYNtuE=H<k>wlvurUkS%Z^gdMu;ehcAeg^+W2E# zb6g_vi~7al*PW2-;9=+;cd;s32g5F9I#(Uwbdy`tQ_+sucXd8fR3`i!mXsKoh#{3V zI$kk|tDNotz0TcxyK0n1QZSLlS>*Y$Qt2d*9b8rlG?kcjk?hd4y8fO^)J$;P357oP zC1J>aOB~FQvl}i6k6&~9VM5~B|HH-2aU`3w2Xj=M^qZEG>IWY`nQzOZkB?Lb-TjPzO{$`?P;>s?1Kzq9xCoYtf)(dKNJC32e|_q4w8 z1B(MbDT_RwWzyn! literal 0 HcmV?d00001 diff --git a/_images/translation/pseudolocalization-symfony-demo-disabled.png b/_images/translation/pseudolocalization-symfony-demo-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7472bd41fac2ffa9897ae9ab33d4c97fa5254d GIT binary patch literal 66509 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 literal 0 HcmV?d00001 diff --git a/_images/translation/pseudolocalization-symfony-demo-enabled.png b/_images/translation/pseudolocalization-symfony-demo-enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a23300a727104a05b4e8c698c7b09a146f12625b GIT binary patch literal 80487 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 + + + + + + + + + + + + title + + + + + + .. code-block:: php + + // config/packages/translation.php + use Symfony\Config\FrameworkConfig; + + return static function (FrameworkConfig $framework) { + // ... + $framework + ->translator() + ->pseudoLocalization() + // replace characters by their accented version + ->accents(true) + // wrap strings with brackets + ->brackets(true) + // controls how many extra characters are added to make text longer + ->expansionFactor(1.4) + // maintain the original HTML tags of the translated contents + ->parseHtml(true) + // also translate the contents of these HTML attributes + ->localizableHtmlAttributes(['title']) + ; + }; + +That's all. The application will now start displaying those strange, but +readable, contents to help you internationalize it. See for example the +difference in the `Symfony Demo`_ application. This is the original page: + +.. image:: /_images/translation/pseudolocalization-symfony-demo-disabled.png + +And this is the same page with pseudolocalization enabled: + +.. image:: /_images/translation/pseudolocalization-symfony-demo-enabled.png + Summary ------- @@ -1322,3 +1452,5 @@ Learn more .. _`Translatable Behavior`: https://github.com/KnpLabs/DoctrineBehaviors .. _`Custom Language Name setting`: https://docs.lokalise.com/en/articles/1400492-uploading-files#custom-language-codes .. _`GitHub Actions`: https://docs.github.com/en/free-pro-team@latest/actions +.. _`pseudolocalization`: https://en.wikipedia.org/wiki/Pseudolocalization +.. _`Symfony Demo`: https://github.com/symfony/demo From 45b56c4511da25d3d9a22e306402f9e111119d5b Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Wed, 26 Jul 2023 11:00:43 +0200 Subject: [PATCH 110/670] [Form] Improve form type guessers section --- form/type_guesser.rst | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/form/type_guesser.rst b/form/type_guesser.rst index f89808d5e08..29c9cea0e21 100644 --- a/form/type_guesser.rst +++ b/form/type_guesser.rst @@ -13,6 +13,17 @@ type guessers. * :class:`Symfony\\Bridge\\Doctrine\\Form\\DoctrineOrmTypeGuesser` provided by the Doctrine bridge. +Guessers are used only in the following cases: + +* Using + :method:`Symfony\\Component\\Form\\FormFactoryInterface::createForProperty` + or + :method:`Symfony\\Component\\Form\\FormFactoryInterface::createBuilderForProperty`; +* Calling :method:`Symfony\\Component\\Form\\FormInterface::add` or + :method:`Symfony\\Component\\Form\\FormBuilderInterface::create` or + :method:`Symfony\\Component\\Form\\FormBuilderInterface::add` without an + explicit type, in a context where the parent form has defined a data class. + Create a PHPDoc Type Guesser ---------------------------- @@ -70,7 +81,7 @@ The ``TypeGuess`` constructor requires three options: * The type name (one of the :doc:`form types `); * Additional options (for instance, when the type is ``entity``, you also - want to set the ``class`` option). If no types are guessed, this should be + want to set the ``class`` option). If no options are guessed, this should be set to an empty array; * The confidence that the guessed type is correct. This can be one of the constants of the :class:`Symfony\\Component\\Form\\Guess\\Guess` class: @@ -162,11 +173,11 @@ set. .. caution:: - You should be very careful using the ``guessPattern()`` method. When the - type is a float, you cannot use it to determine a min or max value of the - float (e.g. you want a float to be greater than ``5``, ``4.512313`` is not valid - but ``length(4.512314) > length(5)`` is, so the pattern will succeed). In - this case, the value should be set to ``null`` with a ``MEDIUM_CONFIDENCE``. + You should be very careful using the ``guessMaxLength()`` method. When the + type is a float, you cannot determine a length (e.g. you want a float to be + less than ``5``, ``5.512313`` is not valid but + ``length(5.512314) > length(5)`` is, so the pattern will succeed). In this + case, the value should be set to ``null`` with a ``MEDIUM_CONFIDENCE``. Registering a Type Guesser -------------------------- From 5190cbbe8d6804b98e653c3ffd98b68334721567 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 27 Jul 2023 10:11:39 +0200 Subject: [PATCH 111/670] [FrameworkBundle] Add note for `prefix_seed` about container compilation --- reference/configuration/framework.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index ebd09140aee..e3b37df3f13 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -3184,6 +3184,12 @@ It's also useful when using `blue/green deployment`_ strategies and more generally, when you need to abstract out the actual deployment directory (for example, when warming caches offline). +.. note:: + + The ``prefix_seed`` option is used at compile time. This means + that any change made to this value after container's compilation + will have no effect. + .. versionadded:: 5.2 Starting from Symfony 5.2, the ``%kernel.container_class%`` parameter is no From e3edb9c2c821de2958d61d7b96eac0cc622e5c82 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 28 Jul 2023 09:53:14 +0200 Subject: [PATCH 112/670] Fix some internal references --- components/cache/cache_pools.rst | 4 ++-- doctrine/multiple_entity_managers.rst | 2 +- http_client.rst | 2 +- reference/configuration/framework.rst | 2 -- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/components/cache/cache_pools.rst b/components/cache/cache_pools.rst index 8d05cd268d5..ac7cf945429 100644 --- a/components/cache/cache_pools.rst +++ b/components/cache/cache_pools.rst @@ -163,7 +163,7 @@ when all items are successfully deleted):: If the cache component is used inside a Symfony application, you can remove items from cache pools using the following commands (which reside within - the :ref:`framework bundle `): + the :doc:`framework bundle `): To remove *one specific item* from the *given pool*: @@ -242,7 +242,7 @@ silently ignored):: If the cache component is used inside a Symfony application, you can prune *all items* from *all pools* using the following command (which resides within - the :ref:`framework bundle `): + the :doc:`framework bundle `): .. code-block:: terminal diff --git a/doctrine/multiple_entity_managers.rst b/doctrine/multiple_entity_managers.rst index 081239bcd9f..34a33b22cac 100644 --- a/doctrine/multiple_entity_managers.rst +++ b/doctrine/multiple_entity_managers.rst @@ -222,7 +222,7 @@ the default entity manager (i.e. ``default``) is returned:: } Entity managers also benefit from :ref:`autowiring aliases ` -when the :ref:`framework bundle ` is used. For +when the :doc:`framework bundle ` is used. For example, to inject the ``customer`` entity manager, type-hint your method with ``EntityManagerInterface $customerEntityManager``. diff --git a/http_client.rst b/http_client.rst index d63648b40cb..399199f0557 100644 --- a/http_client.rst +++ b/http_client.rst @@ -1396,7 +1396,7 @@ The component is interoperable with four different abstractions for HTTP clients: `Symfony Contracts`_, `PSR-18`_, `HTTPlug`_ v1/v2 and native PHP streams. If your application uses libraries that need any of them, the component is compatible with all of them. They also benefit from :ref:`autowiring aliases ` -when the :ref:`framework bundle ` is used. +when the :doc:`framework bundle ` is used. If you are writing or maintaining a library that makes HTTP requests, you can decouple it from any specific HTTP client implementations by coding against diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index e3b37df3f13..824e30d9f63 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -1,5 +1,3 @@ -.. _framework-bundle-configuration: - Framework Configuration Reference (FrameworkBundle) =================================================== From 01255340c950b96c4b35ae0cf4b83154b8580def Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Fri, 28 Jul 2023 11:49:12 +0200 Subject: [PATCH 113/670] fix syntax --- logging/handlers.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logging/handlers.rst b/logging/handlers.rst index 14a3a36518c..8e70b6a0861 100644 --- a/logging/handlers.rst +++ b/logging/handlers.rst @@ -73,14 +73,14 @@ To use it, declare it as a service: // optionally, configure the handler using the constructor arguments (shown values are default) $container->register(ElasticsearchLogstashHandler::class) - ->setArguments( + ->setArguments([ '$endpoint' => "http://127.0.0.1:9200", '$index' => "monolog", '$client' => null, '$level' => Logger::DEBUG, '$bubble' => true, '$elasticsearchVersion' => '1.0.0', - ) + ]) ; .. versionadded:: 5.4 From 783610c7b8c7fa641e19bb2433f4deea59df1540 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Sat, 29 Jul 2023 21:58:18 +0200 Subject: [PATCH 114/670] [DependencuInjection] Document abstract arguments --- service_container.rst | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/service_container.rst b/service_container.rst index 5c33d16e069..a4abf4ce2f7 100644 --- a/service_container.rst +++ b/service_container.rst @@ -840,6 +840,72 @@ argument for *any* service defined in this file! You can bind arguments by name The ``bind`` config can also be applied to specific services or when loading many services at once (i.e. :ref:`service-psr4-loader`). +Abstract service arguments +-------------------------- + +Sometimes, when defining services in your Symfony applications, there are arguments +that can't be added in config files. The reason is that their values can only be +calculated at runtime in a :doc:`compiler pass ` +or :doc:`bundle extension `. + +If value is not replaced a ``RuntimeException`` would be thrown. + +.. configuration-block:: + + .. code-block:: yaml + + # config/services.yaml + services: + # ... + + App\Service\MyService: + arguments: + $rootNamespace: !abstract 'should be defined by Pass' + + # ... + + .. code-block:: xml + + + + + + + + should be defined by Pass + + + + + + + .. code-block:: php + + // config/services.php + namespace Symfony\Component\DependencyInjection\Loader\Configurator; + + use App\Service\MyService; + use Psr\Log\LoggerInterface; + use Symfony\Component\DependencyInjection\Definition; + use Symfony\Component\DependencyInjection\Reference; + + return function(ContainerConfigurator $container) { + $services = $container->services(); + + $services->set(MyService::class) + ->arg('$rootNamespace', abstract_arg('should be defined by Pass')) + ; + + // ... + }; + +In this case, if you don't replace the value, ``RuntimeException`` will be thrown +with message ``Argument "$rootNamespace" of service "App\Service\MyService" is +abstract: should be defined by Pass.`` + .. _services-autowire: The autowire Option From 546fc2f7b4e72f379e46bff52604aad7d355bc4d Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Sat, 29 Jul 2023 22:14:24 +0200 Subject: [PATCH 115/670] Remove some unused use --- components/event_dispatcher.rst | 2 -- configuration.rst | 4 +--- frontend/custom_version_strategy.rst | 1 - service_container.rst | 3 --- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/components/event_dispatcher.rst b/components/event_dispatcher.rst index 1e281c084b0..cc4367f8723 100644 --- a/components/event_dispatcher.rst +++ b/components/event_dispatcher.rst @@ -182,7 +182,6 @@ determine which instance is passed. use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; - use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventDispatcher; @@ -213,7 +212,6 @@ determine which instance is passed. use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; - use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\EventDispatcher\DependencyInjection\AddEventAliasesPass; use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventDispatcher; diff --git a/configuration.rst b/configuration.rst index 85a7a23db35..f201fab29fb 100644 --- a/configuration.rst +++ b/configuration.rst @@ -846,7 +846,7 @@ In PHP >= 8, you can remove the two arguments when autoconfiguration is enabled # config/services.yaml services: Symfony\Component\Dotenv\Command\DotenvDumpCommand: ~ - + Then, run the command: .. code-block:: terminal @@ -1064,8 +1064,6 @@ whenever a service/controller defines a ``$projectDir`` argument, use this: // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - use App\Controller\LuckyController; - return static function (ContainerConfigurator $container) { $container->services() ->defaults() diff --git a/frontend/custom_version_strategy.rst b/frontend/custom_version_strategy.rst index ae64738e2df..04a2d45f245 100644 --- a/frontend/custom_version_strategy.rst +++ b/frontend/custom_version_strategy.rst @@ -139,7 +139,6 @@ After creating the strategy PHP class, register it as a Symfony service. namespace Symfony\Component\DependencyInjection\Loader\Configurator; use App\Asset\VersionStrategy\GulpBusterVersionStrategy; - use Symfony\Component\DependencyInjection\Definition; return function(ContainerConfigurator $container) { $services = $container->services(); diff --git a/service_container.rst b/service_container.rst index 5c33d16e069..3f55a05d643 100644 --- a/service_container.rst +++ b/service_container.rst @@ -803,10 +803,7 @@ You can also use the ``bind`` keyword to bind specific arguments by name or type // config/services.php namespace Symfony\Component\DependencyInjection\Loader\Configurator; - use App\Controller\LuckyController; use Psr\Log\LoggerInterface; - use Symfony\Component\DependencyInjection\Definition; - use Symfony\Component\DependencyInjection\Reference; return function(ContainerConfigurator $container) { $services = $container->services() From 5a532a22ab1b9c48205909bc6aaad7bf729dbbb4 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 31 Jul 2023 15:10:04 +0200 Subject: [PATCH 116/670] Backport a fix related to Webpack Encore --- frontend/encore/simple-example.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/encore/simple-example.rst b/frontend/encore/simple-example.rst index 2e5043c5f83..2d46a392293 100644 --- a/frontend/encore/simple-example.rst +++ b/frontend/encore/simple-example.rst @@ -430,7 +430,7 @@ Encore. When you do, you'll see an error! .. code-block:: terminal > Error: Install sass-loader & sass to use enableSassLoader() - > yarn add sass-loader@^12.0.0 sass --dev + > yarn add sass-loader@^13.0.0 sass --dev Encore supports many features. But, instead of forcing all of them on you, when you need a feature, Encore will tell you what you need to install. Run: @@ -438,11 +438,11 @@ you need a feature, Encore will tell you what you need to install. Run: .. code-block:: terminal # if you use the Yarn package manager - $ yarn add sass-loader@^12.0.0 sass --dev + $ yarn add sass-loader@^13.0.0 sass --dev $ yarn encore dev --watch # if you use the npm package manager - $ npm install sass-loader@^12.0.0 sass --save-dev + $ npm install sass-loader@^13.0.0 sass --save-dev $ npm run watch Your app now supports Sass. Encore also supports LESS and Stylus. See From 3916d229469150757f6b93df1dee470cd2f3b08c Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Mon, 31 Jul 2023 20:24:21 +0200 Subject: [PATCH 117/670] Use Doctor RST 1.48.0 --- .doctor-rst.yaml | 18 ++++-------------- .github/workflows/ci.yaml | 2 +- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/.doctor-rst.yaml b/.doctor-rst.yaml index 73cb75d09e6..29ef1e4506e 100644 --- a/.doctor-rst.yaml +++ b/.doctor-rst.yaml @@ -77,6 +77,10 @@ rules: deprecated_directive_min_version: min_version: '5.0' +exclude_rule_for_file: + - path: configuration/multiple_kernels.rst + rule_name: replacement + # do not report as violation whitelist: regex: @@ -102,17 +106,3 @@ whitelist: - '// bin/console' - '.. _`a feature to test applications using Mercure`: https://github.com/symfony/panther#creating-isolated-browsers-to-test-apps-using-mercure-or-websocket' - '.. End to End Tests (E2E)' - - 'First, create a new ``apps`` directory at the root of your project, which will' # configuration/multiple_kernels.rst - - '├─ apps/' # configuration/multiple_kernels.rst - - '``apps/`` directory. Therefore, you should carefully consider what is' # configuration/multiple_kernels.rst - - 'Since the new ``apps/api/src/`` directory will host the PHP code related to the' # configuration/multiple_kernels.rst - - '"Api\\": "apps/api/src/"' # configuration/multiple_kernels.rst - - "return $this->getProjectDir().'/apps/'.$this->id.'/config';" # configuration/multiple_kernels.rst - - '``apps/`` as it is used in the Kernel to load the specific application' # configuration/multiple_kernels.rst - - '``apps/admin/templates/`` which you will need to manually configure under the' # configuration/multiple_kernels.rst - - '# apps/admin/config/packages/twig.yaml' # configuration/multiple_kernels.rst - - "'%kernel.project_dir%/apps/admin/templates': Admin" # configuration/multiple_kernels.rst - - '// apps/api/tests/ApiTestCase.php' # configuration/multiple_kernels.rst - - 'Now, create a ``tests/`` directory inside the ``apps/api/`` application. Then,' # configuration/multiple_kernels.rst - - '"Api\\Tests\\": "apps/api/tests/"' # configuration/multiple_kernels.rst - - 'apps/api/tests' # configuration/multiple_kernels.rst diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index af90b9308a3..4bed1d4dd23 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.47.2 + uses: docker://oskarstark/doctor-rst:1.48.0 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache From a8803e2315135b53c19b2767fcf829ce87ded4fd Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Sat, 29 Jul 2023 23:15:42 +0200 Subject: [PATCH 118/670] [DependencyInjection] Update kernel.reset explanation --- reference/dic_tags.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference/dic_tags.rst b/reference/dic_tags.rst index 64cac27255e..5b035d6f89b 100644 --- a/reference/dic_tags.rst +++ b/reference/dic_tags.rst @@ -711,10 +711,10 @@ kernel.reset **Purpose**: Clean up services between requests -During the ``kernel.terminate`` event, Symfony looks for any service tagged -with the ``kernel.reset`` tag to reinitialize their state. This is done by -calling to the method whose name is configured in the ``method`` argument of -the tag. +In all main requests (not :ref:`sub-requests `) except +the first one, Symfony looks for any service tagged with the ``kernel.reset`` tag +to reinitialize their state. This is done by calling to the method whose name is +configured in the ``method`` argument of the tag. This is mostly useful when running your projects in application servers that reuse the Symfony application between requests to improve performance. This tag From 49a33c62de0c3448608d3ae731ce1c7c24c41d01 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 1 Aug 2023 14:58:12 +0200 Subject: [PATCH 119/670] Removing self-closing slash from --- components/dom_crawler.rst | 12 ++++++------ components/form.rst | 2 +- form/form_customization.rst | 2 +- form/form_themes.rst | 2 +- reference/constraints/File.rst | 2 +- reference/forms/types/email.rst | 2 +- reference/forms/types/range.rst | 2 +- reference/forms/types/search.rst | 2 +- security.rst | 6 +++--- security/csrf.rst | 2 +- security/form_login.rst | 14 +++++++------- security/remember_me.rst | 2 +- 12 files changed, 25 insertions(+), 25 deletions(-) diff --git a/components/dom_crawler.rst b/components/dom_crawler.rst index db91554f026..b8c484ab114 100644 --- a/components/dom_crawler.rst +++ b/components/dom_crawler.rst @@ -535,12 +535,12 @@ To work with multi-dimensional fields: .. code-block:: html - - - - - - + + + + + + Pass an array of values:: diff --git a/components/form.rst b/components/form.rst index 2f7b874d7bf..78a8b652773 100644 --- a/components/form.rst +++ b/components/form.rst @@ -507,7 +507,7 @@ done by passing a special form "view" object to your template (notice the {{ form_start(form) }} {{ form_widget(form) }} - + {{ form_end(form) }} .. image:: /_images/form/simple-form.png diff --git a/form/form_customization.rst b/form/form_customization.rst index 87be104c7f1..26ec9e38c7f 100644 --- a/form/form_customization.rst +++ b/form/form_customization.rst @@ -117,7 +117,7 @@ fields, so you no longer have to deal with form themes: value="{{ field_value(form.username) }}" placeholder="{{ field_label(form.username) }}" class="form-control" - /> + > + Symfony uses a Twig block called ``integer_widget`` to render that field. This is because the field type is ``integer`` and you're rendering its ``widget`` (as diff --git a/reference/constraints/File.rst b/reference/constraints/File.rst index 65841a1e26c..ad36a42abb8 100644 --- a/reference/constraints/File.rst +++ b/reference/constraints/File.rst @@ -245,7 +245,7 @@ You can find a list of existing mime types on the `IANA website`_. When using this constraint on a :doc:`FileType field `, the value of the ``mimeTypes`` option is also used in the ``accept`` - attribute of the related ```` HTML element. + attribute of the related ```` HTML element. This behavior is applied only when using :ref:`form type guessing ` (i.e. the form type is not defined explicitly in the ``->add()`` method of diff --git a/reference/forms/types/email.rst b/reference/forms/types/email.rst index 9a5f06c2a9e..90752042409 100644 --- a/reference/forms/types/email.rst +++ b/reference/forms/types/email.rst @@ -2,7 +2,7 @@ EmailType Field =============== The ``EmailType`` field is a text field that is rendered using the HTML5 -```` tag. +```` tag. +---------------------------+---------------------------------------------------------------------+ | Rendered as | ``input`` ``email`` field (a text box) | diff --git a/reference/forms/types/range.rst b/reference/forms/types/range.rst index 9da6407f881..95e4bcff64c 100644 --- a/reference/forms/types/range.rst +++ b/reference/forms/types/range.rst @@ -2,7 +2,7 @@ RangeType Field =============== The ``RangeType`` field is a slider that is rendered using the HTML5 -```` tag. +```` tag. +---------------------------+---------------------------------------------------------------------+ | Rendered as | ``input`` ``range`` field (slider in HTML5 supported browser) | diff --git a/reference/forms/types/search.rst b/reference/forms/types/search.rst index 8eeefb053d5..d99b8fefc0a 100644 --- a/reference/forms/types/search.rst +++ b/reference/forms/types/search.rst @@ -1,7 +1,7 @@ SearchType Field ================ -This renders an ```` field, which is a text box with +This renders an ```` field, which is a text box with special functionality supported by some browsers. Read about the input search field at `DiveIntoHTML5.info`_ diff --git a/security.rst b/security.rst index b629cc7cfc3..5b38acb53ea 100644 --- a/security.rst +++ b/security.rst @@ -794,13 +794,13 @@ Finally, create or update the template:
- + - + {# If you want to control the URL the user is redirected to on success - #} + #}
diff --git a/security/csrf.rst b/security/csrf.rst index a03cfc59c00..fd89ff17ba9 100644 --- a/security/csrf.rst +++ b/security/csrf.rst @@ -141,7 +141,7 @@ generate a CSRF token in the template and store it as a hidden form field:
{# the argument of csrf_token() is an arbitrary string used to generate the token #} - +
diff --git a/security/form_login.rst b/security/form_login.rst index ec8f4a1d373..a285f26fcf9 100644 --- a/security/form_login.rst +++ b/security/form_login.rst @@ -157,8 +157,8 @@ Defining the redirect URL via POST using a hidden form field:
{# ... #} - - + +
Using the Referring URL @@ -301,8 +301,8 @@ This option can also be set via the ``_failure_path`` request parameter:
{# ... #} - - + +
Customizing the Target and Failure Request Parameters @@ -380,7 +380,7 @@ are now fully customized:
{# ... #} - - - + + +
diff --git a/security/remember_me.rst b/security/remember_me.rst index 1d69cc9a555..19b6cb44a7b 100644 --- a/security/remember_me.rst +++ b/security/remember_me.rst @@ -124,7 +124,7 @@ checkbox must have a name of ``_remember_me``: {# ... your form fields #} From 4e908413aee2b989414c02756523b0fbddfbe55c Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Tue, 1 Aug 2023 19:26:27 +0200 Subject: [PATCH 120/670] Use Doctor RST 1.48.1 --- .doctor-rst.yaml | 1 - .github/workflows/ci.yaml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.doctor-rst.yaml b/.doctor-rst.yaml index 29ef1e4506e..35125df61d6 100644 --- a/.doctor-rst.yaml +++ b/.doctor-rst.yaml @@ -103,6 +103,5 @@ whitelist: - '.. versionadded:: 0.2' # MercureBundle - '.. versionadded:: 3.6' # MonologBundle - '.. versionadded:: 3.8' # MonologBundle - - '// bin/console' - '.. _`a feature to test applications using Mercure`: https://github.com/symfony/panther#creating-isolated-browsers-to-test-apps-using-mercure-or-websocket' - '.. End to End Tests (E2E)' diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4bed1d4dd23..482c55d7237 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.48.0 + uses: docker://oskarstark/doctor-rst:1.48.1 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache From 7f314f5f47557c6a94a8a621016fd7494e32740c Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 2 Aug 2023 09:27:25 +0200 Subject: [PATCH 121/670] Reword --- service_container.rst | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/service_container.rst b/service_container.rst index 047be2518e7..5065effb976 100644 --- a/service_container.rst +++ b/service_container.rst @@ -837,15 +837,16 @@ argument for *any* service defined in this file! You can bind arguments by name The ``bind`` config can also be applied to specific services or when loading many services at once (i.e. :ref:`service-psr4-loader`). -Abstract service arguments +Abstract Service Arguments -------------------------- -Sometimes, when defining services in your Symfony applications, there are arguments -that can't be added in config files. The reason is that their values can only be -calculated at runtime in a :doc:`compiler pass ` +Sometimes, the values of some service arguments can't be defined in the +configuration files because they are calculated at runtime using a +:doc:`compiler pass ` or :doc:`bundle extension `. -If value is not replaced a ``RuntimeException`` would be thrown. +In those cases, you can use the ``abstract`` argument type to define at least +the name of the argument and some short description about its purpose: .. configuration-block:: @@ -899,9 +900,13 @@ If value is not replaced a ``RuntimeException`` would be thrown. // ... }; -In this case, if you don't replace the value, ``RuntimeException`` will be thrown -with message ``Argument "$rootNamespace" of service "App\Service\MyService" is -abstract: should be defined by Pass.`` +If you don't replace the value of an abstract argument during runtime, a +``RuntimeException`` will be thrown with a message like +``Argument "$rootNamespace" of service "App\Service\MyService" is abstract: should be defined by Pass.`` + +.. versionadded:: 5.1 + + The abstract service arguments were introduced in Symfony 5.1. .. _services-autowire: From 035af33a75685f21e785818ff3c447de71c6417d Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 15 Nov 2021 12:10:41 +0100 Subject: [PATCH 122/670] modernize the web server configuration chapter --- setup/web_server_configuration.rst | 355 +++++++---------------------- 1 file changed, 82 insertions(+), 273 deletions(-) diff --git a/setup/web_server_configuration.rst b/setup/web_server_configuration.rst index f5f259413b5..7090572379a 100644 --- a/setup/web_server_configuration.rst +++ b/setup/web_server_configuration.rst @@ -5,17 +5,12 @@ The preferred way to develop your Symfony application is to use :doc:`Symfony Local Web Server `. However, when running the application in the production environment, you'll need -to use a fully-featured web server. This article describes several ways to use -Symfony with Apache or Nginx. +to use a fully-featured web server. This article describes how to use Symfony +with Apache or Nginx. -When using Apache, you can configure PHP as an -:ref:`Apache module ` or with FastCGI using -:ref:`PHP FPM `. FastCGI also is the preferred way -to use PHP :ref:`with Nginx `. +.. sidebar:: The public directory -.. sidebar:: The ``public/`` directory - - The ``public/`` directory is the home of all of your application's public and + The public directory is the home of all of your application's public and static files, including images, stylesheets and JavaScript files. It is also where the front controller (``index.php``) lives. @@ -27,7 +22,83 @@ to use PHP :ref:`with Nginx `. another location (e.g. ``public_html/``) make sure you :ref:`override the location of the public/ directory `. -.. _web-server-nginx: +Apache with PHP-FPM +------------------- + +To make use of PHP-FPM with Apache, you first have to ensure that you have +the FastCGI process manager ``php-fpm`` binary and Apache's FastCGI module +installed (for example, on a Debian based system you have to install the +``libapache2-mod-fastcgi`` and ``php7.4-fpm`` packages). + +PHP-FPM uses so-called *pools* to handle incoming FastCGI requests. You can +configure an arbitrary number of pools in the FPM configuration. In a pool +you configure either a TCP socket (IP and port) or a Unix domain socket to +listen on. Each pool can also be run under a different UID and GID: + +.. code-block:: ini + + ; a pool called www + [www] + user = www-data + group = www-data + + ; use a unix domain socket + listen = /var/run/php/php7.4-fpm.sock + + ; or listen on a TCP socket + listen = 127.0.0.1:9000 + +Using mod_proxy_fcgi with Apache 2.4 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you are running Apache 2.4, you can use ``mod_proxy_fcgi`` to pass incoming +requests to PHP-FPM. Configure PHP-FPM to listen on a TCP or Unix socket, enable +``mod_proxy`` and ``mod_proxy_fcgi`` in your Apache configuration, and use the +``SetHandler`` directive to pass requests for PHP files to PHP FPM: + +.. code-block:: apache + + + ServerName domain.tld + ServerAlias www.domain.tld + + # Uncomment the following line to force Apache to pass the Authorization + # header to PHP: required for "basic_auth" under PHP-FPM and FastCGI + # + # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 + + # For Apache 2.4.9 or higher + # Using SetHandler avoids issues with using ProxyPassMatch in combination + # with mod_rewrite or mod_autoindex + + SetHandler proxy:fcgi://127.0.0.1:9000 + # for Unix sockets, Apache 2.4.10 or higher + # SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy + + + # If you use Apache version below 2.4.9 you must consider update or use this instead + # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 + + # If you run your Symfony application on a subpath of your document root, the + # regular expression must be changed accordingly: + # ProxyPassMatch ^/path-to-app/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 + + DocumentRoot /var/www/project/public + + AllowOverride None + Require all granted + FallbackResource /index.php + + + # uncomment the following lines if you install assets as symlinks + # or run into problems when compiling LESS/Sass/CoffeeScript assets + # + # Options FollowSymlinks + # + + ErrorLog /var/log/apache2/project_error.log + CustomLog /var/log/apache2/project_access.log combined + Nginx ----- @@ -53,7 +124,7 @@ The **minimum configuration** to get your application running under Nginx is: # } location ~ ^/index\.php(/|$) { - fastcgi_pass unix:/var/run/php/php-fpm.sock; + fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; @@ -115,268 +186,6 @@ The **minimum configuration** to get your application running under Nginx is: For advanced Nginx configuration options, read the official `Nginx documentation`_. -.. _web-server-apache-mod-php: - -Adding Rewrite Rules for Apache -------------------------------- - -The easiest way is to install the ``apache`` :ref:`Symfony pack ` -by executing the following command: - -.. code-block:: terminal - - $ composer require symfony/apache-pack - -This pack installs a ``.htaccess`` file in the ``public/`` directory that contains -the rewrite rules needed to serve the Symfony application. - -In production servers, you should move the ``.htaccess`` rules into the main -Apache configuration file to improve performance. To do so, copy the -``.htaccess`` contents inside the ```` configuration associated to -the Symfony application ``public/`` directory (and replace ``AllowOverride All`` -by ``AllowOverride None``): - -.. code-block:: apache - - - # ... - DocumentRoot /var/www/project/public - - - AllowOverride None - - # Copy .htaccess contents here - - - -Apache with mod_php/PHP-CGI ---------------------------- - -The **minimum configuration** to get your application running under Apache is: - -.. code-block:: apache - - - ServerName domain.tld - ServerAlias www.domain.tld - - DocumentRoot /var/www/project/public - - AllowOverride All - Order Allow,Deny - Allow from All - - - # uncomment the following lines if you install assets as symlinks - # or run into problems when compiling LESS/Sass/CoffeeScript assets - # - # Options FollowSymlinks - # - - ErrorLog /var/log/apache2/project_error.log - CustomLog /var/log/apache2/project_access.log combined - - -.. tip:: - - If your system supports the ``APACHE_LOG_DIR`` variable, you may want - to use ``${APACHE_LOG_DIR}/`` instead of hardcoding ``/var/log/apache2/``. - -Use the following **optimized configuration** to disable ``.htaccess`` support -and increase web server performance: - -.. code-block:: apache - - - ServerName domain.tld - ServerAlias www.domain.tld - - DocumentRoot /var/www/project/public - DirectoryIndex /index.php - - - AllowOverride None - Order Allow,Deny - Allow from All - - FallbackResource /index.php - - - # uncomment the following lines if you install assets as symlinks - # or run into problems when compiling LESS/Sass/CoffeeScript assets - # - # Options FollowSymlinks - # - - # optionally disable the fallback resource for the asset directories - # which will allow Apache to return a 404 error when files are - # not found instead of passing the request to Symfony - - DirectoryIndex disabled - FallbackResource disabled - - ErrorLog /var/log/apache2/project_error.log - CustomLog /var/log/apache2/project_access.log combined - - # optionally set the value of the environment variables used in the application - #SetEnv APP_ENV prod - #SetEnv APP_SECRET - #SetEnv DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name" - - -.. caution:: - - Use ``FallbackResource`` on Apache 2.4.25 or higher, due to a bug which was - fixed on that release causing the root ``/`` to hang. - -.. tip:: - - If you are using **php-cgi**, Apache does not pass HTTP basic username and - password to PHP by default. To work around this limitation, you should use - the following configuration snippet: - - .. code-block:: apache - - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - -Using mod_php/PHP-CGI with Apache 2.4 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In Apache 2.4, ``Order Allow,Deny`` has been replaced by ``Require all granted``. -Hence, you need to modify your ``Directory`` permission settings as follows: - -.. code-block:: apache - - - Require all granted - # ... - - -For advanced Apache configuration options, read the official `Apache documentation`_. - -.. _web-server-apache-fpm: - -Apache with PHP-FPM -------------------- - -To make use of PHP-FPM with Apache, you first have to ensure that you have -the FastCGI process manager ``php-fpm`` binary and Apache's FastCGI module -installed (for example, on a Debian based system you have to install the -``libapache2-mod-fastcgi`` and ``php-fpm`` packages). - -PHP-FPM uses so-called *pools* to handle incoming FastCGI requests. You can -configure an arbitrary number of pools in the FPM configuration. In a pool -you configure either a TCP socket (IP and port) or a Unix domain socket to -listen on. Each pool can also be run under a different UID and GID: - -.. code-block:: ini - - ; a pool called www - [www] - user = www-data - group = www-data - - ; use a unix domain socket - listen = /var/run/php/php-fpm.sock - - ; or listen on a TCP socket - listen = 127.0.0.1:9000 - -Using mod_proxy_fcgi with Apache 2.4 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you are running Apache 2.4, you can use ``mod_proxy_fcgi`` to pass incoming -requests to PHP-FPM. Configure PHP-FPM to listen on a TCP or Unix socket, enable -``mod_proxy`` and ``mod_proxy_fcgi`` in your Apache configuration, and use the -``SetHandler`` directive to pass requests for PHP files to PHP FPM: - -.. code-block:: apache - - - ServerName domain.tld - ServerAlias www.domain.tld - - # Uncomment the following line to force Apache to pass the Authorization - # header to PHP: required for "basic_auth" under PHP-FPM and FastCGI - # - # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 - - # For Apache 2.4.9 or higher - # Using SetHandler avoids issues with using ProxyPassMatch in combination - # with mod_rewrite or mod_autoindex - - SetHandler proxy:fcgi://127.0.0.1:9000 - # for Unix sockets, Apache 2.4.10 or higher - # SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy - - - # If you use Apache version below 2.4.9 you must consider update or use this instead - # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 - - # If you run your Symfony application on a subpath of your document root, the - # regular expression must be changed accordingly: - # ProxyPassMatch ^/path-to-app/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 - - DocumentRoot /var/www/project/public - - # enable the .htaccess rewrites - AllowOverride All - Require all granted - - - # uncomment the following lines if you install assets as symlinks - # or run into problems when compiling LESS/Sass/CoffeeScript assets - # - # Options FollowSymlinks - # - - ErrorLog /var/log/apache2/project_error.log - CustomLog /var/log/apache2/project_access.log combined - - -PHP-FPM with Apache 2.2 -~~~~~~~~~~~~~~~~~~~~~~~ - -On Apache 2.2 or lower, you cannot use ``mod_proxy_fcgi``. You have to use -the `FastCgiExternalServer`_ directive instead. Therefore, your Apache configuration -should look something like this: - -.. code-block:: apache - - - ServerName domain.tld - ServerAlias www.domain.tld - - AddHandler php7-fcgi .php - Action php7-fcgi /php7-fcgi - Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi - FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -host 127.0.0.1:9000 -pass-header Authorization - - DocumentRoot /var/www/project/public - - # enable the .htaccess rewrites - AllowOverride All - Order Allow,Deny - Allow from all - - - # uncomment the following lines if you install assets as symlinks - # or run into problems when compiling LESS/Sass/CoffeeScript assets - # - # Options FollowSymlinks - # - - ErrorLog /var/log/apache2/project_error.log - CustomLog /var/log/apache2/project_access.log combined - - -If you prefer to use a Unix socket, you have to use the ``-socket`` option -instead: - -.. code-block:: apache - - FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php-fpm.sock -pass-header Authorization - .. _`Apache documentation`: https://httpd.apache.org/docs/ .. _`FastCgiExternalServer`: https://docs.oracle.com/cd/B31017_01/web.1013/q20204/mod_fastcgi.html#FastCgiExternalServer .. _`Nginx documentation`: https://www.nginx.com/resources/wiki/start/topics/recipes/symfony/ From 33ea1fa13bd986c5021b8dbada9cb1af3ea1211b Mon Sep 17 00:00:00 2001 From: Wouter de Jong Date: Tue, 20 Dec 2022 22:55:59 +0100 Subject: [PATCH 123/670] Clean-up Apache and Nginx parts --- setup/web_server_configuration.rst | 109 +++++++++++++++++++---------- 1 file changed, 72 insertions(+), 37 deletions(-) diff --git a/setup/web_server_configuration.rst b/setup/web_server_configuration.rst index 7090572379a..1682c8a58de 100644 --- a/setup/web_server_configuration.rst +++ b/setup/web_server_configuration.rst @@ -22,13 +22,12 @@ with Apache or Nginx. another location (e.g. ``public_html/``) make sure you :ref:`override the location of the public/ directory `. -Apache with PHP-FPM +Configuring PHP-FPM ------------------- -To make use of PHP-FPM with Apache, you first have to ensure that you have -the FastCGI process manager ``php-fpm`` binary and Apache's FastCGI module -installed (for example, on a Debian based system you have to install the -``libapache2-mod-fastcgi`` and ``php7.4-fpm`` packages). +All configuration examples below use the PHP FastCGI process manager +(PHP-FPM). Ensure that you have installed PHP-FPM (for example, on a Debian +based system you have to install the ``php-fpm`` package). PHP-FPM uses so-called *pools* to handle incoming FastCGI requests. You can configure an arbitrary number of pools in the FPM configuration. In a pool @@ -37,6 +36,8 @@ listen on. Each pool can also be run under a different UID and GID: .. code-block:: ini + ; /etc/php/7.4/fpm/pool.d/www.conf + ; a pool called www [www] user = www-data @@ -45,43 +46,37 @@ listen on. Each pool can also be run under a different UID and GID: ; use a unix domain socket listen = /var/run/php/php7.4-fpm.sock - ; or listen on a TCP socket - listen = 127.0.0.1:9000 + ; or listen on a TCP connection + ; listen = 127.0.0.1:9000 -Using mod_proxy_fcgi with Apache 2.4 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Apache +------ -If you are running Apache 2.4, you can use ``mod_proxy_fcgi`` to pass incoming -requests to PHP-FPM. Configure PHP-FPM to listen on a TCP or Unix socket, enable -``mod_proxy`` and ``mod_proxy_fcgi`` in your Apache configuration, and use the -``SetHandler`` directive to pass requests for PHP files to PHP FPM: +If you are running Apache 2.4+, you can use ``mod_proxy_fcgi`` to pass +incoming requests to PHP-FPM. Install the Apache2 FastCGI mod +(``libapache2-mod-fastcgi`` on Debian), enable ``mod_proxy`` and +``mod_proxy_fcgi`` in your Apache configuration, and use the ``SetHandler`` +directive to pass requests for PHP files to PHP FPM: .. code-block:: apache + # /etc/apache2/conf.d/example.com.conf - ServerName domain.tld - ServerAlias www.domain.tld + ServerName example.com + ServerAlias www.example.com # Uncomment the following line to force Apache to pass the Authorization # header to PHP: required for "basic_auth" under PHP-FPM and FastCGI # # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 - # For Apache 2.4.9 or higher - # Using SetHandler avoids issues with using ProxyPassMatch in combination - # with mod_rewrite or mod_autoindex - SetHandler proxy:fcgi://127.0.0.1:9000 - # for Unix sockets, Apache 2.4.10 or higher - # SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy - - - # If you use Apache version below 2.4.9 you must consider update or use this instead - # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 + # when using PHP-FPM as a unix socket + SetHandler proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://dummy - # If you run your Symfony application on a subpath of your document root, the - # regular expression must be changed accordingly: - # ProxyPassMatch ^/path-to-app/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 + # when PHP-FPM is configured to use TCP + # SetHandler proxy:fcgi://127.0.0.1:9000 + DocumentRoot /var/www/project/public @@ -107,8 +102,9 @@ The **minimum configuration** to get your application running under Nginx is: .. code-block:: nginx + # /etc/nginx/conf.d/example.com.conf server { - server_name domain.tld www.domain.tld; + server_name example.com www.example.com; root /var/www/project/public; location / { @@ -124,7 +120,12 @@ The **minimum configuration** to get your application running under Nginx is: # } location ~ ^/index\.php(/|$) { + # when using PHP-FPM as a unix socket fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; + + # when PHP-FPM is configured to use TCP + # fastcgi_pass 127.0.0.1:9000; + fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; @@ -146,7 +147,7 @@ The **minimum configuration** to get your application running under Nginx is: fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; # Prevents URIs that include the front controller. This will 404: - # http://domain.tld/index.php/some-path + # http://example.com/index.php/some-path # Remove the internal directive to allow URIs like this internal; } @@ -166,11 +167,6 @@ The **minimum configuration** to get your application running under Nginx is: If you use NGINX Unit, check out the official article about `How to run Symfony applications using NGINX Unit`_. -.. note:: - - Depending on your PHP-FPM config, the ``fastcgi_pass`` can also be - ``fastcgi_pass 127.0.0.1:9000``. - .. tip:: This executes **only** ``index.php`` in the public directory. All other files @@ -186,7 +182,46 @@ The **minimum configuration** to get your application running under Nginx is: For advanced Nginx configuration options, read the official `Nginx documentation`_. -.. _`Apache documentation`: https://httpd.apache.org/docs/ -.. _`FastCgiExternalServer`: https://docs.oracle.com/cd/B31017_01/web.1013/q20204/mod_fastcgi.html#FastCgiExternalServer +Caddy +----- + +When using Caddy on the server, you can use a configuration like this: + +.. code-block:: raw + + # /etc/caddy/Caddyfile + example.com, www.example.com { + root * /var/www/project/public + + # serve files directly if they can be found (e.g. CSS or JS files in public/) + encode zstd gzip + file_server + + + # otherwise, use PHP-FPM (replace "unix//var/..." with "127.0.0.1:9000" when using TCP) + php_fastcgi unix//var/run/php/php7.4-fpm.sock { + # optionally set the value of the environment variables used in the application + # env APP_ENV "prod" + # env APP_SECRET "" + # env DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name" + + # Configure the FastCGI to resolve any symlinks in the root path. + # This ensures that OpCache is using the destination filenames, + # instead of the symlinks, to cache opcodes and php files see + # https://caddy.community/t/root-symlink-folder-updates-and-caddy-reload-not-working/10557 + resolve_root_symlink + } + + # return 404 for all other php files not matching the front controller + # this prevents access to other php files you don't want to be accessible. + @phpFile { + path *.php* + } + error @phpFile "Not found" 404 + } + +See the `official Caddy documentation`_ for more examples, such as using +Caddy in a container infrastructure. + .. _`Nginx documentation`: https://www.nginx.com/resources/wiki/start/topics/recipes/symfony/ .. _`How to run Symfony applications using NGINX Unit`: https://unit.nginx.org/howto/symfony/ From 679bf644642007fb17c40f5748d304666d4aa321 Mon Sep 17 00:00:00 2001 From: Wouter de Jong Date: Tue, 20 Dec 2022 22:56:05 +0100 Subject: [PATCH 124/670] Add Caddy section --- setup/web_server_configuration.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup/web_server_configuration.rst b/setup/web_server_configuration.rst index 1682c8a58de..6723d0abaa3 100644 --- a/setup/web_server_configuration.rst +++ b/setup/web_server_configuration.rst @@ -6,7 +6,7 @@ The preferred way to develop your Symfony application is to use However, when running the application in the production environment, you'll need to use a fully-featured web server. This article describes how to use Symfony -with Apache or Nginx. +with Apache, Nginx or Caddy. .. sidebar:: The public directory @@ -187,7 +187,7 @@ Caddy When using Caddy on the server, you can use a configuration like this: -.. code-block:: raw +.. code-block:: text # /etc/caddy/Caddyfile example.com, www.example.com { @@ -225,3 +225,4 @@ Caddy in a container infrastructure. .. _`Nginx documentation`: https://www.nginx.com/resources/wiki/start/topics/recipes/symfony/ .. _`How to run Symfony applications using NGINX Unit`: https://unit.nginx.org/howto/symfony/ +.. _`official Caddy documentation`: https://caddyserver.com/docs/ From aea773cbdfe3c2efaec683fd0c1552cd98a6a944 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 3 Aug 2023 16:37:10 +0200 Subject: [PATCH 125/670] [Workflow] Remove registry workflow retrieval occurrences --- workflow.rst | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/workflow.rst b/workflow.rst index b0dd2f2495a..02abd4da037 100644 --- a/workflow.rst +++ b/workflow.rst @@ -275,28 +275,6 @@ machine type, use ``camelCased workflow name + StateMachine``:: } } -Alternatively, use the registry:: - - use App\Entity\BlogPost; - use Symfony\Component\Workflow\Registry; - - class MyClass - { - private $workflowRegistry; - - public function __construct(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - public function toReview(BlogPost $post) - { - $blogPublishingWorkflow = $this->workflowRegistry->get($post); - - // ... - } - } - .. tip:: You can find the list of available workflow services with the @@ -1051,7 +1029,7 @@ In a :ref:`flash message ` in your controller:: // $transition = ...; (an instance of Transition) - // $workflow is a Workflow instance retrieved from the Registry or injected directly (see above) + // $workflow is an injected Workflow instance $title = $workflow->getMetadataStore()->getMetadata('title', $transition); $this->addFlash('info', "You have successfully applied the transition with title: '$title'"); From 6146bfdbf232b2d41e7dd01414b99505f4408b0e Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Fri, 4 Aug 2023 10:56:46 +0200 Subject: [PATCH 126/670] [DependencyInjection] Mention `debug:autowiring` command with argument --- service_container.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/service_container.rst b/service_container.rst index 5065effb976..5b15dd83356 100644 --- a/service_container.rst +++ b/service_container.rst @@ -694,6 +694,12 @@ But, you can control this and pass in a different logger: This tells the container that the ``$logger`` argument to ``__construct`` should use service whose id is ``monolog.logger.request``. +For a list of possible logger services that can be used with autowiring, run: + +.. code-block:: terminal + + $ php bin/console debug:autowiring logger + .. _container-debug-container: For a full list of *all* possible services in the container, run: From 1e4150504d90e5ecebd1ebd7f0bce9053cd3561b Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 4 Aug 2023 11:32:20 +0200 Subject: [PATCH 127/670] [Cache] Fix doc for Doctrine DBAL adapter --- cache.rst | 23 ++--- .../cache/adapters/doctrine_dbal_adapter.rst | 45 +++++++++ .../cache/adapters/filesystem_adapter.rst | 2 +- components/cache/adapters/pdo_adapter.rst | 55 +++++++++++ .../adapters/pdo_doctrine_dbal_adapter.rst | 95 ------------------- components/cache/cache_pools.rst | 3 +- 6 files changed, 115 insertions(+), 108 deletions(-) create mode 100644 components/cache/adapters/doctrine_dbal_adapter.rst create mode 100644 components/cache/adapters/pdo_adapter.rst delete mode 100644 components/cache/adapters/pdo_doctrine_dbal_adapter.rst diff --git a/cache.rst b/cache.rst index 118ef13a326..a22912c36b1 100644 --- a/cache.rst +++ b/cache.rst @@ -106,10 +106,11 @@ The Cache component comes with a series of adapters pre-configured: * :doc:`cache.adapter.apcu ` * :doc:`cache.adapter.array ` -* :doc:`cache.adapter.doctrine ` +* :doc:`cache.adapter.doctrine ` (deprecated) +* :doc:`cache.adapter.doctrine_dbal ` * :doc:`cache.adapter.filesystem ` * :doc:`cache.adapter.memcached ` -* :doc:`cache.adapter.pdo ` +* :doc:`cache.adapter.pdo ` * :doc:`cache.adapter.psr6 ` * :doc:`cache.adapter.redis ` * :ref:`cache.adapter.redis_tag_aware ` (Redis adapter optimized to work with tags) @@ -130,8 +131,8 @@ will create pools with service IDs that follow the pattern ``cache.[type]``. cache: directory: '%kernel.cache_dir%/pools' # Only used with cache.adapter.filesystem - # service: cache.doctrine - default_doctrine_provider: 'app.doctrine_cache' + # service: cache.doctrine_dbal + default_doctrine_dbal_provider: 'doctrine.dbal.default_connection' # service: cache.psr6 default_psr6_provider: 'app.my_psr6_service' # service: cache.redis @@ -139,7 +140,7 @@ will create pools with service IDs that follow the pattern ``cache.[type]``. # service: cache.memcached default_memcached_provider: 'memcached://localhost' # service: cache.pdo - default_pdo_provider: 'doctrine.dbal.default_connection' + default_pdo_provider: 'pgsql:host=localhost' .. code-block:: xml @@ -155,7 +156,7 @@ will create pools with service IDs that follow the pattern ``cache.[type]``. > @@ -181,8 +182,8 @@ will create pools with service IDs that follow the pattern ``cache.[type]``. $framework->cache() // Only used with cache.adapter.filesystem ->directory('%kernel.cache_dir%/pools') - // Service: cache.doctrine - ->defaultDoctrineProvider('app.doctrine_cache') + // Service: cache.doctrine_dbal + ->defaultDoctrineDbalProvider('doctrine.dbal.default_connection') // Service: cache.psr6 ->defaultPsr6Provider('app.my_psr6_service') // Service: cache.redis @@ -190,7 +191,7 @@ will create pools with service IDs that follow the pattern ``cache.[type]``. // Service: cache.memcached ->defaultMemcachedProvider('memcached://localhost') // Service: cache.pdo - ->defaultPdoProvider('doctrine.dbal.default_connection') + ->defaultPdoProvider('pgsql:host=localhost') ; }; diff --git a/components/cache/adapters/doctrine_dbal_adapter.rst b/components/cache/adapters/doctrine_dbal_adapter.rst new file mode 100644 index 00000000000..3b955832147 --- /dev/null +++ b/components/cache/adapters/doctrine_dbal_adapter.rst @@ -0,0 +1,45 @@ +.. _doctrine-dbal-adapter: + +Doctrine DBAL Cache Adapter +=========================== + +The Doctrine DBAL adapters store the cache items in a table of an SQL database. + +.. note:: + + This adapter implements :class:`Symfony\\Component\\Cache\\PruneableInterface`, + allowing for manual :ref:`pruning of expired cache entries ` + by calling the ``prune()`` method. + +The :class:`Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter` requires a +`Doctrine DBAL Connection`_, or `Doctrine DBAL URL`_ as its first parameter. +You can pass a namespace, default cache lifetime, and options array as the other +optional arguments:: + + use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter; + + $cache = new DoctrineDbalAdapter( + + // a Doctrine DBAL connection or DBAL URL + $databaseConnectionOrURL, + + // the string prefixed to the keys of the items stored in this cache + $namespace = '', + + // the default lifetime (in seconds) for cache items that do not define their + // own lifetime, with a value 0 causing items to be stored indefinitely (i.e. + // until the database table is truncated or its rows are otherwise deleted) + $defaultLifetime = 0, + + // an array of options for configuring the database table and connection + $options = [] + ); + +.. note:: + + DBAL Connection are lazy-loaded by default; some additional options may be + necessary to detect the database engine and version without opening the + connection. + +.. _`Doctrine DBAL Connection`: https://github.com/doctrine/dbal/blob/master/src/Connection.php +.. _`Doctrine DBAL URL`: https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url diff --git a/components/cache/adapters/filesystem_adapter.rst b/components/cache/adapters/filesystem_adapter.rst index 331dbb2dff6..237ac3bc60e 100644 --- a/components/cache/adapters/filesystem_adapter.rst +++ b/components/cache/adapters/filesystem_adapter.rst @@ -41,7 +41,7 @@ and cache root path as constructor parameters:: choices. If throughput is paramount, the in-memory adapters (:ref:`Apcu `, :ref:`Memcached `, and :ref:`Redis `) or the database adapters - (:ref:`PDO `) are recommended. + (:ref:`Doctrine DBAL `, :ref:`PDO `) are recommended. .. note:: diff --git a/components/cache/adapters/pdo_adapter.rst b/components/cache/adapters/pdo_adapter.rst new file mode 100644 index 00000000000..62d4dcc90aa --- /dev/null +++ b/components/cache/adapters/pdo_adapter.rst @@ -0,0 +1,55 @@ +.. _pdo-adapter: + +PDO Cache Adapter +================= + +The PDO adapters store the cache items in a table of an SQL database. + +.. note:: + + This adapter implements :class:`Symfony\\Component\\Cache\\PruneableInterface`, + allowing for manual :ref:`pruning of expired cache entries ` + by calling the ``prune()`` method. + +The :class:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter` requires a :phpclass:`PDO`, +or `DSN`_ as its first parameter. You can pass a namespace, +default cache lifetime, and options array as the other optional arguments:: + + use Symfony\Component\Cache\Adapter\PdoAdapter; + + $cache = new PdoAdapter( + + // a PDO connection or DSN for lazy connecting through PDO + $databaseConnectionOrDSN, + + // the string prefixed to the keys of the items stored in this cache + $namespace = '', + + // the default lifetime (in seconds) for cache items that do not define their + // own lifetime, with a value 0 causing items to be stored indefinitely (i.e. + // until the database table is truncated or its rows are otherwise deleted) + $defaultLifetime = 0, + + // an array of options for configuring the database table and connection + $options = [] + ); + +The table where values are stored is created automatically on the first call to +the :method:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter::save` method. +You can also create this table explicitly by calling the +:method:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter::createTable` method in +your code. + +.. deprecated:: 5.4 + + Using :class:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter` with a + :class:`Doctrine\\DBAL\\Connection` or a DBAL URL is deprecated since Symfony 5.4 + and will be removed in Symfony 6.0. + Use :class:`Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter` instead. + +.. tip:: + + When passed a `Data Source Name (DSN)`_ string (instead of a database connection + class instance), the connection will be lazy-loaded when needed. + +.. _`DSN`: https://php.net/manual/pdo.drivers.php diff --git a/components/cache/adapters/pdo_doctrine_dbal_adapter.rst b/components/cache/adapters/pdo_doctrine_dbal_adapter.rst deleted file mode 100644 index 3615d5a1bbf..00000000000 --- a/components/cache/adapters/pdo_doctrine_dbal_adapter.rst +++ /dev/null @@ -1,95 +0,0 @@ -.. _pdo-doctrine-adapter: - -PDO & Doctrine DBAL Cache Adapter -================================= - -The PDO and Doctrine DBAL adapters store the cache items in a table of an SQL database. - -.. note:: - - These adapters implement :class:`Symfony\\Component\\Cache\\PruneableInterface`, - allowing for manual :ref:`pruning of expired cache entries ` - by calling the ``prune()`` method. - -Using PHP PDO -------------- - -The :class:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter` requires a :phpclass:`PDO`, -or `Data Source Name (DSN)`_ as its first parameter. You can pass a namespace, -default cache lifetime, and options array as the other optional arguments:: - - use Symfony\Component\Cache\Adapter\PdoAdapter; - - $cache = new PdoAdapter( - - // a PDO connection or DSN for lazy connecting through PDO - $databaseConnectionOrDSN, - - // the string prefixed to the keys of the items stored in this cache - $namespace = '', - - // the default lifetime (in seconds) for cache items that do not define their - // own lifetime, with a value 0 causing items to be stored indefinitely (i.e. - // until the database table is truncated or its rows are otherwise deleted) - $defaultLifetime = 0, - - // an array of options for configuring the database table and connection - $options = [] - ); - -The table where values are stored is created automatically on the first call to -the :method:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter::save` method. -You can also create this table explicitly by calling the -:method:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter::createTable` method in -your code. - -.. deprecated:: 5.4 - - Using :class:`Symfony\\Component\\Cache\\Adapter\\PdoAdapter` with a - :class:`Doctrine\\DBAL\\Connection` or a DBAL URL is deprecated since Symfony 5.4 - and will be removed in Symfony 6.0. - Use :class:`Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter` instead. - -.. tip:: - - When passed a `Data Source Name (DSN)`_ string (instead of a database connection - class instance), the connection will be lazy-loaded when needed. DBAL Connection - are lazy-loaded by default; some additional options may be necessary to detect - the database engine and version without opening the connection. - -Using Doctrine DBAL -------------------- - -The :class:`Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter` requires a -`Doctrine DBAL Connection`_, or `Doctrine DBAL URL`_ as its first parameter. -You can pass a namespace, default cache lifetime, and options array as the other -optional arguments:: - - use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter; - - $cache = new DoctrineDbalAdapter( - - // a Doctrine DBAL connection or DBAL URL - $databaseConnectionOrURL, - - // the string prefixed to the keys of the items stored in this cache - $namespace = '', - - // the default lifetime (in seconds) for cache items that do not define their - // own lifetime, with a value 0 causing items to be stored indefinitely (i.e. - // until the database table is truncated or its rows are otherwise deleted) - $defaultLifetime = 0, - - // an array of options for configuring the database table and connection - $options = [] - ); - -.. note:: - - DBAL Connection are lazy-loaded by default; some additional options may be - necessary to detect the database engine and version without opening the - connection. - -.. _`Doctrine DBAL Connection`: https://github.com/doctrine/dbal/blob/master/src/Connection.php -.. _`Doctrine DBAL URL`: https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url -.. _`Data Source Name (DSN)`: https://en.wikipedia.org/wiki/Data_source_name diff --git a/components/cache/cache_pools.rst b/components/cache/cache_pools.rst index ac7cf945429..bd4488f2b48 100644 --- a/components/cache/cache_pools.rst +++ b/components/cache/cache_pools.rst @@ -203,8 +203,9 @@ This shortcoming has been solved through the introduction of :class:`Symfony\\Component\\Cache\\PruneableInterface`, which defines the abstract method :method:`Symfony\\Component\\Cache\\PruneableInterface::prune`. The :ref:`ChainAdapter `, +:ref:`DoctrineDbalAdapter `, and :ref:`FilesystemAdapter `, -:ref:`PdoAdapter `, and +:ref:`PdoAdapter `, and :ref:`PhpFilesAdapter ` all implement this new interface, allowing manual removal of stale cache items:: From e4a3b1c07a9fbfe73d8007fda3d1541cc875e256 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Sat, 5 Aug 2023 12:19:24 +0200 Subject: [PATCH 128/670] Typo in cache dir env var explanation --- configuration/override_dir_structure.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configuration/override_dir_structure.rst b/configuration/override_dir_structure.rst index 7528c250729..2a5df047611 100644 --- a/configuration/override_dir_structure.rst +++ b/configuration/override_dir_structure.rst @@ -67,7 +67,7 @@ Console script:: Web front-controller:: // public/index.php - + // ... $_SERVER['APP_RUNTIME_OPTIONS']['dotenv_path'] = 'another/custom/path/to/.env'; @@ -109,8 +109,8 @@ In this code, ``$this->environment`` is the current environment (i.e. ``dev``). In this case you have changed the location of the cache directory to ``var/{environment}/cache/``. -You can also change the cache directory defining an environment variable named -``APP_CACHE_DIR`` whose value is the full path of the cache folder. +You can also change the cache directory by defining an environment variable +named ``APP_CACHE_DIR`` whose value is the full path of the cache folder. .. caution:: From c24c0990289968ce1b2530bbd1a70c9798235f23 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 7 Aug 2023 15:11:36 +0200 Subject: [PATCH 129/670] add missing link target --- components/cache/adapters/pdo_adapter.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/cache/adapters/pdo_adapter.rst b/components/cache/adapters/pdo_adapter.rst index 62d4dcc90aa..4920520196f 100644 --- a/components/cache/adapters/pdo_adapter.rst +++ b/components/cache/adapters/pdo_adapter.rst @@ -53,3 +53,4 @@ your code. class instance), the connection will be lazy-loaded when needed. .. _`DSN`: https://php.net/manual/pdo.drivers.php +.. _`Data Source Name (DSN)`: https://en.wikipedia.org/wiki/Data_source_name From c3d11cf5f6ded52c42a588aefd70a3e6bdc82f22 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 7 Aug 2023 16:26:00 +0200 Subject: [PATCH 130/670] tweak the cache docs --- cache.rst | 20 +++++++++---------- components/cache/adapters/apcu_adapter.rst | 2 -- components/cache/adapters/chain_adapter.rst | 2 -- .../adapters/couchbasebucket_adapter.rst | 6 ++---- .../adapters/couchbasecollection_adapter.rst | 6 ++---- .../cache/adapters/doctrine_adapter.rst | 2 -- .../cache/adapters/doctrine_dbal_adapter.rst | 2 -- .../cache/adapters/filesystem_adapter.rst | 11 +++++----- .../cache/adapters/memcached_adapter.rst | 6 ++---- components/cache/adapters/pdo_adapter.rst | 2 -- .../cache/adapters/php_files_adapter.rst | 4 +--- components/cache/adapters/redis_adapter.rst | 6 ++---- components/cache/cache_pools.rst | 14 ++++++------- 13 files changed, 31 insertions(+), 52 deletions(-) diff --git a/cache.rst b/cache.rst index a22912c36b1..b0d65f52740 100644 --- a/cache.rst +++ b/cache.rst @@ -156,19 +156,19 @@ will create pools with service IDs that follow the pattern ``cache.[type]``. > diff --git a/components/cache/adapters/apcu_adapter.rst b/components/cache/adapters/apcu_adapter.rst index c85050e9b4c..99d76ce5d27 100644 --- a/components/cache/adapters/apcu_adapter.rst +++ b/components/cache/adapters/apcu_adapter.rst @@ -1,5 +1,3 @@ -.. _apcu-adapter: - APCu Cache Adapter ================== diff --git a/components/cache/adapters/chain_adapter.rst b/components/cache/adapters/chain_adapter.rst index 9a91234096e..586857d2e4d 100644 --- a/components/cache/adapters/chain_adapter.rst +++ b/components/cache/adapters/chain_adapter.rst @@ -1,5 +1,3 @@ -.. _component-cache-chain-adapter: - Chain Cache Adapter =================== diff --git a/components/cache/adapters/couchbasebucket_adapter.rst b/components/cache/adapters/couchbasebucket_adapter.rst index f1e0c13b2b0..5312371a2bb 100644 --- a/components/cache/adapters/couchbasebucket_adapter.rst +++ b/components/cache/adapters/couchbasebucket_adapter.rst @@ -1,5 +1,3 @@ -.. _couchbase-adapter: - Couchbase Bucket Cache Adapter ============================== @@ -8,8 +6,8 @@ Couchbase Bucket Cache Adapter The Couchbase Bucket adapter was introduced in Symfony 5.1. This adapter stores the values in-memory using one (or more) `Couchbase server`_ -instances. Unlike the :ref:`APCu adapter `, and similarly to the -:ref:`Memcached adapter `, it is not limited to the current server's +instances. Unlike the :doc:`APCu adapter `, and similarly to the +:doc:`Memcached adapter `, it is not limited to the current server's shared memory; you can store contents independent of your PHP environment. The ability to utilize a cluster of servers to provide redundancy and/or fail-over is also available. diff --git a/components/cache/adapters/couchbasecollection_adapter.rst b/components/cache/adapters/couchbasecollection_adapter.rst index a0c5e28c9a8..66586c816ee 100644 --- a/components/cache/adapters/couchbasecollection_adapter.rst +++ b/components/cache/adapters/couchbasecollection_adapter.rst @@ -1,5 +1,3 @@ -.. _couchbase-collection-adapter: - Couchbase Collection Cache Adapter ================================== @@ -8,8 +6,8 @@ Couchbase Collection Cache Adapter The Couchbase Collection adapter was introduced in Symfony 5.4. This adapter stores the values in-memory using one (or more) `Couchbase server`_ -instances. Unlike the :ref:`APCu adapter `, and similarly to the -:ref:`Memcached adapter `, it is not limited to the current server's +instances. Unlike the :doc:`APCu adapter `, and similarly to the +:doc:`Memcached adapter `, it is not limited to the current server's shared memory; you can store contents independent of your PHP environment. The ability to utilize a cluster of servers to provide redundancy and/or fail-over is also available. diff --git a/components/cache/adapters/doctrine_adapter.rst b/components/cache/adapters/doctrine_adapter.rst index 3b894e8388b..b345d310029 100644 --- a/components/cache/adapters/doctrine_adapter.rst +++ b/components/cache/adapters/doctrine_adapter.rst @@ -1,5 +1,3 @@ -.. _doctrine-adapter: - Doctrine Cache Adapter ====================== diff --git a/components/cache/adapters/doctrine_dbal_adapter.rst b/components/cache/adapters/doctrine_dbal_adapter.rst index 3b955832147..fc04410bffc 100644 --- a/components/cache/adapters/doctrine_dbal_adapter.rst +++ b/components/cache/adapters/doctrine_dbal_adapter.rst @@ -1,5 +1,3 @@ -.. _doctrine-dbal-adapter: - Doctrine DBAL Cache Adapter =========================== diff --git a/components/cache/adapters/filesystem_adapter.rst b/components/cache/adapters/filesystem_adapter.rst index 237ac3bc60e..4c447b3de82 100644 --- a/components/cache/adapters/filesystem_adapter.rst +++ b/components/cache/adapters/filesystem_adapter.rst @@ -1,10 +1,8 @@ -.. _component-cache-filesystem-adapter: - Filesystem Cache Adapter ======================== This adapter offers improved application performance for those who cannot install -tools like :ref:`APCu ` or :ref:`Redis ` in their +tools like :doc:`APCu ` or :doc:`Redis ` in their environment. It stores the cache item expiration and content as regular files in a collection of directories on a locally mounted filesystem. @@ -39,9 +37,10 @@ and cache root path as constructor parameters:: The overhead of filesystem IO often makes this adapter one of the *slower* choices. If throughput is paramount, the in-memory adapters - (:ref:`Apcu `, :ref:`Memcached `, and - :ref:`Redis `) or the database adapters - (:ref:`Doctrine DBAL `, :ref:`PDO `) are recommended. + (:doc:`Apcu `, :doc:`Memcached `, + and :doc:`Redis `) or the database adapters + (:doc:`Doctrine DBAL `, :doc:`PDO `) + are recommended. .. note:: diff --git a/components/cache/adapters/memcached_adapter.rst b/components/cache/adapters/memcached_adapter.rst index f2de83251c9..d68d3e3b9ac 100644 --- a/components/cache/adapters/memcached_adapter.rst +++ b/components/cache/adapters/memcached_adapter.rst @@ -1,11 +1,9 @@ -.. _memcached-adapter: - Memcached Cache Adapter ======================= This adapter stores the values in-memory using one (or more) `Memcached server`_ -instances. Unlike the :ref:`APCu adapter `, and similarly to the -:ref:`Redis adapter `, it is not limited to the current server's +instances. Unlike the :doc:`APCu adapter `, and similarly to the +:doc:`Redis adapter `, it is not limited to the current server's shared memory; you can store contents independent of your PHP environment. The ability to utilize a cluster of servers to provide redundancy and/or fail-over is also available. diff --git a/components/cache/adapters/pdo_adapter.rst b/components/cache/adapters/pdo_adapter.rst index 4920520196f..34815a51eb0 100644 --- a/components/cache/adapters/pdo_adapter.rst +++ b/components/cache/adapters/pdo_adapter.rst @@ -1,5 +1,3 @@ -.. _pdo-adapter: - PDO Cache Adapter ================= diff --git a/components/cache/adapters/php_files_adapter.rst b/components/cache/adapters/php_files_adapter.rst index dce77657292..efd2cf0e964 100644 --- a/components/cache/adapters/php_files_adapter.rst +++ b/components/cache/adapters/php_files_adapter.rst @@ -1,9 +1,7 @@ -.. _component-cache-files-adapter: - PHP Files Cache Adapter ======================= -Similarly to :ref:`Filesystem Adapter `, this cache +Similarly to :doc:`Filesystem Adapter `, this cache implementation writes cache entries out to disk, but unlike the Filesystem cache adapter, the PHP Files cache adapter writes and reads back these cache files *as native PHP code*. For example, caching the value ``['my', 'cached', 'array']`` will write out a cache diff --git a/components/cache/adapters/redis_adapter.rst b/components/cache/adapters/redis_adapter.rst index a7530e6d3f0..dc711d6b8e0 100644 --- a/components/cache/adapters/redis_adapter.rst +++ b/components/cache/adapters/redis_adapter.rst @@ -1,5 +1,3 @@ -.. _redis-adapter: - Redis Cache Adapter =================== @@ -12,8 +10,8 @@ Redis Cache Adapter This adapter stores the values in-memory using one (or more) `Redis server`_ instances. -Unlike the :ref:`APCu adapter `, and similarly to the -:ref:`Memcached adapter `, it is not limited to the current server's +Unlike the :doc:`APCu adapter `, and similarly to the +:doc:`Memcached adapter `, it is not limited to the current server's shared memory; you can store contents independent of your PHP environment. The ability to utilize a cluster of servers to provide redundancy and/or fail-over is also available. diff --git a/components/cache/cache_pools.rst b/components/cache/cache_pools.rst index bd4488f2b48..c92a22a136b 100644 --- a/components/cache/cache_pools.rst +++ b/components/cache/cache_pools.rst @@ -192,7 +192,7 @@ Pruning Cache Items ------------------- Some cache pools do not include an automated mechanism for pruning expired cache items. -For example, the :ref:`FilesystemAdapter ` cache +For example, the :doc:`FilesystemAdapter ` cache does not remove expired cache items *until an item is explicitly requested and determined to be expired*, for example, via a call to ``Psr\Cache\CacheItemPoolInterface::getItem``. Under certain workloads, this can cause stale cache entries to persist well past their @@ -202,11 +202,11 @@ expired cache items. This shortcoming has been solved through the introduction of :class:`Symfony\\Component\\Cache\\PruneableInterface`, which defines the abstract method :method:`Symfony\\Component\\Cache\\PruneableInterface::prune`. The -:ref:`ChainAdapter `, -:ref:`DoctrineDbalAdapter `, and -:ref:`FilesystemAdapter `, -:ref:`PdoAdapter `, and -:ref:`PhpFilesAdapter ` all implement this new interface, +:doc:`ChainAdapter `, +:doc:`DoctrineDbalAdapter `, and +:doc:`FilesystemAdapter `, +:doc:`PdoAdapter `, and +:doc:`PhpFilesAdapter ` all implement this new interface, allowing manual removal of stale cache items:: use Symfony\Component\Cache\Adapter\FilesystemAdapter; @@ -215,7 +215,7 @@ allowing manual removal of stale cache items:: // ... do some set and get operations $cache->prune(); -The :ref:`ChainAdapter ` implementation does not directly +The :doc:`ChainAdapter ` implementation does not directly contain any pruning logic itself. Instead, when calling the chain adapter's :method:`Symfony\\Component\\Cache\\Adapter\\ChainAdapter::prune` method, the call is delegated to all its compatible cache adapters (and those that do not implement ``PruneableInterface`` are From 6c4bcac4aca5226a0d5ae029fde8e395bc9293d1 Mon Sep 17 00:00:00 2001 From: Vasilij Dusko Date: Mon, 7 Aug 2023 20:45:36 +0300 Subject: [PATCH 131/670] Documentation bugfix --- logging/handlers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logging/handlers.rst b/logging/handlers.rst index 8e70b6a0861..8821113405e 100644 --- a/logging/handlers.rst +++ b/logging/handlers.rst @@ -27,7 +27,7 @@ To use it, declare it as a service: Symfony\Bridge\Monolog\Handler\ElasticsearchLogstashHandler: ~ # optionally, configure the handler using the constructor arguments (shown values are default) - Symfony\Bridge\Monolog\Handler\ElasticsearchLogstashHandler: ~ + Symfony\Bridge\Monolog\Handler\ElasticsearchLogstashHandler: arguments: $endpoint: "http://127.0.0.1:9200" $index: "monolog" From b2ea2a0a79c6697dcd30befc85111097da1412d2 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 8 Aug 2023 09:15:40 +0200 Subject: [PATCH 132/670] [CI] Use DOCtor-RST 1.48.4 --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 482c55d7237..5364a72a526 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -73,7 +73,7 @@ jobs: key: ${{ runner.os }}-doctor-rst-${{ steps.extract_base_branch.outputs.branch }} - name: "Run DOCtor-RST" - uses: docker://oskarstark/doctor-rst:1.48.1 + uses: docker://oskarstark/doctor-rst:1.48.4 with: args: --short --error-format=github --cache-file=/github/workspace/.cache/doctor-rst.cache From 16eeb74b0c441c14e5a9caa885501a6d8dda723a Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Tue, 8 Aug 2023 19:26:54 +0200 Subject: [PATCH 133/670] Remove hidden toctree --- components/console/helpers/index.rst | 11 ---- contributing/index.rst | 10 ---- controller.rst | 5 -- frontend.rst | 9 ---- index.rst | 25 --------- page_creation.rst | 5 -- reference/constraints.rst | 80 ---------------------------- reference/forms/types.rst | 52 ------------------ reference/index.rst | 22 -------- routing.rst | 5 -- setup.rst | 5 -- 11 files changed, 229 deletions(-) diff --git a/components/console/helpers/index.rst b/components/console/helpers/index.rst index 81cf8aae9bf..893652fb5ab 100644 --- a/components/console/helpers/index.rst +++ b/components/console/helpers/index.rst @@ -1,17 +1,6 @@ The Console Helpers =================== -.. toctree:: - :hidden: - - formatterhelper - processhelper - progressbar - questionhelper - table - debug_formatter - cursor - The Console component comes with some useful helpers. These helpers contain functions to ease some common tasks. diff --git a/contributing/index.rst b/contributing/index.rst index d76b4a8e037..c44ee7606a1 100644 --- a/contributing/index.rst +++ b/contributing/index.rst @@ -1,14 +1,4 @@ Contributing ============ -.. toctree:: - :hidden: - - code_of_conduct/index - code/index - documentation/index - translations/index - community/index - diversity/index - .. include:: /contributing/map.rst.inc diff --git a/controller.rst b/controller.rst index 58e7e83d854..c3a11e99a6a 100644 --- a/controller.rst +++ b/controller.rst @@ -558,11 +558,6 @@ Next, learn all about :doc:`rendering templates with Twig `. Learn more about Controllers ---------------------------- -.. toctree:: - :hidden: - - templates - .. toctree:: :maxdepth: 1 :glob: diff --git a/frontend.rst b/frontend.rst index ad30b996462..b16c55937d4 100644 --- a/frontend.rst +++ b/frontend.rst @@ -92,15 +92,6 @@ Symfony UX Components Other Front-End Articles ------------------------ -.. toctree:: - :hidden: - :glob: - - frontend/assetic/index - frontend/encore/installation - frontend/encore/simple-example - frontend/encore/* - .. toctree:: :maxdepth: 1 :glob: diff --git a/index.rst b/index.rst index 288febd7ab8..d4663a94a68 100644 --- a/index.rst +++ b/index.rst @@ -8,11 +8,6 @@ Quick Tour Get started fast with the Symfony :doc:`Quick Tour `: -.. toctree:: - :hidden: - - quick_tour/index - * :doc:`quick_tour/the_big_picture` * :doc:`quick_tour/flex_recipes` * :doc:`quick_tour/the_architecture` @@ -68,11 +63,6 @@ Topics Components ---------- -.. toctree:: - :hidden: - - components/ - Read the :doc:`Components ` documentation. Reference Documents @@ -80,11 +70,6 @@ Reference Documents Get answers quickly with reference documents: -.. toctree:: - :hidden: - - reference/index - .. include:: /reference/map.rst.inc Contributing @@ -92,11 +77,6 @@ Contributing Contribute to Symfony: -.. toctree:: - :hidden: - - contributing/index - .. include:: /contributing/map.rst.inc Create your Own Framework @@ -104,9 +84,4 @@ Create your Own Framework Want to create your own framework based on Symfony? -.. toctree:: - :hidden: - - create_framework/index - .. include:: /create_framework/map.rst.inc diff --git a/page_creation.rst b/page_creation.rst index b053e0a88a7..a7d6e84c199 100644 --- a/page_creation.rst +++ b/page_creation.rst @@ -349,11 +349,6 @@ Have fun! Go Deeper with HTTP & Framework Fundamentals -------------------------------------------- -.. toctree:: - :hidden: - - routing - .. toctree:: :maxdepth: 1 :glob: diff --git a/reference/constraints.rst b/reference/constraints.rst index aa341d95883..bb506bf4576 100644 --- a/reference/constraints.rst +++ b/reference/constraints.rst @@ -1,86 +1,6 @@ Validation Constraints Reference ================================ -.. toctree:: - :maxdepth: 1 - :hidden: - - constraints/NotBlank - constraints/Blank - constraints/NotNull - constraints/IsNull - constraints/IsTrue - constraints/IsFalse - constraints/Type - - constraints/Email - constraints/ExpressionLanguageSyntax - constraints/Length - constraints/Url - constraints/Regex - constraints/Hostname - constraints/Ip - constraints/Uuid - constraints/Ulid - constraints/Json - - constraints/EqualTo - constraints/NotEqualTo - constraints/IdenticalTo - constraints/NotIdenticalTo - constraints/LessThan - constraints/LessThanOrEqual - constraints/GreaterThan - constraints/GreaterThanOrEqual - constraints/Range - constraints/DivisibleBy - constraints/Unique - - constraints/Positive - constraints/PositiveOrZero - constraints/Negative - constraints/NegativeOrZero - - constraints/Date - constraints/DateTime - constraints/Time - constraints/Timezone - - constraints/Choice - constraints/Collection - constraints/Count - constraints/UniqueEntity - constraints/Language - constraints/Locale - constraints/Country - - constraints/File - constraints/Image - - constraints/CardScheme - constraints/Currency - constraints/Luhn - constraints/Iban - constraints/Bic - constraints/Isbn - constraints/Issn - constraints/Isin - - constraints/AtLeastOneOf - constraints/Sequentially - constraints/Compound - constraints/Callback - constraints/Expression - constraints/All - constraints/UserPassword - constraints/NotCompromisedPassword - constraints/Valid - constraints/Traverse - constraints/CssColor - constraints/Cascade - constraints/EnableAutoMapping - constraints/DisableAutoMapping - The Validator is designed to validate objects against *constraints*. In real life, a constraint could be: "The cake must not be burned". In Symfony, constraints are similar: They are assertions that a condition is diff --git a/reference/forms/types.rst b/reference/forms/types.rst index aeb8d48ece9..26668d6d78a 100644 --- a/reference/forms/types.rst +++ b/reference/forms/types.rst @@ -1,58 +1,6 @@ Form Types Reference ==================== -.. toctree:: - :maxdepth: 1 - :hidden: - - types/text - types/textarea - types/email - types/integer - types/money - types/number - types/password - types/percent - types/search - types/url - types/range - types/tel - types/color - - types/choice - types/enum - types/entity - types/country - types/language - types/locale - types/timezone - types/currency - - types/date - types/dateinterval - types/datetime - types/time - types/birthday - types/week - - types/checkbox - types/file - types/radio - - types/uuid - types/ulid - - types/collection - types/repeated - - types/hidden - - types/button - types/reset - types/submit - - types/form - A form is composed of *fields*, each of which are built with the help of a field *type* (e.g. ``TextType``, ``ChoiceType``, etc). Symfony comes standard with a large list of field types that can be used in your application. diff --git a/reference/index.rst b/reference/index.rst index 82edbcc0130..38e0e38800e 100644 --- a/reference/index.rst +++ b/reference/index.rst @@ -1,26 +1,4 @@ Reference Documents =================== -.. toctree:: - :hidden: - - configuration/framework - configuration/doctrine - configuration/security - configuration/swiftmailer - configuration/twig - configuration/monolog - configuration/web_profiler - configuration/debug - - configuration/kernel - - forms/types - constraints - - twig_reference - - dic_tags - events - .. include:: /reference/map.rst.inc diff --git a/routing.rst b/routing.rst index 3c08ccef960..ad7062e5fa5 100644 --- a/routing.rst +++ b/routing.rst @@ -3055,11 +3055,6 @@ or, in Twig: Learn more about Routing ------------------------ -.. toctree:: - :hidden: - - controller - .. toctree:: :maxdepth: 1 :glob: diff --git a/setup.rst b/setup.rst index ca52f8bfc69..9b7620d4164 100644 --- a/setup.rst +++ b/setup.rst @@ -301,11 +301,6 @@ With setup behind you, it's time to :doc:`Create your first page in Symfony Date: Wed, 9 Aug 2023 14:02:09 +0200 Subject: [PATCH 134/670] [Framework] Add missing configuration keys --- reference/configuration/framework.rst | 59 +++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index 824e30d9f63..52f9e78a823 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -1541,6 +1541,40 @@ If the charset of your application is UTF-8 (as defined in the recommended setting it to ``true``. This will make non-UTF8 URLs to generate 404 errors. +secrets +~~~~~~~ + +enabled +....... + +**type**: ``boolean`` **default**: ``true`` + +Whether to enable or not secrets managements. + +decryption_env_var +.................. + +**type**: ``string`` **default**: ``base64:default::SYMFONY_DECRYPTION_SECRET`` + +The env var name that contains the vault decryption secret. By default, this +value will be decoded from base64. + +local_dotenv_file +................. + +**type**: ``string`` **default**: ``%kernel.project_dir%/.env.%kernel.environment%.local`` + +The path to the local ``.env`` file. This file must contain the vault +decryption key, given by the ``decryption_env_var`` option. + +vault_directory +............... + +**type**: ``string`` **default**: ``%kernel.project_dir%/config/secrets/%kernel.runtime_environment%`` + +The directory to store the secret vault. By default, the path uses the current +environment. + .. _config-framework-session: session @@ -1874,6 +1908,16 @@ This specifies if the session ID is stored on the client side using cookies or not. By default, it will use the value defined in the ``php.ini`` with the ``session.use_cookies`` directive. +ssi +~~~ + +enabled +....... + +**type**: ``boolean`` **default**: ``false`` + +Whether to enable or not SSI support in your application. + assets ~~~~~~ @@ -3392,6 +3436,21 @@ header name and value the header value. For more information, see :ref:`Configuring Emails Globally ` +messenger +~~~~~~~~~ + +enabled +....... + +**type**: ``boolean`` **default**: ``true`` + +Whether to enable or not Messenger. + +.. seealso:: + + For more details, see the :doc:`Messenger component ` + documentation. + web_link ~~~~~~~~ From e2b2df8c2e990d3bc6d2179aec7dadc2223bf6e3 Mon Sep 17 00:00:00 2001 From: Steven Renaux Date: Wed, 9 Aug 2023 16:58:30 +0200 Subject: [PATCH 135/670] Removing unavailable link --- contributing/code/bugs.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contributing/code/bugs.rst b/contributing/code/bugs.rst index 6a05f2cdf6d..fba68617ee3 100644 --- a/contributing/code/bugs.rst +++ b/contributing/code/bugs.rst @@ -14,9 +14,8 @@ Before submitting a bug: * Double-check the official :doc:`documentation ` to see if you're not misusing the framework; -* Ask for assistance on `Stack Overflow`_, on the #support channel of - `the Symfony Slack`_ or on the ``#symfony`` `IRC channel`_ if you're not sure if - your issue really is a bug. +* Ask for assistance on `Stack Overflow`_ or on the #support channel of + `the Symfony Slack`_ if you're not sure if your issue really is a bug. If your problem definitely looks like a bug, report it using the official bug `tracker`_ and follow some basic rules: @@ -48,7 +47,6 @@ If your problem definitely looks like a bug, report it using the official bug * *(optional)* Attach a :doc:`patch `. .. _`Stack Overflow`: https://stackoverflow.com/questions/tagged/symfony -.. _IRC channel: https://symfony.com/irc .. _the Symfony Slack: https://symfony.com/slack-invite .. _tracker: https://github.com/symfony/symfony/issues .. _
HTML tag: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details From 4a6e6a7a21caeb57f0d965271da9e8e19dd9fc24 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Thu, 10 Aug 2023 11:06:16 +0200 Subject: [PATCH 136/670] Add a note about Mock classes not considered for security issues --- contributing/code/security.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contributing/code/security.rst b/contributing/code/security.rst index b8e7bea3f6a..7c57e8929e6 100644 --- a/contributing/code/security.rst +++ b/contributing/code/security.rst @@ -21,6 +21,10 @@ email for confirmation): production (including the web profiler or anything enabled when ``APP_DEBUG`` is set to ``true`` or ``APP_ENV`` set to anything but ``prod``); +* Any security issues found in classes provided to help fo testing that should + never be used in production (like for instance mock classes that contain + ``Mock`` in their name); + * Any fix that can be classified as **security hardening** like route enumeration, login throttling bypasses, denial of service attacks, timing attacks, or lack of ``SensitiveParameter`` attributes. From 40d970d6d895760bd0558e22116eb19b5467366f Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Thu, 10 Aug 2023 11:36:09 +0200 Subject: [PATCH 137/670] [Console] Improve `Command::interact()` method description --- console.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/console.rst b/console.rst index 4078bfc221d..fb6fdd4b36f 100644 --- a/console.rst +++ b/console.rst @@ -461,8 +461,10 @@ command: This method is executed after ``initialize()`` and before ``execute()``. Its purpose is to check if some of the options/arguments are missing and interactively ask the user for those values. This is the last place - where you can ask for missing options/arguments. After this command, - missing options/arguments will result in an error. + where you can ask for missing required options/arguments, this method is + called before validating the input. + Note that it will not be called when the command is run without interaction + (e.g. when passing the ``--no-interaction`` global option flag). :method:`Symfony\\Component\\Console\\Command\\Command::execute` *(required)* This method is executed after ``interact()`` and ``initialize()``. From 0d9d34bdc54ed7da51c71e92459058bc9691e53b Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Thu, 10 Aug 2023 11:54:35 +0200 Subject: [PATCH 138/670] fix reference --- deployment.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deployment.rst b/deployment.rst index 2c755158faa..da05990b5ef 100644 --- a/deployment.rst +++ b/deployment.rst @@ -213,7 +213,7 @@ setup: * :ref:`Building and minifying your assets ` with Webpack Encore * Pushing assets to a CDN * On a shared hosting platform using the Apache web server, you may need to - install the :ref:`symfony/apache-pack package ` + install the `symfony/apache-pack`_ package * etc. Application Lifecycle: Continuous Integration, QA, etc. @@ -268,3 +268,4 @@ Learn More .. _`Git Tagging`: https://git-scm.com/book/en/v2/Git-Basics-Tagging .. _`Platform.sh`: https://symfony.com/cloud .. _`Symfony CLI`: https://symfony.com/download +.. _`symfony/apache-pack`: https://packagist.org/packages/symfony/apache-pack From ea432f9c2516b7c89662eaf6bf83ff6efaeafc81 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 10 Aug 2023 13:20:25 +0200 Subject: [PATCH 139/670] Tweaks --- contributing/code/security.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contributing/code/security.rst b/contributing/code/security.rst index 7c57e8929e6..ba8949971a4 100644 --- a/contributing/code/security.rst +++ b/contributing/code/security.rst @@ -21,9 +21,9 @@ email for confirmation): production (including the web profiler or anything enabled when ``APP_DEBUG`` is set to ``true`` or ``APP_ENV`` set to anything but ``prod``); -* Any security issues found in classes provided to help fo testing that should +* Any security issues found in classes provided to help for testing that should never be used in production (like for instance mock classes that contain - ``Mock`` in their name); + ``Mock`` in their name or classes in the ``Test`` namespace); * Any fix that can be classified as **security hardening** like route enumeration, login throttling bypasses, denial of service attacks, timing From a39bbc7741b6f5c4ec8e3ce3954f1684189dd52e Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 10 Aug 2023 13:33:13 +0200 Subject: [PATCH 140/670] Tweak --- console.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console.rst b/console.rst index fb6fdd4b36f..28b560d1f9b 100644 --- a/console.rst +++ b/console.rst @@ -461,7 +461,7 @@ command: This method is executed after ``initialize()`` and before ``execute()``. Its purpose is to check if some of the options/arguments are missing and interactively ask the user for those values. This is the last place - where you can ask for missing required options/arguments, this method is + where you can ask for missing required options/arguments. This method is called before validating the input. Note that it will not be called when the command is run without interaction (e.g. when passing the ``--no-interaction`` global option flag). From 47b30d0b40b5f66b0c6dd159d2ea56142624dd11 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Fri, 11 Aug 2023 13:59:53 +0200 Subject: [PATCH 141/670] [Console] Add a section for global options --- console.rst | 11 +++++++++++ console/input.rst | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/console.rst b/console.rst index 28b560d1f9b..6eb9dd10148 100644 --- a/console.rst +++ b/console.rst @@ -28,6 +28,10 @@ the ``list`` command to view all available commands in the application: cache:clear Clear the cache ... +.. note:: + + ``list`` is the default command, so running ``php bin/console`` is the same. + If you find the command you need, you can run it with the ``--help`` option to view the command's documentation: @@ -35,6 +39,13 @@ to view the command's documentation: $ php bin/console assets:install --help +.. note:: + + ``--help`` is one of the built-in global options from the Console component, + which are available for all commands, including those you can create. + To learn more about them, you can read + :ref:`this section `. + APP_ENV & APP_DEBUG ~~~~~~~~~~~~~~~~~~~ diff --git a/console/input.rst b/console/input.rst index 6a242185034..3abf3a37b9b 100644 --- a/console/input.rst +++ b/console/input.rst @@ -404,4 +404,26 @@ to help you unit test the completion logic:: } } +.. _console-global-options: + +Command Global Options +---------------------- + +The Console component adds some predefined options to all commands: + +* ``--verbose``: sets the verbosity level (e.g. ``1`` the default, ``2`` and + ``3``, or you can use respective shortcuts ``-v``, ``-vv`` and ``-vvv``) +* ``--quiet``: disables output and interaction +* ``--no-interaction``: disables interaction +* ``--version``: outputs the version number of the console application +* ``--help``: displays the command help +* ``--ansi|--no-ansi``: whether to force of disable coloring the output + +When using the ``FrameworkBundle``, two more options are predefined: + +* ``--env``: sets the Kernel configuration environment (defaults to ``APP_ENV``) +* ``--no-debug``: disables Kernel debug (defaults to ``APP_DEBUG``) + +So your custom commands can use them too out-of-the-box. + .. _`docopt standard`: http://docopt.org/ From d19f25c1480c7732652006c9bdaa7faa30b2def4 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Fri, 11 Aug 2023 15:17:05 +0200 Subject: [PATCH 142/670] [Console] Add `ProcessHelper` link to the list of helpers --- components/console/helpers/processhelper.rst | 9 +++++---- console.rst | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/components/console/helpers/processhelper.rst b/components/console/helpers/processhelper.rst index ef462cef731..e3f1c8a09d2 100644 --- a/components/console/helpers/processhelper.rst +++ b/components/console/helpers/processhelper.rst @@ -1,11 +1,12 @@ Process Helper ============== -The Process Helper shows processes as they're running and reports -useful information about process status. +The Process Helper shows processes as they're running and reports useful +information about process status. -To display process details, use the :class:`Symfony\\Component\\Console\\Helper\\ProcessHelper` -and run your command with verbosity. For example, running the following code with +To display process details, use the +:class:`Symfony\\Component\\Console\\Helper\\ProcessHelper` and run your command +with verbosity. For example, running the following code with a very verbose verbosity (e.g. ``-vv``):: use Symfony\Component\Process\Process; diff --git a/console.rst b/console.rst index 28b560d1f9b..ee4f5db48e7 100644 --- a/console.rst +++ b/console.rst @@ -593,6 +593,7 @@ tools capable of helping you with different tasks: * :doc:`/components/console/helpers/table`: displays tabular data as a table * :doc:`/components/console/helpers/debug_formatter`: provides functions to output debug information when running an external program +* :doc:`/components/console/helpers/processhelper`: allows to run processes using ``DebugProcessHelper`` * :doc:`/components/console/helpers/cursor`: allows to manipulate the cursor in the terminal .. _`exit status`: https://en.wikipedia.org/wiki/Exit_status From e98545b603dda7f131fec4a39ac7f01e4f39e5f0 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Fri, 11 Aug 2023 16:46:44 +0200 Subject: [PATCH 143/670] [Console] Mention `SymfonyStyle` in helpers doc --- .../console/helpers/formatterhelper.rst | 8 +++- components/console/helpers/progressbar.rst | 5 ++ components/console/helpers/questionhelper.rst | 47 ++++++++++--------- components/console/helpers/table.rst | 9 +++- console/style.rst | 8 ++++ 5 files changed, 53 insertions(+), 24 deletions(-) diff --git a/components/console/helpers/formatterhelper.rst b/components/console/helpers/formatterhelper.rst index 4e3f11940fd..135a5898778 100644 --- a/components/console/helpers/formatterhelper.rst +++ b/components/console/helpers/formatterhelper.rst @@ -13,7 +13,13 @@ in the default helper set and you can get it by calling The methods return a string, which you'll usually render to the console by passing it to the -:method:`OutputInterface::writeln ` method. +:method:`OutputInterface::writeln ` +method. + +.. note:: + + As an alternative, consider using the + :ref:`SymfonyStyle ` to display stylized blocks. Print Messages in a Section --------------------------- diff --git a/components/console/helpers/progressbar.rst b/components/console/helpers/progressbar.rst index 3e43452a737..dd4e5ec7f78 100644 --- a/components/console/helpers/progressbar.rst +++ b/components/console/helpers/progressbar.rst @@ -6,6 +6,11 @@ information, which updates as your command runs: .. image:: /_images/components/console/progressbar.gif +.. note:: + + As an alternative, consider using the + :ref:`SymfonyStyle ` to display a progress bar. + To display progress details, use the :class:`Symfony\\Component\\Console\\Helper\\ProgressBar`, pass it a total number of units, and advance the progress as the command executes:: diff --git a/components/console/helpers/questionhelper.rst b/components/console/helpers/questionhelper.rst index 01c7174e723..07cc75877b5 100644 --- a/components/console/helpers/questionhelper.rst +++ b/components/console/helpers/questionhelper.rst @@ -15,6 +15,11 @@ first argument, an :class:`Symfony\\Component\\Console\\Output\\OutputInterface` instance as the second argument and a :class:`Symfony\\Component\\Console\\Question\\Question` as last argument. +.. note:: + + As an alternative, consider using the + :ref:`SymfonyStyle ` to ask questions. + Asking the User for Confirmation -------------------------------- @@ -82,9 +87,9 @@ if you want to know a bundle name, you can add this to your command:: $question = new Question('Please enter the name of the bundle', 'AcmeDemoBundle'); $bundleName = $helper->ask($input, $output, $question); - + // ... do something with the bundleName - + return Command::SUCCESS; } @@ -120,7 +125,7 @@ from a predefined list:: $output->writeln('You have just selected: '.$color); // ... do something with the color - + return Command::SUCCESS; } @@ -162,7 +167,7 @@ this use :method:`Symfony\\Component\\Console\\Question\\ChoiceQuestion::setMult $colors = $helper->ask($input, $output, $question); $output->writeln('You have just selected: ' . implode(', ', $colors)); - + return Command::SUCCESS; } @@ -191,9 +196,9 @@ will be autocompleted as the user types:: $question->setAutocompleterValues($bundles); $bundleName = $helper->ask($input, $output, $question); - + // ... do something with the bundleName - + return Command::SUCCESS; } @@ -230,9 +235,9 @@ provide a callback function to dynamically generate suggestions:: $question->setAutocompleterCallback($callback); $filePath = $helper->ask($input, $output, $question); - + // ... do something with the filePath - + return Command::SUCCESS; } @@ -254,9 +259,9 @@ You can also specify if you want to not trim the answer by setting it directly w $question->setTrimmable(false); // if the users inputs 'elsa ' it will not be trimmed and you will get 'elsa ' as value $name = $helper->ask($input, $output, $question); - + // ... do something with the name - + return Command::SUCCESS; } @@ -285,9 +290,9 @@ the response to a question should allow multiline answers by passing ``true`` to $question->setMultiline(true); $answer = $helper->ask($input, $output, $question); - + // ... do something with the answer - + return Command::SUCCESS; } @@ -313,9 +318,9 @@ convenient for passwords:: $question->setHiddenFallback(false); $password = $helper->ask($input, $output, $question); - + // ... do something with the password - + return Command::SUCCESS; } @@ -347,7 +352,7 @@ convenient for passwords:: QuestionHelper::disableStty(); // ... - + return Command::SUCCESS; } @@ -376,9 +381,9 @@ method:: }); $bundleName = $helper->ask($input, $output, $question); - + // ... do something with the bundleName - + return Command::SUCCESS; } @@ -420,9 +425,9 @@ method:: $question->setMaxAttempts(2); $bundleName = $helper->ask($input, $output, $question); - + // ... do something with the bundleName - + return Command::SUCCESS; } @@ -482,9 +487,9 @@ You can also use a validator with a hidden question:: $question->setMaxAttempts(20); $password = $helper->ask($input, $output, $question); - + // ... do something with the password - + return Command::SUCCESS; } diff --git a/components/console/helpers/table.rst b/components/console/helpers/table.rst index e3bb282ed7e..e83ed352a3e 100644 --- a/components/console/helpers/table.rst +++ b/components/console/helpers/table.rst @@ -14,6 +14,11 @@ When building a console application it may be useful to display tabular data: | 80-902734-1-6 | And Then There Were None | Agatha Christie | +---------------+--------------------------+------------------+ +.. note:: + + As an alternative, consider using the + :ref:`SymfonyStyle ` to display a table. + To display a table, use :class:`Symfony\\Component\\Console\\Helper\\Table`, set the headers, set the rows and then render the table:: @@ -38,7 +43,7 @@ set the headers, set the rows and then render the table:: ]) ; $table->render(); - + return Command::SUCCESS; } } @@ -414,7 +419,7 @@ The only requirement to append rows is that the table must be rendered inside a $table->render(); $table->appendRow(['Symfony']); - + return Command::SUCCESS; } } diff --git a/console/style.rst b/console/style.rst index 59ad22ba3fa..98ab5d66b38 100644 --- a/console/style.rst +++ b/console/style.rst @@ -96,6 +96,8 @@ Titling Methods // ... +.. _symfony-style-content: + Content Methods ~~~~~~~~~~~~~~~ @@ -219,6 +221,8 @@ Admonition Methods 'Aenean sit amet arcu vitae sem faucibus porta', ]); +.. _symfony-style-progressbar: + Progress Bar Methods ~~~~~~~~~~~~~~~~~~~~ @@ -267,6 +271,8 @@ Progress Bar Methods Creates an instance of :class:`Symfony\\Component\\Console\\Helper\\ProgressBar` styled according to the Symfony Style Guide. +.. _symfony-style-questions: + User Input Methods ~~~~~~~~~~~~~~~~~~ @@ -329,6 +335,8 @@ User Input Methods $io->choice('Select the queue to analyze', ['queue1', 'queue2', 'queue3'], 'queue1'); +.. _symfony-style-blocks: + Result Methods ~~~~~~~~~~~~~~ From a94292604f8ad6f36d8b1b7db4e790a6be1ed8a3 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Mon, 14 Aug 2023 09:31:10 +0200 Subject: [PATCH 144/670] [Messenger] Delete obsolete `versionadded` directive Fixes #16535 --- messenger.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/messenger.rst b/messenger.rst index 64704f65b4e..6835e8dff11 100644 --- a/messenger.rst +++ b/messenger.rst @@ -2404,10 +2404,6 @@ middleware and *only* include your own: Middleware for Doctrine ~~~~~~~~~~~~~~~~~~~~~~~ -.. versionadded:: 1.11 - - The following Doctrine middleware was introduced in DoctrineBundle 1.11. - If you use Doctrine in your app, a number of optional middleware exist that you may want to use: From 2f275d87eee181ed465b3c4b4e53bc01901fb1df Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Mon, 14 Aug 2023 09:50:23 +0200 Subject: [PATCH 145/670] Minor --- service_container.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service_container.rst b/service_container.rst index 5b15dd83356..b372ae2b018 100644 --- a/service_container.rst +++ b/service_container.rst @@ -346,8 +346,8 @@ made. To do that, you create a new class:: class SiteUpdateManager { - private $messageGenerator; - private $mailer; + private MessageGenerator $messageGenerator; + private MailerInterface $mailer; public function __construct(MessageGenerator $messageGenerator, MailerInterface $mailer) { From 97ccd6c6722c4e2e2ff751667a3ea36e6e233dd7 Mon Sep 17 00:00:00 2001 From: PEHAUT-PIETRI Valmont Date: Mon, 14 Aug 2023 09:53:17 +0200 Subject: [PATCH 146/670] [Validator] add section for overridden properties --- validation.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/validation.rst b/validation.rst index 33b578216dd..661bf14252e 100644 --- a/validation.rst +++ b/validation.rst @@ -730,6 +730,27 @@ constraint that's applied to the class itself. When that class is validated, methods specified by that constraint are simply executed so that each can provide more custom validation. +Validating Object With Inheritance +---------------------------------- + +When you validate an object that extends another class, the validator +automatically validates constraints defined in the parent class as well. + +.. caution:: + + Note that overriding a property with others constraints in a child class + will not remove the constraints defined in the parent class on that same + property. + Instead, the constraints will be merged for that property. + This is related to Java Language Specification. + +.. tip:: + + If you want to override constraints defined in the parent class, you should + define them in a different validation group instead and validate the object + with that group. + See :doc:`Validation Groups ` for more information. + Debugging the Constraints ------------------------- From 6d0552c954e534e8438388db0c3ca29187926c73 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Mon, 14 Aug 2023 10:47:37 +0200 Subject: [PATCH 147/670] Ref for autowiring alias Replaces * https://github.com/symfony/symfony-docs/pull/17051 --- service_container.rst | 4 +++- service_container/autowiring.rst | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/service_container.rst b/service_container.rst index b372ae2b018..fa3681e06f9 100644 --- a/service_container.rst +++ b/service_container.rst @@ -1286,7 +1286,9 @@ admin email. In this case, each needs to have a unique service id: In this case, *two* services are registered: ``site_update_manager.superadmin`` and ``site_update_manager.normal_users``. Thanks to the alias, if you type-hint ``SiteUpdateManager`` the first (``site_update_manager.superadmin``) will be passed. -If you want to pass the second, you'll need to :ref:`manually wire the service `. + +If you want to pass the second, you'll need to :ref:`manually wire the service ` +or to create a named ref:`autowiring alias `. .. caution:: diff --git a/service_container/autowiring.rst b/service_container/autowiring.rst index cd53bbeef35..85b649778bf 100644 --- a/service_container/autowiring.rst +++ b/service_container/autowiring.rst @@ -423,6 +423,8 @@ Additionally, you can define several named autowiring aliases if you want to use one implementation in some cases, and another implementation in some other cases. +.. _autowiring-alias: + For instance, you may want to use the ``Rot13Transformer`` implementation by default when the ``TransformerInterface`` interface is type hinted, but use the ``UppercaseTransformer`` implementation in some From 0136cae526ff8f8c104dbf20c49cef8909d139ce Mon Sep 17 00:00:00 2001 From: jmsche Date: Mon, 14 Aug 2023 16:14:13 +0200 Subject: [PATCH 148/670] [Frontend] Create a UX bundle: fix code block indentation --- frontend/create_ux_bundle.rst | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/frontend/create_ux_bundle.rst b/frontend/create_ux_bundle.rst index 095b9c6d84b..12002d10356 100644 --- a/frontend/create_ux_bundle.rst +++ b/frontend/create_ux_bundle.rst @@ -70,22 +70,22 @@ In this case, the file located at ``[assets directory]/dist/controller.js`` will 1. Add the following to your ``package.json`` file: - .. code-block:: json - - { - "scripts": { - "build": "babel src --extensions .ts -d dist" - }, - "devDependencies": { - "@babel/cli": "^7.20.7", - "@babel/core": "^7.20.12", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.20.2", - "@babel/preset-typescript": "^7.18.6", - "@hotwired/stimulus": "^3.2.1", - "typescript": "^4.9.5" - } - } + .. code-block:: json + + { + "scripts": { + "build": "babel src --extensions .ts -d dist" + }, + "devDependencies": { + "@babel/cli": "^7.20.7", + "@babel/core": "^7.20.12", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/preset-env": "^7.20.2", + "@babel/preset-typescript": "^7.18.6", + "@hotwired/stimulus": "^3.2.1", + "typescript": "^4.9.5" + } + } 2. Run either ``npm install`` or ``yarn install`` to install the new dependencies. From 49470102e884275fd3eefb3d8ee227a1c595d92d Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Fri, 9 Apr 2021 11:46:53 -0400 Subject: [PATCH 149/670] [Form] add tailwindcss form theme docs --- _images/form/tailwindcss-form.png | Bin 0 -> 38574 bytes form/tailwindcss.rst | 95 ++++++++++++++++++++++++++++++ forms.rst | 1 + 3 files changed, 96 insertions(+) create mode 100644 _images/form/tailwindcss-form.png create mode 100644 form/tailwindcss.rst diff --git a/_images/form/tailwindcss-form.png b/_images/form/tailwindcss-form.png new file mode 100644 index 0000000000000000000000000000000000000000..8a290749149b5f0c5c5c2f897cbadc1a6be081da GIT binary patch literal 38574 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 literal 0 HcmV?d00001 diff --git a/form/tailwindcss.rst b/form/tailwindcss.rst new file mode 100644 index 00000000000..52f4eb857d9 --- /dev/null +++ b/form/tailwindcss.rst @@ -0,0 +1,95 @@ +Tailwind CSS Form Theme +======================= + +Symfony provides a minimal form theme for `Tailwind CSS`_. Tailwind is a *utility first* +CSS framework and provides *unlimited ways* to customize your forms. Tailwind has +an official `form plugin`_ that provides a basic form reset that standardizes their look +on all browsers. This form theme requires this plugin and adds a few basic tailwind +classes so out of the box, your forms will look decent. Customization is almost always +going to be required so this theme makes that easy. + +.. image:: /_images/form/tailwindcss-form.png + :align: center + +To use, first be sure you have installed and integrated `Tailwind CSS`_ and the +`form plugin`_. Follow their respective documentation to install both packages. + +If you prefer to use the Tailwind theme on a form by form basis, include the +``form_theme`` tag in the templates where those forms are used: + +.. code-block:: html+twig + + {# ... #} + {# this tag only applies to the forms defined in this template #} + {% form_theme form 'tailwind_2_layout.html.twig' %} + + {% block body %} +

User Sign Up:

+ {{ form(form) }} + {% endblock %} + +Customization +------------- + +Customizing CSS classes is especially important for this theme. + +Twig Form Functions +~~~~~~~~~~~~~~~~~~~ + +You can customize classes of individual fields by setting some class options. + +.. code-block:: twig + + {{ form_row(form.title, { + row_class: 'my row classes', + label_class: 'my label classes', + error_item_class: 'my error item classes', + widget_class: 'my widget classes', + widget_disabled_class: 'my disabled widget classes', + widget_errors_class: 'my widget with error classes', + }) }} + +When customizing the classes this way the defaults provided by the theme +are *overridden* opposed to merged as is the case with other themes. This +enables you to take full control of the classes without worrying about +*undoing* the generic defaults the theme provides. + +Project Specific Form Layout +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you have a generic Tailwind style for all your forms, you can create +a custom form theme using the Tailwind CSS theme as a base. + +.. code-block:: twig + + {% use 'tailwind_2_layout.html.twig' %} + + {%- block form_row -%} + {%- set row_class = row_class|default('my row classes') -%} + {{- parent() -}} + {%- endblock form_row -%} + + {%- block widget_attributes -%} + {%- set widget_class = widget_class|default('my widget classes') -%} + {%- set widget_disabled_class = widget_disabled_class|default('my disabled widget classes') -%} + {%- set widget_errors_class = widget_errors_class|default('my widget with error classes') -%} + {{- parent() -}} + {%- endblock widget_attributes -%} + + {%- block form_label -%} + {%- set label_class = label_class|default('my label classes') -%} + {{- parent() -}} + {%- endblock form_label -%} + + {%- block form_help -%} + {%- set help_class = help_class|default('my label classes') -%} + {{- parent() -}} + {%- endblock form_help -%} + + {%- block form_errors -%} + {%- set error_item_class = error_item_class|default('my error item classes') -%} + {{- parent() -}} + {%- endblock form_errors -%} + +.. _`Tailwind CSS`: https://tailwindcss.com +.. _`form plugin`: https://github.com/tailwindlabs/tailwindcss-forms diff --git a/forms.rst b/forms.rst index b3dd9e207a0..80e98ecb768 100644 --- a/forms.rst +++ b/forms.rst @@ -1029,6 +1029,7 @@ Form Themes and Customization: /form/bootstrap4 /form/bootstrap5 + /form/tailwindcss /form/form_customization /form/form_themes From e95def39f4a374071c52fa5e91d145333684135d Mon Sep 17 00:00:00 2001 From: iraouf Date: Tue, 15 Aug 2023 15:05:13 +0100 Subject: [PATCH 150/670] [configuration][override_dir_structure] autoload to autoload_runtime From Symfony 5.3 we use autoload_runtime instead of autoload --- configuration/override_dir_structure.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/override_dir_structure.rst b/configuration/override_dir_structure.rst index 2a5df047611..21e3f89d31b 100644 --- a/configuration/override_dir_structure.rst +++ b/configuration/override_dir_structure.rst @@ -254,7 +254,7 @@ your ``index.php`` front controller. If you renamed the directory, you're fine. But if you moved it in some way, you may need to modify these paths inside those files:: - require_once __DIR__.'/../path/to/vendor/autoload.php'; + require_once __DIR__.'/../path/to/vendor/autoload_runtime.php'; You also need to change the ``extra.public-dir`` option in the ``composer.json`` file: From 974914fe6aebf214617ade15fc6d4d1b84f07a78 Mon Sep 17 00:00:00 2001 From: Laurent VOULLEMIER Date: Wed, 16 Aug 2023 16:01:47 +0200 Subject: [PATCH 151/670] Remove paragraph about the impossibility to typehint a property --- service_container/injection_types.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/service_container/injection_types.rst b/service_container/injection_types.rst index 595ac79b185..d801ae0210d 100644 --- a/service_container/injection_types.rst +++ b/service_container/injection_types.rst @@ -364,15 +364,11 @@ Another possibility is setting public fields of the class directly:: }; There are mainly only disadvantages to using property injection, it is similar -to setter injection but with these additional important problems: +to setter injection but with this additional important problem: * You cannot control when the dependency is set at all, it can be changed at any point in the object's lifetime. -* You cannot use type hinting so you cannot be sure what dependency is injected - except by writing into the class code to explicitly test the class instance - before using it. - But, it is useful to know that this can be done with the service container, especially if you are working with code that is out of your control, such as in a third party library, which uses public properties for its dependencies. From 16bb4988c9e1c3c088f967eb33e70c32b50a51fa Mon Sep 17 00:00:00 2001 From: Maksim Tiugaev Date: Wed, 16 Aug 2023 22:00:54 +0300 Subject: [PATCH 152/670] [Routing] Fix xml and yaml example for forcing https --- routing.rst | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/routing.rst b/routing.rst index ad7062e5fa5..f4116bd2158 100644 --- a/routing.rst +++ b/routing.rst @@ -2979,8 +2979,7 @@ defined as annotations: controllers: resource: '../../src/Controller/' type: annotation - defaults: - schemes: [https] + schemes: [https] .. code-block:: xml @@ -2991,9 +2990,7 @@ defined as annotations: xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd"> - - HTTPS - + .. code-block:: php From 019c4e154641c51bf212865d50252201cf7ff50b Mon Sep 17 00:00:00 2001 From: David Rolston Date: Thu, 17 Aug 2023 16:01:12 -0700 Subject: [PATCH 153/670] Update page_creation.rst remove unstyled diff symbol This is a left over from docs showing both annotation and attribute route methods. The plus sign isn't handled because the code block is not a diff. Issue was brought up by a confused user. --- page_creation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/page_creation.rst b/page_creation.rst index a7d6e84c199..c7cdb533c3a 100644 --- a/page_creation.rst +++ b/page_creation.rst @@ -104,7 +104,7 @@ You can now add your route directly *above* the controller: // src/Controller/LuckyController.php // ... - + use Symfony\Component\Routing\Annotation\Route; + use Symfony\Component\Routing\Annotation\Route; class LuckyController { From 264ebcce09a7e51177367c4cc61748a663955afd Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Fri, 18 Aug 2023 11:54:17 +0200 Subject: [PATCH 154/670] [FrameworkBundle] Add documentation about using a DSN as the `session.handler_id` --- reference/configuration/framework.rst | 74 ++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index 52f9e78a823..393760b5a0d 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -1608,10 +1608,80 @@ handler_id **type**: ``string`` **default**: ``session.handler.native_file`` -The service id used for session storage. The default value ``'session.handler.native_file'`` +The service id or DSN used for session storage. The default value ``'session.handler.native_file'`` will let Symfony manage the sessions itself using files to store the session metadata. Set it to ``null`` to use the native PHP session mechanism. -You can also :ref:`store sessions in a database `. +It is possible to :ref:`store sessions in a database `, +and also to configure the session handler with a DSN: + +.. configuration-block:: + + .. code-block:: yaml + + # config/packages/framework.yaml + framework: + session: + # a few possible examples + handler_id: 'redis://localhost' + handler_id: '%env(REDIS_URL)%' + handler_id: '%env(DATABASE_URL)%' + handler_id: 'file://%kernel.project_dir%/var/sessions' + + .. code-block:: xml + + + + + + + + + + + .. code-block:: php + + // config/packages/framework.php + use function Symfony\Component\DependencyInjection\Loader\Configurator\env; + use Symfony\Config\FrameworkConfig; + + return static function (FrameworkConfig $framework): void { + // ... + + $framework->session() + // a few possible examples + ->handlerId('redis://localhost') + ->handlerId(env('REDIS_URL')) + ->handlerId(env('DATABASE_URL')) + ->handlerId('file://%kernel.project_dir%/var/sessions'); + }; + +.. note:: + + Supported DSN protocols are the following: + + * ``file`` + * ``redis`` + * ``rediss`` (Redis over TLS) + * ``memcached`` (requires :doc:`symfony/cache `) + * ``pdo_oci`` (requires :doc:`doctrine/dbal `) + * ``mssql`` + * ``mysql`` + * ``mysql2`` + * ``pgsql`` + * ``postgres`` + * ``postgresql`` + * ``sqlsrv`` + * ``sqlite`` + * ``sqlite3`` .. _name: From 422acb3bb665c80dd20e62fc9d905afb7c67c451 Mon Sep 17 00:00:00 2001 From: Maxim Tyugaev Date: Mon, 21 Aug 2023 10:45:30 +0300 Subject: [PATCH 155/670] [Lock] small typo --- components/lock.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lock.rst b/components/lock.rst index ea7a66f0432..a856523baa7 100644 --- a/components/lock.rst +++ b/components/lock.rst @@ -944,7 +944,7 @@ have synchronized clocks. PostgreSqlStore ~~~~~~~~~~~~~~~ -The PdoStore relies on the `Advisory Locks`_ properties of the PostgreSQL +The PostgreSqlStore relies on the `Advisory Locks`_ properties of the PostgreSQL database. That means that by using :ref:`PostgreSqlStore ` the locks will be automatically released at the end of the session in case the client cannot unlock for any reason. From 4121f05e43f1ee0c00f5fea3a518f2c2b7d88e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20P=C3=A9lisset?= Date: Thu, 17 Aug 2023 17:06:51 +0200 Subject: [PATCH 156/670] Fix !php/const syntax in yaml Quoted scalar is not evaluated --- reference/configuration/framework.rst | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/reference/configuration/framework.rst b/reference/configuration/framework.rst index 52f9e78a823..3de27707e94 100644 --- a/reference/configuration/framework.rst +++ b/reference/configuration/framework.rst @@ -2915,21 +2915,21 @@ This option also accepts a map of PHP errors to log levels: framework: php_errors: log: - '!php/const \E_DEPRECATED': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_USER_DEPRECATED': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_NOTICE': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_USER_NOTICE': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_STRICT': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_WARNING': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_USER_WARNING': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_COMPILE_WARNING': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_CORE_WARNING': !php/const Psr\Log\LogLevel::ERROR - '!php/const \E_USER_ERROR': !php/const Psr\Log\LogLevel::CRITICAL - '!php/const \E_RECOVERABLE_ERROR': !php/const Psr\Log\LogLevel::CRITICAL - '!php/const \E_COMPILE_ERROR': !php/const Psr\Log\LogLevel::CRITICAL - '!php/const \E_PARSE': !php/const Psr\Log\LogLevel::CRITICAL - '!php/const \E_ERROR': !php/const Psr\Log\LogLevel::CRITICAL - '!php/const \E_CORE_ERROR': !php/const Psr\Log\LogLevel::CRITICAL + !php/const \E_DEPRECATED: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_USER_DEPRECATED: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_NOTICE: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_USER_NOTICE: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_STRICT: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_WARNING: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_USER_WARNING: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_COMPILE_WARNING: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_CORE_WARNING: !php/const Psr\Log\LogLevel::ERROR + !php/const \E_USER_ERROR: !php/const Psr\Log\LogLevel::CRITICAL + !php/const \E_RECOVERABLE_ERROR: !php/const Psr\Log\LogLevel::CRITICAL + !php/const \E_COMPILE_ERROR: !php/const Psr\Log\LogLevel::CRITICAL + !php/const \E_PARSE: !php/const Psr\Log\LogLevel::CRITICAL + !php/const \E_ERROR: !php/const Psr\Log\LogLevel::CRITICAL + !php/const \E_CORE_ERROR: !php/const Psr\Log\LogLevel::CRITICAL .. code-block:: xml From 4b338b6f2fa02a043e7df3e3439c14258c405db1 Mon Sep 17 00:00:00 2001 From: Reza Rabbani <50789773+thrashzone13@users.noreply.github.com> Date: Mon, 21 Aug 2023 13:11:23 +0200 Subject: [PATCH 157/670] Add missing use case for Response --- routing.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/routing.rst b/routing.rst index f4116bd2158..3b31d7dca13 100644 --- a/routing.rst +++ b/routing.rst @@ -70,6 +70,7 @@ do so, create a :doc:`controller class ` like the following: namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class BlogController extends AbstractController From d7548895b412bc5bd0f9c60be8afe125d47000b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tekli=C5=84ski?= Date: Thu, 24 Aug 2023 00:50:12 +0200 Subject: [PATCH 158/670] [Serializer] Fix the subject agreement mistake - grammar --- components/serializer.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/serializer.rst b/components/serializer.rst index 29c008ce2c4..481a48efea6 100644 --- a/components/serializer.rst +++ b/components/serializer.rst @@ -459,7 +459,7 @@ It is also possible to serialize only a set of specific attributes:: Only attributes that are not ignored (see below) are available. If some serialization groups are set, only attributes allowed by those groups can be used. -As for groups, attributes can be selected during both the serialization and deserialization process. +As for groups, attributes can be selected during both the serialization and deserialization processes. .. _serializer_ignoring-attributes: From 2b248d478cdabfbc4fc39e7e8af9dca0946fab7c Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Thu, 24 Aug 2023 22:16:53 +0200 Subject: [PATCH 159/670] Minor --- routing.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/routing.rst b/routing.rst index 3b31d7dca13..6b39604eed0 100644 --- a/routing.rst +++ b/routing.rst @@ -90,6 +90,7 @@ do so, create a :doc:`controller class ` like the following: namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class BlogController extends AbstractController From adb878680c7df174c5d0b68e9fa544200a73632a Mon Sep 17 00:00:00 2001 From: Damien Carrier Date: Fri, 25 Aug 2023 14:01:40 +0200 Subject: [PATCH 160/670] [Server] Fix typo in Symfony Local Web Server page --- setup/symfony_server.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/symfony_server.rst b/setup/symfony_server.rst index c89a3e23f2a..a12feb7a5c4 100644 --- a/setup/symfony_server.rst +++ b/setup/symfony_server.rst @@ -60,7 +60,7 @@ run the Symfony server in the background: On macOS, when starting the Symfony server you might see a warning dialog asking *"Do you want the application to accept incoming network connections?"*. - This happens when running unsigned appplications that are not listed in the + This happens when running unsigned applications that are not listed in the firewall list. The solution is to run this command that signs the Symfony binary: .. code-block:: terminal From ab647bf2ed6e56d0a81c2a2a331cb88f045ebf43 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Sun, 27 Aug 2023 14:28:47 +0200 Subject: [PATCH 161/670] Missing information about payload in callback --- reference/constraints/Callback.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reference/constraints/Callback.rst b/reference/constraints/Callback.rst index e3f68c2b788..ea870683cc1 100644 --- a/reference/constraints/Callback.rst +++ b/reference/constraints/Callback.rst @@ -304,11 +304,12 @@ callback method: * A closure. Concrete callbacks receive an :class:`Symfony\\Component\\Validator\\Context\\ExecutionContextInterface` -instance as only argument. +instance as the first argument and the :ref:`payload option ` as the second argument. Static or closure callbacks receive the validated object as the first argument -and the :class:`Symfony\\Component\\Validator\\Context\\ExecutionContextInterface` -instance as the second argument. +, the :class:`Symfony\\Component\\Validator\\Context\\ExecutionContextInterface` +instance as the second argument and the :ref:`payload option ` as the +third argument. .. include:: /reference/constraints/_groups-option.rst.inc From fa31e9330cf0620398f95a27dc9b76da9d3bab49 Mon Sep 17 00:00:00 2001 From: Florian Date: Fri, 25 Aug 2023 08:56:12 +0200 Subject: [PATCH 162/670] Clearer difference with max and quiet options --- components/phpunit_bridge.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/phpunit_bridge.rst b/components/phpunit_bridge.rst index 288989dcd87..24562236be5 100644 --- a/components/phpunit_bridge.rst +++ b/components/phpunit_bridge.rst @@ -325,6 +325,10 @@ It's also possible to change verbosity per deprecation type. For example, using ``quiet[]=indirect&quiet[]=other`` will hide details for deprecations of types "indirect" and "other". +Note that `quiet` hides details for the specified deprecation types, but will +not change the outcome in terms of exit code. That's what :ref:`max ` is for, and both +settings are orthogonal. + .. versionadded:: 5.1 The ``quiet`` option was introduced in Symfony 5.1. From c2f7a56ba223631aa50f75e6118e58aeaaab33fc Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 28 Aug 2023 09:34:58 +0200 Subject: [PATCH 163/670] Minor tweaks --- components/phpunit_bridge.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/phpunit_bridge.rst b/components/phpunit_bridge.rst index 24562236be5..b1965cca0d6 100644 --- a/components/phpunit_bridge.rst +++ b/components/phpunit_bridge.rst @@ -215,6 +215,8 @@ message, enclosed with ``/``. For example, with: `PHPUnit`_ will stop your test suite once a deprecation notice is triggered whose message contains the ``"foobar"`` string. +.. _making-tests-fail: + Making Tests Fail ~~~~~~~~~~~~~~~~~ @@ -325,9 +327,9 @@ It's also possible to change verbosity per deprecation type. For example, using ``quiet[]=indirect&quiet[]=other`` will hide details for deprecations of types "indirect" and "other". -Note that `quiet` hides details for the specified deprecation types, but will -not change the outcome in terms of exit code. That's what :ref:`max ` is for, and both -settings are orthogonal. +The ``quiet`` option hides details for the specified deprecation types, but will +not change the outcome in terms of exit code. That's what :ref:`max ` +is for, and both settings are orthogonal. .. versionadded:: 5.1 From e0d1b355cf4e8d00231a91b16f4e2cc3bd82fa04 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Fri, 11 Aug 2023 17:26:11 +0200 Subject: [PATCH 164/670] [Console] Improve console events doc --- components/console/events.rst | 7 ++++--- console.rst | 6 ++++++ console/calling_commands.rst | 34 +++++++++++++++++++++------------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/components/console/events.rst b/components/console/events.rst index dc03a8a88d9..45f228e7399 100644 --- a/components/console/events.rst +++ b/components/console/events.rst @@ -17,7 +17,8 @@ the wheel, it uses the Symfony EventDispatcher component to do the work:: .. caution:: Console events are only triggered by the main command being executed. - Commands called by the main command will not trigger any event. + Commands called by the main command will not trigger any event, unless + run by the application itself, see :doc:`/console/calling_commands`. The ``ConsoleEvents::COMMAND`` Event ------------------------------------ @@ -171,10 +172,10 @@ Listeners receive a use Symfony\Component\Console\Event\ConsoleSignalEvent; $dispatcher->addListener(ConsoleEvents::SIGNAL, function (ConsoleSignalEvent $event) { - + // gets the signal number $signal = $event->getHandlingSignal(); - + if (\SIGINT === $signal) { echo "bye bye!"; } diff --git a/console.rst b/console.rst index 28b560d1f9b..6f74c2e657e 100644 --- a/console.rst +++ b/console.rst @@ -574,6 +574,12 @@ registers an :doc:`event subscriber ` to listen to the :ref:`ConsoleEvents::TERMINATE event ` and adds a log message whenever a command doesn't finish with the ``0`` `exit status`_. +Using Events And Handling Signals +--------------------------------- + +When a command is running, many events are dispatched, one of them allows to +react to signals, read more in :doc:`this section `. + Learn More ---------- diff --git a/console/calling_commands.rst b/console/calling_commands.rst index 1a9cce4e6c3..35d388965ad 100644 --- a/console/calling_commands.rst +++ b/console/calling_commands.rst @@ -8,13 +8,13 @@ or if you want to create a "meta" command that runs a bunch of other commands changed on the production servers: clearing the cache, generating Doctrine proxies, dumping web assets, ...). -Use the :method:`Symfony\\Component\\Console\\Application::find` method to -find the command you want to run by passing the command name. Then, create a -new :class:`Symfony\\Component\\Console\\Input\\ArrayInput` with the -arguments and options you want to pass to the command. +Use the :method:`Symfony\\Component\\Console\\Application::doRun`. Then, create +a new :class:`Symfony\\Component\\Console\\Input\\ArrayInput` with the +arguments and options you want to pass to the command. The command name must be +the first argument. -Eventually, calling the ``run()`` method actually runs the command and returns -the returned code from the command (return value from command's ``execute()`` +Eventually, calling the ``doRun()`` method actually runs the command and returns +the returned code from the command (return value from command ``execute()`` method):: // ... @@ -29,15 +29,14 @@ method):: protected function execute(InputInterface $input, OutputInterface $output): int { - $command = $this->getApplication()->find('demo:greet'); - - $arguments = [ + $greetInput = new ArrayInput([ + // the command name is passed as first argument + 'command' => 'demo:greet', 'name' => 'Fabien', '--yell' => true, - ]; + ]); - $greetInput = new ArrayInput($arguments); - $returnCode = $command->run($greetInput, $output); + $returnCode = $this->getApplication()->doRun($greetInput, $output); // ... } @@ -47,7 +46,16 @@ method):: If you want to suppress the output of the executed command, pass a :class:`Symfony\\Component\\Console\\Output\\NullOutput` as the second - argument to ``$command->run()``. + argument to ``$application->doRun()``. + +.. note:: + + Using ``doRun()`` instead of ``run()`` prevents autoexiting and allows to + return the exit code instead. + + Also, using ``$this->getApplication()->doRun()`` instead of + ``$this->getApplication()->find('demo:greet')->run()`` will allow proper + events to be dispatched for that inner command as well. .. caution:: From 8c32fd00cfdf8cf02d63213a0cda7cb88db570c0 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 28 Aug 2023 10:51:03 +0200 Subject: [PATCH 165/670] Tweaks --- page_creation.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/page_creation.rst b/page_creation.rst index c7cdb533c3a..24735ffbc85 100644 --- a/page_creation.rst +++ b/page_creation.rst @@ -89,7 +89,7 @@ Annotation Routes Instead of defining your route in YAML, Symfony also allows you to use *annotation* or *attribute* routes. Attributes are built-in in PHP starting from PHP 8. In earlier -PHP versions you can use annotations. To do this, install the annotations package: +PHP versions you can use annotations, which require installing this package: .. code-block:: terminal @@ -108,9 +108,9 @@ You can now add your route directly *above* the controller: class LuckyController { - + /** - + * @Route("/lucky/number") - + */ + /** + * @Route("/lucky/number") + */ public function number(): Response { // this looks exactly the same @@ -122,11 +122,11 @@ You can now add your route directly *above* the controller: // src/Controller/LuckyController.php // ... - + use Symfony\Component\Routing\Annotation\Route; + use Symfony\Component\Routing\Annotation\Route; class LuckyController { - + #[Route('/lucky/number')] + #[Route('/lucky/number')] public function number(): Response { // this looks exactly the same From 61fcb40c53d12328d2658747cfa05de4acf1a510 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 28 Aug 2023 11:58:45 +0200 Subject: [PATCH 166/670] Tweaks --- reference/constraints/Callback.rst | 11 ++++++----- reference/constraints/_payload-option.rst.inc | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/reference/constraints/Callback.rst b/reference/constraints/Callback.rst index ea870683cc1..2dbfa7657a5 100644 --- a/reference/constraints/Callback.rst +++ b/reference/constraints/Callback.rst @@ -304,12 +304,13 @@ callback method: * A closure. Concrete callbacks receive an :class:`Symfony\\Component\\Validator\\Context\\ExecutionContextInterface` -instance as the first argument and the :ref:`payload option ` as the second argument. +instance as the first argument and the :ref:`payload option ` +as the second argument. -Static or closure callbacks receive the validated object as the first argument -, the :class:`Symfony\\Component\\Validator\\Context\\ExecutionContextInterface` -instance as the second argument and the :ref:`payload option ` as the -third argument. +Static or closure callbacks receive the validated object as the first argument, +the :class:`Symfony\\Component\\Validator\\Context\\ExecutionContextInterface` +instance as the second argument and the :ref:`payload option ` +as the third argument. .. include:: /reference/constraints/_groups-option.rst.inc diff --git a/reference/constraints/_payload-option.rst.inc b/reference/constraints/_payload-option.rst.inc index 5121ba1ae51..a76c9a4a29d 100644 --- a/reference/constraints/_payload-option.rst.inc +++ b/reference/constraints/_payload-option.rst.inc @@ -1,3 +1,5 @@ +.. _reference-constraints-payload: + ``payload`` ~~~~~~~~~~~ From c01bfc0b8dbf8853a1875893d3e4a4622b851564 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Mon, 28 Aug 2023 12:54:58 +0200 Subject: [PATCH 167/670] [Console] Fix a typo after #18739 --- console.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console.rst b/console.rst index 7c7f4cfc5d1..cbe1c3816f1 100644 --- a/console.rst +++ b/console.rst @@ -610,7 +610,7 @@ tools capable of helping you with different tasks: * :doc:`/components/console/helpers/table`: displays tabular data as a table * :doc:`/components/console/helpers/debug_formatter`: provides functions to output debug information when running an external program -* :doc:`/components/console/helpers/processhelper`: allows to run processes using ``DebugProcessHelper`` +* :doc:`/components/console/helpers/processhelper`: allows to run processes using ``DebugFormatterHelper`` * :doc:`/components/console/helpers/cursor`: allows to manipulate the cursor in the terminal .. _`exit status`: https://en.wikipedia.org/wiki/Exit_status From da9e3b7433a4bb51f7575ca18ac697f5f3dc5b2f Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 28 Aug 2023 13:35:33 +0200 Subject: [PATCH 168/670] Reword --- validation.rst | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/validation.rst b/validation.rst index 661bf14252e..8fc5d71a6f4 100644 --- a/validation.rst +++ b/validation.rst @@ -736,20 +736,13 @@ Validating Object With Inheritance When you validate an object that extends another class, the validator automatically validates constraints defined in the parent class as well. -.. caution:: - - Note that overriding a property with others constraints in a child class - will not remove the constraints defined in the parent class on that same - property. - Instead, the constraints will be merged for that property. - This is related to Java Language Specification. - -.. tip:: +**The constraints defined in the parent properties will be applied to the child +properties even if the child properties override those constraints**. Symfony +will always merge the parent constraints for each property. - If you want to override constraints defined in the parent class, you should - define them in a different validation group instead and validate the object - with that group. - See :doc:`Validation Groups ` for more information. +You can't change this behavior, but you can overcome it by defining the parent +and the child contraints in different :doc:`validation groups ` +and then select the appropriate group when validating each object. Debugging the Constraints ------------------------- From 951fc9b1783c0e87e3c5d39d7f1e6d9126686108 Mon Sep 17 00:00:00 2001 From: MWJeff Date: Fri, 11 Aug 2023 10:50:38 +0200 Subject: [PATCH 169/670] Prefer placing services before query parameters --- doctrine.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doctrine.rst b/doctrine.rst index 12b2a44bf46..d5cff272241 100644 --- a/doctrine.rst +++ b/doctrine.rst @@ -536,7 +536,7 @@ and injected by the dependency injection container:: class ProductController extends AbstractController { #[Route('/product/{id}', name: 'product_show')] - public function show(int $id, ProductRepository $productRepository): Response + public function show(ProductRepository $productRepository, int $id): Response { $product = $productRepository ->find($id); From f24201eb59a6c4994207f5d79a679f2b27a45d06 Mon Sep 17 00:00:00 2001 From: R1n0x Date: Fri, 11 Aug 2023 23:45:36 +0200 Subject: [PATCH 170/670] Update messenger.rst Added explanation on how to set default messenger table name --- messenger.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/messenger.rst b/messenger.rst index 6835e8dff11..625e15f22b0 100644 --- a/messenger.rst +++ b/messenger.rst @@ -1445,6 +1445,14 @@ a table named ``messenger_messages``. The ability to automatically generate a migration for the ``messenger_messages`` table was introduced in Symfony 5.1 and DoctrineBundle 2.1. +If you would like to change the name of the default table you can pass it in the DSN +settings by using the ``table_name`` option. + +.. code-block:: env + + # .env + MESSENGER_TRANSPORT_DSN=doctrine://default?table_name=your_table_name + Or, to create the table yourself, set the ``auto_setup`` option to ``false`` and :ref:`generate a migration `. From 24b9fa4f6487262ea2e2f375e687f4b3b5c3831d Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 28 Aug 2023 15:51:23 +0200 Subject: [PATCH 171/670] Tweaks --- messenger.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/messenger.rst b/messenger.rst index 625e15f22b0..b3840f77344 100644 --- a/messenger.rst +++ b/messenger.rst @@ -1445,13 +1445,13 @@ a table named ``messenger_messages``. The ability to automatically generate a migration for the ``messenger_messages`` table was introduced in Symfony 5.1 and DoctrineBundle 2.1. -If you would like to change the name of the default table you can pass it in the DSN -settings by using the ``table_name`` option. +If you want to change the default table name, pass a custom table name in the +DSN by using the ``table_name`` option: .. code-block:: env # .env - MESSENGER_TRANSPORT_DSN=doctrine://default?table_name=your_table_name + MESSENGER_TRANSPORT_DSN=doctrine://default?table_name=your_custom_table_name Or, to create the table yourself, set the ``auto_setup`` option to ``false`` and :ref:`generate a migration `. From 7f0df2b525d6ce0af0bc67eea5f9f7a14635185c Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 29 Aug 2023 13:53:04 +0200 Subject: [PATCH 172/670] [HttpFoundation] Added MarshallingSessionHandler --- session.rst | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/session.rst b/session.rst index 058c0984b8c..9327d75619e 100644 --- a/session.rst +++ b/session.rst @@ -1468,6 +1468,85 @@ library, but you can adapt it to any other library that you may be using:: } } +Another possibility to encrypt session data is to decorate the +``session.marshaller`` service, which points out to +:class:`Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler`. +You can decorate this handler with a marshaller that uses encryption, +like the :class:`Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller`. + +First, you need to generate a secure key and add it to your :doc:`secret +store ` as ``SESSION_DECRYPTION_FILE``: + +.. code-block:: terminal + + $ php -r 'echo base64_encode(sodium_crypto_box_keypair());' + +Then, register the ``SodiumMarshaller`` service using this key: + +.. configuration-block:: + + .. code-block:: yaml + + # config/services.yaml + services: + + # ... + Symfony\Component\Cache\Marshaller\SodiumMarshaller: + decorates: 'session.marshaller' + arguments: + - ['%env(file:resolve:SESSION_DECRYPTION_FILE)%'] + - '@Symfony\Component\Cache\Marshaller\SodiumMarshaller.inner' + + .. code-block:: xml + + + + + + + + env(file:resolve:SESSION_DECRYPTION_FILE) + + + + + + + .. code-block:: php + + // config/services.php + use Symfony\Component\Cache\Marshaller\SodiumMarshaller; + use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; + // ... + + return function(ContainerConfigurator $container) { + $services = $container->services(); + + // ... + + $services->set(SodiumMarshaller::class) + ->decorate('session.marshaller') + ->args([ + [env('file:resolve:SESSION_DECRYPTION_FILE')], + service(SodiumMarshaller::class.'.inner'), + ]); + }; + +.. caution:: + + This will encrypt the values of the cache items, but not the cache keys. Be + careful not to leak sensitive data in the keys. + +.. versionadded:: 5.1 + + The :class:`Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller` + and :class:`Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler` + classes were introduced in Symfony 5.1. + Read-only Guest Sessions ~~~~~~~~~~~~~~~~~~~~~~~~ From e159fc1271db1d1a05575743d9d9e2637ecd1d95 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 29 Aug 2023 16:22:10 +0200 Subject: [PATCH 173/670] [HttpClient] make HttpClient::create() return an AmpHttpClient when amphp/http-client is found but curl is not or too old --- http_client.rst | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/http_client.rst b/http_client.rst index 399199f0557..131c3d4eecd 100644 --- a/http_client.rst +++ b/http_client.rst @@ -854,15 +854,28 @@ To leverage all these design benefits, the cURL extension is needed. Enabling cURL Support ~~~~~~~~~~~~~~~~~~~~~ -This component supports both the native PHP streams and cURL to make the HTTP -requests. Although both are interchangeable and provide the same features, -including concurrent requests, HTTP/2 is only supported when using cURL. +This component supports the native PHP streams, ``amphp/http-client`` and cURL to +make the HTTP requests. Although they are interchangeable and provide the +same features, including concurrent requests, HTTP/2 is only supported when +using cURL or ``amphp/http-client``. + +.. note:: + + To use the :class:`Symfony\\Component\\HttpClient\\AmpHttpClient`, the + `amphp/http-client`_ package must be installed. + +.. versionadded:: 5.1 + + Integration with ``amphp/http-client`` was introduced in Symfony 5.1. The :method:`Symfony\\Component\\HttpClient\\HttpClient::create` method -selects the cURL transport if the `cURL PHP extension`_ is enabled and falls -back to PHP streams otherwise. If you prefer to select the transport -explicitly, use the following classes to create the client:: +selects the cURL transport if the `cURL PHP extension`_ is enabled. It falls +back to ``AmpHttpClient`` if cURL couldn't be found or is too old. Finally, if +``AmpHttpClient`` is not available, it falls back to PHP streams. +If you prefer to select the transport explicitly, use the following classes +to create the client:: + use Symfony\Component\HttpClient\AmpHttpClient; use Symfony\Component\HttpClient\CurlHttpClient; use Symfony\Component\HttpClient\NativeHttpClient; @@ -872,9 +885,12 @@ explicitly, use the following classes to create the client:: // uses the cURL PHP extension $client = new CurlHttpClient(); + // uses the client from the `amphp/http-client` package + $client = new AmpHttpClient(); + When using this component in a full-stack Symfony application, this behavior is not configurable and cURL will be used automatically if the cURL PHP extension -is installed and enabled. Otherwise, the native PHP streams will be used. +is installed and enabled, and will fall back as explained above. Configuring CurlHttpClient Options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -928,7 +944,7 @@ HTTP/2 Support When requesting an ``https`` URL, HTTP/2 is enabled by default if one of the following tools is installed: -* The `libcurl`_ package version 7.36 or higher; +* The `libcurl`_ package version 7.36 or higher, used with PHP >= 7.2.17 / 7.3.4; * The `amphp/http-client`_ Packagist package version 4.2 or higher. .. versionadded:: 5.1 @@ -984,9 +1000,9 @@ To force HTTP/2 for ``http`` URLs, you need to enable it explicitly via the $client = HttpClient::create(['http_version' => '2.0']); -Support for HTTP/2 PUSH works out of the box when libcurl >= 7.61 is used with -PHP >= 7.2.17 / 7.3.4: pushed responses are put into a temporary cache and are -used when a subsequent request is triggered for the corresponding URLs. +Support for HTTP/2 PUSH works out of the box when using a compatible client: +pushed responses are put into a temporary cache and are used when a +subsequent request is triggered for the corresponding URLs. Processing Responses -------------------- From dbb7f8526b4c63b863dfa5a7a71b9e749fa7639c Mon Sep 17 00:00:00 2001 From: Simo Heinonen Date: Tue, 29 Aug 2023 18:00:41 +0300 Subject: [PATCH 174/670] Update lock.rst Redis store doesn't support blocking so doesn't make sense to use it as an example --- components/lock.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/lock.rst b/components/lock.rst index a856523baa7..f38b8d27e63 100644 --- a/components/lock.rst +++ b/components/lock.rst @@ -145,9 +145,9 @@ pass ``true`` as the argument of the ``acquire()`` method. This is called a lock is acquired:: use Symfony\Component\Lock\LockFactory; - use Symfony\Component\Lock\Store\RedisStore; + use Symfony\Component\Lock\Store\FlockStore; - $store = new RedisStore(new \Predis\Client('tcp://localhost:6379')); + $store = new FlockStore('/var/stores'); $factory = new LockFactory($store); $lock = $factory->createLock('pdf-creation'); From f78344d78443f7c17d56d0791a70faa9ad9e05c8 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 29 Aug 2023 17:56:57 +0200 Subject: [PATCH 175/670] Tweaks --- http_client.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/http_client.rst b/http_client.rst index 131c3d4eecd..8fe16087680 100644 --- a/http_client.rst +++ b/http_client.rst @@ -854,10 +854,10 @@ To leverage all these design benefits, the cURL extension is needed. Enabling cURL Support ~~~~~~~~~~~~~~~~~~~~~ -This component supports the native PHP streams, ``amphp/http-client`` and cURL to -make the HTTP requests. Although they are interchangeable and provide the -same features, including concurrent requests, HTTP/2 is only supported when -using cURL or ``amphp/http-client``. +This component can make HTTP requests using native PHP streams and the +``amphp/http-client`` and cURL libraries. Although they are interchangeable and +provide the same features, including concurrent requests, HTTP/2 is only supported +when using cURL or ``amphp/http-client``. .. note:: From dc67e902574d7ef40198226a36c718b349444a72 Mon Sep 17 00:00:00 2001 From: wuchen90 Date: Wed, 30 Aug 2023 00:57:42 +0200 Subject: [PATCH 176/670] Fix Serializer context configuration in YAML --- serializer.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/serializer.rst b/serializer.rst index 7bf972e908e..32140aa1e6d 100644 --- a/serializer.rst +++ b/serializer.rst @@ -212,8 +212,8 @@ You can also specify the context on a per-property basis:: App\Model\Person: attributes: createdAt: - context: - datetime_format: 'Y-m-d' + contexts: + - { context: { datetime_format: 'Y-m-d' } } .. code-block:: xml From 52aee8185e943cbe759c62f39698f78d6c7af055 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Wed, 30 Aug 2023 11:38:11 +0200 Subject: [PATCH 177/670] [DependencyInjection] Allow loading and dumping tags with an attribute named "name" --- service_container/tags.rst | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/service_container/tags.rst b/service_container/tags.rst index 87f354434c2..c6ed02067e7 100644 --- a/service_container/tags.rst +++ b/service_container/tags.rst @@ -515,6 +515,45 @@ To answer this, change the service declaration: ; }; +.. tip:: + + In XML and YAML format, you may provide the tag an attribute called ``name``. + When doing so, this is the syntax you should follow: + + .. configuration-block:: + + .. code-block:: yaml + + # config/services.yaml + services: + MailerSmtpTransport: + arguments: ['%mailer_host%'] + tags: + - app.mail_transport: { name: 'arbitrary-value', alias: 'smtp' } + + .. code-block:: xml + + + + + + + + %mailer_host% + + app.mail_transport + + + + + .. versionadded:: 5.1 + + The possibility to add the ``name`` attribute to a tag in XML and YAML + formats was introduced in Symfony 5.1. + .. tip:: In YAML format, you may provide the tag as a simple string as long as From 37c4df75a5bb7b001c9662d66921bc427bc48150 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Wed, 30 Aug 2023 13:36:19 +0200 Subject: [PATCH 178/670] [Form] Added `AbstractChoiceLoader` --- .../forms/types/options/choice_loader.rst.inc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reference/forms/types/options/choice_loader.rst.inc b/reference/forms/types/options/choice_loader.rst.inc index 67062c56ada..23bb10c7449 100644 --- a/reference/forms/types/options/choice_loader.rst.inc +++ b/reference/forms/types/options/choice_loader.rst.inc @@ -26,6 +26,22 @@ This will cause the call of ``StaticClass::getConstants()`` to not happen if the request is redirected and if there is no pre set or submitted data. Otherwise the choice options would need to be resolved thus triggering the callback. +If the ``CallbackChoiceLoader`` doesn't fit your needs and you want to create +your own loader, you can either create a loader by implementing the +:class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\ChoiceLoaderInterface` +or by extending the +:class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\AbstractChoiceLoader`. +This abstract class allows to save some boilerplate by implementing some +of the :class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\ChoiceLoaderInterface` +methods. Thus, you'll only have to implement the +:method:`Symfony\\Component\\Form\\ChoiceList\\Loader\\AbstractChoiceLoader::loadChoices` +method to have a fully functional choice loader. + +.. versionadded:: 5.1 + + The :class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\AbstractChoiceLoader` + class was introduced in Symfony 5.1. + When you're defining a custom choice type that may be reused in many fields (like entries of a collection) or reused in multiple forms at once, you should use the :class:`Symfony\\Component\\Form\\ChoiceList\\ChoiceList` From 5582881850af3b25000754bbb7cbe3baea3ff2f9 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 31 Aug 2023 13:17:08 +0200 Subject: [PATCH 179/670] Tweak --- reference/forms/types/options/choice_loader.rst.inc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/reference/forms/types/options/choice_loader.rst.inc b/reference/forms/types/options/choice_loader.rst.inc index 23bb10c7449..a906007c324 100644 --- a/reference/forms/types/options/choice_loader.rst.inc +++ b/reference/forms/types/options/choice_loader.rst.inc @@ -26,14 +26,13 @@ This will cause the call of ``StaticClass::getConstants()`` to not happen if the request is redirected and if there is no pre set or submitted data. Otherwise the choice options would need to be resolved thus triggering the callback. -If the ``CallbackChoiceLoader`` doesn't fit your needs and you want to create -your own loader, you can either create a loader by implementing the +If the built-in ``CallbackChoiceLoader`` doesn't fit your needs, you can create +your own loader by implementing the :class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\ChoiceLoaderInterface` or by extending the :class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\AbstractChoiceLoader`. -This abstract class allows to save some boilerplate by implementing some -of the :class:`Symfony\\Component\\Form\\ChoiceList\\Loader\\ChoiceLoaderInterface` -methods. Thus, you'll only have to implement the +This abstract class saves you some boilerplate by implementing some methods of +the interface so you'll only have to implement the :method:`Symfony\\Component\\Form\\ChoiceList\\Loader\\AbstractChoiceLoader::loadChoices` method to have a fully functional choice loader. From 6e6565b02e09210a11f98f0adcf470c958d86f08 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 31 Aug 2023 14:56:24 +0200 Subject: [PATCH 180/670] Tweaks --- service_container/tags.rst | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/service_container/tags.rst b/service_container/tags.rst index c6ed02067e7..0bbe295cb7e 100644 --- a/service_container/tags.rst +++ b/service_container/tags.rst @@ -517,8 +517,9 @@ To answer this, change the service declaration: .. tip:: - In XML and YAML format, you may provide the tag an attribute called ``name``. - When doing so, this is the syntax you should follow: + The ``name`` attribute is used by default to define the name of the tag. + If you want to add a ``name`` attribute to some tag in XML or YAML formats, + you need to use this special syntax: .. configuration-block:: @@ -529,6 +530,9 @@ To answer this, change the service declaration: MailerSmtpTransport: arguments: ['%mailer_host%'] tags: + # this is a tag called 'app.mail_transport' + - { name: 'app.mail_transport', alias: 'smtp' } + # this is a tag called 'app.mail_transport' with two attributes ('name' and 'alias') - app.mail_transport: { name: 'arbitrary-value', alias: 'smtp' } .. code-block:: xml @@ -543,7 +547,9 @@ To answer this, change the service declaration: %mailer_host% - + + + app.mail_transport From 495b5eb2ee214ca094ea4f6ddcdd671dba113788 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 31 Aug 2023 15:25:48 +0200 Subject: [PATCH 181/670] [Messenger] Add `FlattenExceptionNormalizer` --- components/messenger.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/messenger.rst b/components/messenger.rst index 263a4dd1cca..e78daa1c8d8 100644 --- a/components/messenger.rst +++ b/components/messenger.rst @@ -161,9 +161,21 @@ Here are some important envelope stamps that are shipped with the Symfony Messen #. :class:`Symfony\\Component\\Messenger\\Stamp\\ErrorDetailsStamp`, an internal stamp when a message fails due to an exception in the handler. +.. note:: + + The :class:`Symfony\\Component\\Messenger\\Stamp\\ErrorDetailsStamp` stamp + contains a :class:`Symfony\\Component\\ErrorHandler\\Exception\\FlattenException`, + which is a representation of the exception that made the message failed. This + exception can be retrieved with the + :method:`Symfony\\Component\\Messenger\\Stamp\\ErrorDetailsStamp::getFlattenException` + method. This exception is normalized thanks to the + :class:`Symfony\\Component\\Messenger\\Transport\\Serialization\\Normalizer\\FlattenExceptionNormalizer` + which helps error reporting in the Messenger context. + .. versionadded:: 5.2 - The ``ErrorDetailsStamp`` stamp was introduced in Symfony 5.2. + The ``ErrorDetailsStamp`` stamp and the ``FlattenExceptionNormalizer`` + were introduced in Symfony 5.2. Instead of dealing directly with the messages in the middleware you receive the envelope. Hence you can inspect the envelope content and its stamps, or add any:: From e59d643638b6220e94bbd93eb3fb416c0c430b88 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 31 Aug 2023 16:21:28 +0200 Subject: [PATCH 182/670] [HttpKernel] Auto-register kernel as an extension --- configuration/micro_kernel_trait.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/configuration/micro_kernel_trait.rst b/configuration/micro_kernel_trait.rst index 5940b918183..8b4869fdea1 100644 --- a/configuration/micro_kernel_trait.rst +++ b/configuration/micro_kernel_trait.rst @@ -105,7 +105,18 @@ Adding Interfaces to "Micro" Kernel When using the ``MicroKernelTrait``, you can also implement the ``CompilerPassInterface`` to automatically register the kernel itself as a compiler pass as explained in the dedicated -:ref:`compiler pass section `. +:ref:`compiler pass section `. If the +:class:`Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface` +is implemented when using the ``MicroKernelTrait``, then the kernel will +be automatically registered as an extension. You can learn more about it in +the dedicated section about +:ref:`managing configuration with extensions `. + +.. versionadded:: 5.2 + + The automatic registration of the kernel as an extension when implementing the + :class:`Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface` + was introduced in Symfony 5.2. It is also possible to implement the ``EventSubscriberInterface`` to handle events directly from the kernel, again it will be registered automatically:: From 516574c082dc05ca55ae0cf51dfc26884986d340 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Thu, 31 Aug 2023 16:04:08 +0200 Subject: [PATCH 183/670] [HttpClient] Add support for pausing responses --- http_client.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/http_client.rst b/http_client.rst index 8fe16087680..301e3ba379d 100644 --- a/http_client.rst +++ b/http_client.rst @@ -1043,6 +1043,10 @@ following methods:: // returns detailed logs about the requests and responses of the HTTP transaction $httpLogs = $response->getInfo('debug'); + // the special "pause_handler" info item is a callable that allows to delay the request + // this helps implement delayed retries or throttling streams for example + $response->getInfo('pause_handler')(2); + .. note:: ``$response->toStream()`` is part of :class:`Symfony\\Component\\HttpClient\\Response\\StreamableInterface`. @@ -1053,6 +1057,10 @@ following methods:: about the response. Some of them might not be known yet (e.g. ``http_code``) when you'll call it. +.. versionadded:: 5.2 + + The ``pause_handler`` info item was introduced in Symfony 5.2. + .. _http-client-streaming-responses: Streaming Responses From e7b4ff2107ef52167a5495d76bd03085a2df241d Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 1 Sep 2023 11:00:18 +0200 Subject: [PATCH 184/670] Tweaks --- http_client.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/http_client.rst b/http_client.rst index 301e3ba379d..62fec487881 100644 --- a/http_client.rst +++ b/http_client.rst @@ -1044,7 +1044,7 @@ following methods:: $httpLogs = $response->getInfo('debug'); // the special "pause_handler" info item is a callable that allows to delay the request - // this helps implement delayed retries or throttling streams for example + // for a given number of seconds; this allows you to delay retries, throttle streams, etc. $response->getInfo('pause_handler')(2); .. note:: From 8797d07f049eab64eebe7286fcdf133b2d257ae2 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 1 Sep 2023 11:04:02 +0200 Subject: [PATCH 185/670] Tweak --- components/messenger.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/messenger.rst b/components/messenger.rst index e78daa1c8d8..25f0bcf1aa5 100644 --- a/components/messenger.rst +++ b/components/messenger.rst @@ -165,8 +165,8 @@ Here are some important envelope stamps that are shipped with the Symfony Messen The :class:`Symfony\\Component\\Messenger\\Stamp\\ErrorDetailsStamp` stamp contains a :class:`Symfony\\Component\\ErrorHandler\\Exception\\FlattenException`, - which is a representation of the exception that made the message failed. This - exception can be retrieved with the + which is a representation of the exception that made the message fail. You can + get this exception with the :method:`Symfony\\Component\\Messenger\\Stamp\\ErrorDetailsStamp::getFlattenException` method. This exception is normalized thanks to the :class:`Symfony\\Component\\Messenger\\Transport\\Serialization\\Normalizer\\FlattenExceptionNormalizer` From 47ca087f277cb12fb35354a029f4046d708c811c Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Fri, 1 Sep 2023 12:05:51 +0200 Subject: [PATCH 186/670] [Cache] Add integration with Messenger --- cache.rst | 146 +++++++++++++++++++++++++++++++++++++++++++ components/cache.rst | 2 + 2 files changed, 148 insertions(+) diff --git a/cache.rst b/cache.rst index b0d65f52740..57fb5df7b9a 100644 --- a/cache.rst +++ b/cache.rst @@ -837,3 +837,149 @@ When configuring multiple keys, the first key will be used for reading and writing, and the additional key(s) will only be used for reading. Once all cache items encrypted with the old key have expired, you can completely remove ``OLD_CACHE_DECRYPTION_KEY``. + +Computing Cache Values Asynchronously +------------------------------------- + +.. versionadded:: 5.2 + + Computing cache values asynchronously with the Messenger + in a worker was introduced in Symfony 5.2. + +Combined with the :doc:`Messenger component docs `, the +Cache component allows you to compute and refresh cache values asynchronously. + +The :class:`Symfony\\Contracts\\Cache\\CacheInterface` enables +`probabilistic early expiration`_, which means that sometimes, items are +elected for early-expiration while they are still fresh. You can learn more +about it in the :ref:`cache stampede prevention ` +section. + +Under classical circumstances, expired cache items are computed synchronously. +However, with a bit of additional configuration, values computation can be +delegated to a background worker. In this case, when an item is queried, +its cached value is immediately returned and a +:class:`Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage` is +dispatched through a Messenger bus. When this message is handled by a +message consumer, the refreshed cache value is computed asynchronously. +The next time the item is queried, the refreshed value will be fresh +and returned. + +First, let's declare a service that will compute the item's value:: + + // src/Cache/CacheComputation.php + namespace App\Cache; + + use Symfony\Contracts\Cache\ItemInterface; + + class CacheComputation + { + public function compute(ItemInterface $item): string + { + $item->expiresAfter(5); + + return sprintf('#%06X', mt_rand(0, 0xFFFFFF)); + } + } + +Now, we can create a controller that will query this item:: + + // src/Controller/CacheController.php + namespace App\Controller; + + use App\Cache\CacheComputation; + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + use Symfony\Component\Routing\Annotation\Route; + use Symfony\Contracts\Cache\CacheInterface; + use Symfony\Contracts\Cache\ItemInterface; + + class CacheController extends AbstractController + { + /** + * @Route("/cache", name="cache") + */ + public function index(CacheInterface $asyncCache): Response + { + // we give to the cache the service method that refreshes the item + $cachedValue = $cache->get('my_value', [CacheComputation::class, 'compute']) + + // ... + } + } + +Finally, we configure a new cache pool called ``async.cache`` that will use a +message bus to compute values in a worker: + +.. configuration-block:: + + .. code-block:: yaml + + # config/packages/framework.yaml + framework: + cache: + pools: + async.cache: + messenger_bus: async_bus + + messenger: + transports: + async_bus: '%env(MESSENGER_TRANSPORT_DSN)%' + routing: + Symfony\Component\Cache\Messenger\Message\EarlyExpirationMessage: async_bus + + .. code-block:: xml + + + + + + + + + + + %env(MESSENGER_TRANSPORT_DSN)% + + + + + + + + .. code-block:: php + + // config/framework/framework.php + use function Symfony\Component\DependencyInjection\Loader\Configurator\env; + use Symfony\Component\Cache\Messenger\EarlyExpirationMessage; + use Symfony\Config\FrameworkConfig; + + return static function (FrameworkConfig $framework): void { + $framework->cache() + ->pool('async.cache') + ->earlyExpirationMessageBus('async_bus'); + + $framework->messenger() + ->transport('async_bus') + ->dsn(env('MESSENGER_TRANSPORT_DSN')) + ->routing(EarlyExpirationMessage::class) + ->senders(['async_bus']); + }; + +You can now start the consumer: + +.. code-block:: terminal + + $ php bin/console messenger:consume async_bus + +That's it! Now, whenever an item is queried from this cache pool, its cached +value will be immediately returned. If it is elected for early-expiration, a message is sent +through to bus to schedule a background computation to refresh the value. + +.. _`probabilistic early expiration`: https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration diff --git a/components/cache.rst b/components/cache.rst index ff650ee13c3..daef6d4f5a6 100644 --- a/components/cache.rst +++ b/components/cache.rst @@ -90,6 +90,8 @@ generate and return the value:: Use cache tags to delete more than one key at the time. Read more at :doc:`/components/cache/cache_invalidation`. +.. _cache_stampede-prevention: + Stampede Prevention ~~~~~~~~~~~~~~~~~~~ From fdb2407f0b91efa052f144b8e3374b52a7931701 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 1 Sep 2023 15:51:23 +0200 Subject: [PATCH 187/670] Tweaks --- cache.rst | 55 +++++++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/cache.rst b/cache.rst index 57fb5df7b9a..8ee26d7ad18 100644 --- a/cache.rst +++ b/cache.rst @@ -843,29 +843,25 @@ Computing Cache Values Asynchronously .. versionadded:: 5.2 - Computing cache values asynchronously with the Messenger - in a worker was introduced in Symfony 5.2. - -Combined with the :doc:`Messenger component docs `, the -Cache component allows you to compute and refresh cache values asynchronously. - -The :class:`Symfony\\Contracts\\Cache\\CacheInterface` enables -`probabilistic early expiration`_, which means that sometimes, items are -elected for early-expiration while they are still fresh. You can learn more -about it in the :ref:`cache stampede prevention ` -section. - -Under classical circumstances, expired cache items are computed synchronously. -However, with a bit of additional configuration, values computation can be -delegated to a background worker. In this case, when an item is queried, -its cached value is immediately returned and a + The feature to compute cache values asynchronously was introduced in Symfony 5.2. + +The Cache component uses the `probabilistic early expiration`_ algorithm to +protect against the :ref:`cache stampede ` problem. +This means that some cache items are elected for early-expiration while they are +still fresh. + +By default, expired cache items are computed synchronously. However, you can +compute them asynchronously by delegating the value computation to a background +worker using the :doc:`Messenger component `. In this case, +when an item is queried, its cached value is immediately returned and a :class:`Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage` is -dispatched through a Messenger bus. When this message is handled by a -message consumer, the refreshed cache value is computed asynchronously. -The next time the item is queried, the refreshed value will be fresh -and returned. +dispatched through a Messenger bus. -First, let's declare a service that will compute the item's value:: +When this message is handled by a message consumer, the refreshed cache value is +computed asynchronously. The next time the item is queried, the refreshed value +will be fresh and returned. + +First, create a service that will compute the item's value:: // src/Cache/CacheComputation.php namespace App\Cache; @@ -878,11 +874,13 @@ First, let's declare a service that will compute the item's value:: { $item->expiresAfter(5); + // this is just a random example; here you must do your own calculation return sprintf('#%06X', mt_rand(0, 0xFFFFFF)); } } -Now, we can create a controller that will query this item:: +This cache value will be requested from a controller, another service, etc. +In the following example, the value is requested from a controller:: // src/Controller/CacheController.php namespace App\Controller; @@ -900,15 +898,15 @@ Now, we can create a controller that will query this item:: */ public function index(CacheInterface $asyncCache): Response { - // we give to the cache the service method that refreshes the item + // pass to the cache the service method that refreshes the item $cachedValue = $cache->get('my_value', [CacheComputation::class, 'compute']) // ... } } -Finally, we configure a new cache pool called ``async.cache`` that will use a -message bus to compute values in a worker: +Finally, configure a new cache pool (e.g. called ``async.cache``) that will use +a message bus to compute values in a worker: .. configuration-block:: @@ -931,7 +929,7 @@ message bus to compute values in a worker: - Date: Tue, 29 Aug 2023 13:30:43 +0200 Subject: [PATCH 191/670] [RFC] Add alt texts to images --- .../contributing/docs-github-edit-page.png | Bin 62133 -> 59383 bytes _images/doctrine/mapping_relations.png | Bin 63861 -> 0 bytes _images/doctrine/mapping_relations.svg | 602 ++++++++++++ _images/doctrine/mapping_relations_proxy.png | Bin 151397 -> 0 bytes _images/doctrine/mapping_relations_proxy.svg | 926 ++++++++++++++++++ _images/doctrine/mapping_single_entity.png | Bin 64366 -> 0 bytes _images/doctrine/mapping_single_entity.svg | 469 +++++++++ _images/form/data-transformer-types.png | Bin 46314 -> 0 bytes _images/form/data-transformer-types.svg | 178 ++++ _images/form/form_prepopulation_workflow.svg | 305 +++++- _images/form/form_submission_workflow.svg | 408 ++++++-- _images/form/form_workflow.svg | 327 +++++-- _images/http/xkcd-full.png | Bin 10968 -> 0 bytes _images/http/xkcd-full.svg | 324 ++++++ _images/http/xkcd-request.png | Bin 6991 -> 0 bytes _images/http/xkcd-request.svg | 191 ++++ _images/mercure/discovery.png | Bin 176913 -> 0 bytes _images/mercure/discovery.svg | 294 ++++++ _images/mercure/hub.svg | 196 ++++ _images/mercure/schema.png | Bin 333957 -> 0 bytes _images/sources/README.md | 4 +- .../sources/doctrine/mapping_relations.dia | Bin 0 -> 3114 bytes .../doctrine/mapping_relations_proxy.dia | Bin 0 -> 3844 bytes .../doctrine/mapping_single_entity.dia | Bin 0 -> 2338 bytes .../sources/form/data-transformer-types.dia | Bin 0 -> 2007 bytes .../form/form_prepopulation_workflow.dia | Bin 0 -> 1680 bytes .../sources/form/form_submission_workflow.dia | Bin 0 -> 1950 bytes _images/sources/form/form_workflow.dia | Bin 0 -> 1871 bytes _images/sources/http/xkcd-full.dia | Bin 0 -> 1612 bytes _images/sources/http/xkcd-request.dia | Bin 0 -> 1380 bytes _images/sources/mercure/discovery.dia | Bin 0 -> 1454 bytes _images/sources/mercure/hub.dia | Bin 0 -> 1564 bytes components/console/helpers/cursor.rst | 2 +- .../console/helpers/debug_formatter.rst | 2 +- components/console/helpers/processhelper.rst | 3 + components/console/helpers/progressbar.rst | 1 + components/form.rst | 2 +- components/http_kernel.rst | 12 +- components/messenger.rst | 4 +- components/serializer.rst | 23 +- components/string.rst | 2 +- components/var_dumper.rst | 9 + components/workflow.rst | 1 + console.rst | 1 + contributing/code/stack_trace.rst | 8 +- contributing/documentation/overview.rst | 10 +- contributing/documentation/standards.rst | 32 + controller/error_pages.rst | 10 +- doctrine.rst | 11 +- doctrine/associations.rst | 14 +- form/create_custom_field_type.rst | 21 +- form/data_transformers.rst | 9 +- form/events.rst | 20 +- form/form_customization.rst | 6 +- form/form_themes.rst | 4 +- form/tailwindcss.rst | 2 +- introduction/from_flat_php_to_symfony.rst | 4 +- introduction/http_fundamentals.rst | 25 +- mercure.rst | 15 +- profiler.rst | 8 +- quick_tour/the_big_picture.rst | 4 +- rate_limiter.rst | 22 +- reference/forms/types/choice.rst | 4 +- .../forms/types/options/choice_label.rst.inc | 2 +- .../forms/types/options/group_by.rst.inc | 2 +- .../types/options/preferred_choices.rst.inc | 2 +- security.rst | 6 +- security/login_link.rst | 1 + security/remember_me.rst | 1 + setup/upgrade_major.rst | 4 +- translation.rst | 9 +- workflow.rst | 1 + workflow/dumping-workflows.rst | 4 + workflow/workflow-and-state-machine.rst | 3 + 74 files changed, 4267 insertions(+), 283 deletions(-) delete mode 100644 _images/doctrine/mapping_relations.png create mode 100644 _images/doctrine/mapping_relations.svg delete mode 100644 _images/doctrine/mapping_relations_proxy.png create mode 100644 _images/doctrine/mapping_relations_proxy.svg delete mode 100644 _images/doctrine/mapping_single_entity.png create mode 100644 _images/doctrine/mapping_single_entity.svg delete mode 100644 _images/form/data-transformer-types.png create mode 100644 _images/form/data-transformer-types.svg delete mode 100644 _images/http/xkcd-full.png create mode 100644 _images/http/xkcd-full.svg delete mode 100644 _images/http/xkcd-request.png create mode 100644 _images/http/xkcd-request.svg delete mode 100644 _images/mercure/discovery.png create mode 100644 _images/mercure/discovery.svg create mode 100644 _images/mercure/hub.svg delete mode 100644 _images/mercure/schema.png create mode 100644 _images/sources/doctrine/mapping_relations.dia create mode 100644 _images/sources/doctrine/mapping_relations_proxy.dia create mode 100644 _images/sources/doctrine/mapping_single_entity.dia create mode 100644 _images/sources/form/data-transformer-types.dia create mode 100644 _images/sources/form/form_prepopulation_workflow.dia create mode 100644 _images/sources/form/form_submission_workflow.dia create mode 100644 _images/sources/form/form_workflow.dia create mode 100644 _images/sources/http/xkcd-full.dia create mode 100644 _images/sources/http/xkcd-request.dia create mode 100644 _images/sources/mercure/discovery.dia create mode 100644 _images/sources/mercure/hub.dia diff --git a/_images/contributing/docs-github-edit-page.png b/_images/contributing/docs-github-edit-page.png index 9ea6c15421a545259715453086a5770e4414e760..b739497f70f84e7e864c34132b5059193e8099f2 100644 GIT binary patch literal 59383 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�Qn49%Pe*ARt^xn?3ub%knJI(XTr_;6kECZQ5 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 literal 62133 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 NeG<_2PUY|7e*lExxElZf diff --git a/_images/doctrine/mapping_relations.png b/_images/doctrine/mapping_relations.png deleted file mode 100644 index a679f9cb31701d63df7cde04491d3803223c7398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63861 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

YR-9+lPjR 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 LNkvXXu0mjf1o8db diff --git a/_images/doctrine/mapping_relations.svg b/_images/doctrine/mapping_relations.svg new file mode 100644 index 00000000000..7dc8979cb1a --- /dev/null +++ b/_images/doctrine/mapping_relations.svg @@ -0,0 +1,602 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/doctrine/mapping_relations_proxy.png b/_images/doctrine/mapping_relations_proxy.png deleted file mode 100644 index 935153291d48fc2798bc95439132725023cdf7af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151397 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 Od_m90lAry!QookW9;ZlrUKo~DcO$)@W6 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 grmbW{VIL+#ADI|J_@ep-un15*9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/doctrine/mapping_single_entity.png b/_images/doctrine/mapping_single_entity.png deleted file mode 100644 index 6f88c6cacfa007705371e9c2c01ef80b3f87fd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64366 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 F{|8|kV4DB{ diff --git a/_images/doctrine/mapping_single_entity.svg b/_images/doctrine/mapping_single_entity.svg new file mode 100644 index 00000000000..5d517c85fb1 --- /dev/null +++ b/_images/doctrine/mapping_single_entity.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/form/data-transformer-types.png b/_images/form/data-transformer-types.png deleted file mode 100644 index 950acd39ea750cb045bfb5dddf80799d3ef81d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46314 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 z 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 diff --git a/_images/form/data-transformer-types.svg b/_images/form/data-transformer-types.svg new file mode 100644 index 00000000000..9393b224f89 --- /dev/null +++ b/_images/form/data-transformer-types.svg @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/form/form_prepopulation_workflow.svg b/_images/form/form_prepopulation_workflow.svg index 1db13f94c72..c908f5c5a76 100644 --- a/_images/form/form_prepopulation_workflow.svg +++ b/_images/form/form_prepopulation_workflow.svg @@ -1,54 +1,253 @@ - - - - - - New form - - - - - - Prepopulated form - - - - - - - - - - Model data - - - - - - POST_SET_DATA - - - - - - PRE_SET_DATA - - - - - - setData($data) - - - - - - - - - - normalization - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/form/form_submission_workflow.svg b/_images/form/form_submission_workflow.svg index b58e11190a1..d6d138ee61a 100644 --- a/_images/form/form_submission_workflow.svg +++ b/_images/form/form_submission_workflow.svg @@ -1,76 +1,334 @@ - - - - - - denormalization - - - - - - normalization - - - - - - New form - - - - - - Prepopulated form - - - - - - Submitted form - - - - - - - - - - - - - - Request data - - - - - - handleRequest($request) - - - - - - - - - - PRE_SUBMIT - - - - - - SUBMIT - - - - - - POST_SUBMIT - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/form/form_workflow.svg b/_images/form/form_workflow.svg index a256c2073ef..2dbacbbf096 100644 --- a/_images/form/form_workflow.svg +++ b/_images/form/form_workflow.svg @@ -1,66 +1,263 @@ - - - - - - New form - - - - - - Prepopulated form - - - - - - Submitted form - - - - - - - - - - - - - - - - - - Model data - - - - - - Request data - - - - - - setData($data) - - - - - - handleRequest($request) - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/http/xkcd-full.png b/_images/http/xkcd-full.png deleted file mode 100644 index d5b01ea32b94a14c620fc2374f75b58b506ceb49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10968 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

%FcA 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/http/xkcd-request.png b/_images/http/xkcd-request.png deleted file mode 100644 index 310713d304cff080a6df17ad715f5b33aa4e5b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6991 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/mercure/discovery.png b/_images/mercure/discovery.png deleted file mode 100644 index 0ef38271de6c1fcf9c83d8cb0984181773da4919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176913 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

)L-zw!CwhMO-ySD<+XC$-2nYKDl+0C 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