From 028038eb6fdb19c21bfb1ec1b08098a145e384e5 Mon Sep 17 00:00:00 2001 From: Steve Clay Date: Mon, 29 Dec 2014 18:34:44 -0500 Subject: [PATCH 01/61] Add section about setting cache_limiter in NativeSessionStorage --- .../http_foundation/session_configuration.rst | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/components/http_foundation/session_configuration.rst b/components/http_foundation/session_configuration.rst index c2608110621..93c3eacadfa 100644 --- a/components/http_foundation/session_configuration.rst +++ b/components/http_foundation/session_configuration.rst @@ -102,6 +102,36 @@ method. For the sake of clarity, some key options are explained in this documentation. +Session Cache Limiting +~~~~~~~~~~~~~~~~~~~~~~ + +To avoid users seeing stale data, it's common for session-enabled resources to be +sent with headers that disable caching. For this purpose PHP Sessions has the +``sessions.cache_limiter`` option, which determines which headers, if any, will be +sent with the response when the session in started. + +Upon construction, +:class:`Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage` +sets this global option to ``""`` (send no headers) in case the developer wishes to +use a :class:`Symfony\\Component\\HttpFoundation\\Response` object to manage +response headers. + +.. caution:: + + If you rely on PHP Sessions to manage HTTP caching, you *must* manually set the + ``cache_limiter`` option in + :class:`Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage` + to a non-empty value. + + For example, you may set it to PHP's default value during construction: + + Example usage:: + + use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; + + $options['cache_limiter'] = session_cache_limiter(); + $storage = new NativeSessionStorage($options); + Session Cookie Lifetime ~~~~~~~~~~~~~~~~~~~~~~~ From b54a050ef5e02c80270c0ee05da634ef3138970b Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 25 Mar 2015 19:13:51 +0100 Subject: [PATCH 02/61] Complete review of the "Customize Error Pages" cookbook article --- cookbook/controller/error_pages.rst | 331 ++++++++---------- .../errors-in-prod-environment.png | Bin 0 -> 38662 bytes .../exceptions-in-dev-environment.png | Bin 0 -> 131511 bytes 3 files changed, 146 insertions(+), 185 deletions(-) create mode 100644 images/cookbook/error_pages/errors-in-prod-environment.png create mode 100644 images/cookbook/error_pages/exceptions-in-dev-environment.png diff --git a/cookbook/controller/error_pages.rst b/cookbook/controller/error_pages.rst index 2e28b98a9d6..8b61d68d5c6 100644 --- a/cookbook/controller/error_pages.rst +++ b/cookbook/controller/error_pages.rst @@ -5,172 +5,154 @@ How to Customize Error Pages ============================ -When an exception is thrown, the core ``HttpKernel`` class catches it and -dispatches a ``kernel.exception`` event. This gives you the power to convert -the exception into a ``Response`` in a few different ways. +In Symfony applications, all errors are treated as exceptions, no matter if they +are just a 404 Not Found error or a fatal error triggered by throwing some +exception in your code. -The core TwigBundle sets up a listener for this event which will run -a configurable (but otherwise arbitrary) controller to generate the -response. The default controller used has a sensible way of -picking one out of the available set of error templates. +In the `development environment`_ Symfony catches all the exceptions and displays +a special **exception page** with lots of debug information to help you quickly +discover the root problem. -Thus, error pages can be customized in different ways, depending on how -much control you need: +.. image:: /images/cookbook/controller/error_pages/exceptions-in-dev-environment.png + :alt: A typical exception page in development environment -#. :ref:`Use the default ExceptionController and create a few - templates that allow you to customize how your different error - pages look (easy); ` +Since these pages contain a lot of sensitive internal information about your +application, in production environment Symfony displays instead a simple and +generic **error page**: -#. :ref:`Replace the default exception controller with your own - (intermediate). ` +.. image:: /images/cookbook/controller/error_pages/errors-in-prod-environment.png + :alt: A typical error page in production environment -#. :ref:`Use the kernel.exception event to come up with your own - handling (advanced). ` +Error pages for production environment can be customized in different ways, +depending on your needs: -.. _use-default-exception-controller: - -Using the Default ExceptionController -------------------------------------- +#. If you just want to change the contents and styles of the error pages to match + the rest of your application, :ref:`override default error templates `. -By default, the ``showAction()`` method of the -:class:`Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController` -will be called when an exception occurs. +#. If you also want to tweak the logic used by Symfony to generate error pages, + :ref:`override the default exception controller `. -This controller will either display an -*exception* or *error* page, depending on the setting of the ``kernel.debug`` -flag. While *exception* pages give you a lot of helpful -information during development, *error* pages are meant to be -shown to the user in production. +#. If you need total control of exception handling to execute your own logic + :ref:`use the kernel.exception event `. -.. sidebar:: Testing Error Pages during Development +.. _use-default-exception-controller: - You should not set ``kernel.debug`` to ``false`` in order to see your - *error* pages during development. This will also stop - Symfony from recompiling your twig templates, among other things. +Overriding the Default Error Templates +-------------------------------------- - The third-party `WebfactoryExceptionsBundle`_ provides a special - test controller that allows you to display your custom error - pages for arbitrary HTTP status codes even with - ``kernel.debug`` set to ``true``. +By default, when an exception occurs, the ``showAction()`` method of the +:class:`Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController` is called +thanks to an event listener configured by the TwigBundle. -.. _`WebfactoryExceptionsBundle`: https://github.com/webfactory/exceptions-bundle +Then, the controller selects one of the templates defined in the +``Resources/views/Exception`` directory of the TwigBundle to render the error +page. If you browse that directory (usually located in +``vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle``) you'll find a lot of +templates defined for different types of errors and content formats. .. _cookbook-error-pages-by-status-code: -How the Template for the Error and Exception Pages Is Selected -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The logic followed by the ``ExceptionController`` to pick one of the available +templates is based on the HTTP status code and request format: -The TwigBundle contains some default templates for error and -exception pages in its ``Resources/views/Exception`` directory. +#. Look for a template for the given format and status code (like ``error404.json.twig`` + or ``error500.xml.twig``); -.. tip:: +#. If the previous template doesn't exist, discard the status code and look for + a generic template for the given format (like ``error.json.twig`` or + ``error.xml.twig``); - In a standard Symfony installation, the TwigBundle can be found at - ``vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle``. In addition - to the standard HTML error page, it also provides a default - error page for many of the most common response formats, including - JSON (``error.json.twig``), XML (``error.xml.twig``) and even - JavaScript (``error.js.twig``), to name a few. +#. If none of the previous template exist, fall back to the generic HTML template + (``error.html.twig``). -Here is how the ``ExceptionController`` will pick one of the -available templates based on the HTTP status code and request format: +To override these templates, simply rely on the standard Symfony method for +:ref:`overriding templates that live inside a bundle `. +For example, to override the 404 error template for HTML pages, create a new +``error404.html.twig`` template located at ``app/Resources/TwigBundle/views/Exception/``: -* For *error* pages, it first looks for a template for the given format - and status code (like ``error404.json.twig``); +.. code-block:: html+jinja -* If that does not exist or apply, it looks for a general template for - the given format (like ``error.json.twig`` or - ``exception.json.twig``); + {# app/Resources/TwigBundle/views/Exception/error404.html.twig #} + {% extends 'base.html.twig' %} -* Finally, it ignores the format and falls back to the HTML template - (like ``error.html.twig`` or ``exception.html.twig``). + {% block body %} +

Page not found

-.. tip:: +

+ The requested page couldn't be located. Checkout for any URL + misspelling or return to the homepage. +

+ {% endblock %} - If the exception being handled implements the - :class:`Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface`, - the ``getStatusCode()`` method will be - called to obtain the HTTP status code to use. Otherwise, - the status code will be "500". +Commonly, Symfony applications redefine the ``error404.html.twig`` template, the +``error500.html.twig`` template for internal server errors and the generic +``error.html.twig`` template to catch any other error different from 404 and 500. -Overriding or Adding Templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In case you need them, the ``ExceptionController`` passes some information to +the error template via the ``status_code`` and ``status_text`` variables that +store the HTTP status code and message respectively. -To override these templates, simply rely on the standard method for -overriding templates that live inside a bundle. For more information, -see :ref:`overriding-bundle-templates`. +.. tip:: -For example, to override the default error template, create a new -template located at -``app/Resources/TwigBundle/views/Exception/error.html.twig``: + If your application defines custom exceptions and they implement the + :class:`Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface`, + the ``status_code`` variable will contain the value returned by the + ``getStatusCode()`` method. Otherwise, the ``status_code`` variable will be ``500``. -.. code-block:: html+jinja +.. note:: - - - - - An Error Occurred: {{ status_text }} - - -

Oops! An Error Occurred

-

The server returned a "{{ status_code }} {{ status_text }}".

- - - -.. caution:: - - You **must not** use ``is_granted`` in your error pages (or layout used - by your error pages), because the router runs before the firewall. If - the router throws an exception (for instance, when the route does not - match), then using ``is_granted`` will throw a further exception. You - can use ``is_granted`` safely by saying ``{% if app.user and is_granted('...') %}``. + The exception pages shown in the development environment can be customized + in the same way as error pages. Create a new ``exception.html.twig`` template + for the standard HTML exception page or ``exception.json.twig`` for the JSON + exception page. -.. tip:: +Avoiding Exceptions when Using Security Functions in Error Templates +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - If you're not familiar with Twig, don't worry. Twig is a simple, - powerful and optional templating engine that integrates with - Symfony. For more information about Twig see :doc:`/book/templating`. +One of the common pitfalls when designing custom error pages is to use the +``is_granted()`` function in the error template (or in any parent template +inherited by the error template). If you do that, you'll see an exception thrown +by Symfony. -This works not only to replace the default templates, but also to add -new ones. +The cause of this problem is that routing is done before security. If a 404 error +occurs, the security layer isn't loaded and thus, the ``is_granted()`` function +is undefined. The solution is to add the following check before using this function: -For instance, create an ``app/Resources/TwigBundle/views/Exception/error404.html.twig`` -template to display a special page for 404 (page not found) errors. -Refer to the previous section for the order in which the -``ExceptionController`` tries different template names. +.. code-block:: twig -.. tip:: + {% if app.user and is_granted('...') %} + {# ... #} + {% endif %} - Often, the easiest way to customize an error page is to copy it from - the TwigBundle into ``app/Resources/TwigBundle/views/Exception`` and - then modify it. +Testing Error Pages during Development +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. note:: +One of the biggest hurdles of testing how do custom error pages look in your +application is the fact that Symfony ignores them in the development environment +and displays instead the default exception pages. - The debug-friendly exception pages shown to the developer can even be - customized in the same way by creating templates such as - ``exception.html.twig`` for the standard HTML exception page or - ``exception.json.twig`` for the JSON exception page. +You may be tempted to set the ``kernel.debug`` parameter to ``false`` to disable +the debug mode in the development environment. However, this practice is not +recommended because it will also stop Symfony from recompiling your Twig templates, +among many other things. + +The recommended solution is to use a third-party bundle called `WebfactoryExceptionsBundle`_. +This bundle provides a special test controller that allows you to easily display +custom error pages for arbitrary HTTP status codes even when ``kernel.debug`` is +set to ``true``. .. _custom-exception-controller: -Replacing the Default ExceptionController +Overriding the Default ExceptionController ------------------------------------------ -If you need a little more flexibility beyond just overriding the -template, then you can change the controller that renders the error -page. For example, you might need to pass some additional variables into -your template. - -.. caution:: +If you need a little more flexibility beyond just overriding the template, +then you can change the controller that renders the error page. For example, +you might need to pass some additional variables into your template. - Make sure you don't lose the exception pages that render the helpful - error messages during development. - -To do this, simply create a new controller and set the -:ref:`twig.exception_controller ` option -to point to it. +To do this, simply create a new controller anywhere in your application and set +the :ref:`twig.exception_controller ` +configuration option to point to it: .. configuration-block:: @@ -205,86 +187,65 @@ to point to it. // ... )); -.. tip:: - - You can also set up your controller as a service. - - The default value of ``twig.controller.exception:showAction`` refers - to the ``showAction`` method of the ``ExceptionController`` - described previously, which is registered in the DIC as the - ``twig.controller.exception`` service. +The :class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` +class used by TwigBundle as a listener of the ``kernel.exception`` event creates +the Request that will be dispatched to your controller. In addition, your controller +will be passed two parameters: -Your controller will be passed two parameters: ``exception``, -which is a :class:`\\Symfony\\Component\\Debug\\Exception\\FlattenException` -instance created from the exception being handled, and ``logger``, -an instance of :class:`\\Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface` -(which may be ``null``). - -.. tip:: +``exception`` + A :class:`\\Symfony\\Component\\Debug\\Exception\\FlattenException` + instance created from the exception being handled. - The Request that will be dispatched to your controller is created - in the :class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener`. - This event listener is set up by the TwigBundle. +``logger`` + A :class:`\\Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface` + instance which may be ``null`` in some circumstances. -You can, of course, also extend the previously described -:class:`Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController`. -In that case, you might want to override one or both of the -``showAction`` and ``findTemplate`` methods. The latter one locates the -template to be used. - -.. caution:: - - As of writing, the ``ExceptionController`` is *not* part of the - Symfony API, so be aware that it might change in following releases. +Instead of creating a new exception controller from scratch you can, of course, +also extend the default :class:`Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController`. +In that case, you might want to override one or both of the ``showAction()`` and +``findTemplate()`` methods. The latter one locates the template to be used. .. _use-kernel-exception-event: -Working with the kernel.exception Event ------------------------------------------ - -As mentioned in the beginning, the ``kernel.exception`` event is -dispatched whenever the Symfony Kernel needs to -handle an exception. For more information on that, see :ref:`kernel-kernel.exception`. - -Working with this event is actually much more powerful than what has -been explained before but also requires a thorough understanding of -Symfony internals. +Working with the ``kernel.exception`` Event +------------------------------------------- -To give one example, assume your application throws -specialized exceptions with a particular meaning to your domain. +When an exception is thrown, the :class:`Symfony\\Component\\HttpKernel\\HttpKernel` +class catches it and dispatches a ``kernel.exception`` event. This gives you the +power to convert the exception into a ``Response`` in a few different ways. -In that case, all the default ``ExceptionListener`` and -``ExceptionController`` could do for you was trying to figure out the -right HTTP status code and display your nice-looking error page. +Working with this event is actually much more powerful than what has been explained +before but also requires a thorough understanding of Symfony internals. Suppose +that your code throws specialized exceptions with a particular meaning to your +application domain. -:doc:`Writing your own event listener ` -for the ``kernel.exception`` event allows you to have a closer look -at the exception and take different actions depending on it. Those -actions might include logging the exception, redirecting the user to -another page or rendering specialized error pages. +If you extend the default ``ExceptionListener``, all you can get is the HTTP +status code and message and display a nice-looking error page. However, +:doc:`writing your own event listener ` +for the ``kernel.exception`` event allows you to have a closer look at the exception +and take different actions depending on it. Those actions might include logging +the exception, redirecting the user to another page or rendering specialized +error pages. .. note:: If your listener calls ``setResponse()`` on the :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent`, - event propagation will be stopped and the response will be sent to + event, propagation will be stopped and the response will be sent to the client. -This approach allows you to create centralized and layered error -handling: Instead of catching (and handling) the same exceptions -in various controllers again and again, you can have just one (or -several) listeners deal with them. +This approach allows you to create centralized and layered error handling: +instead of catching (and handling) the same exceptions in various controllers +time and again, you can have just one (or several) listeners deal with them. .. tip:: - To see an example, have a look at the `ExceptionListener`_ in the - Security Component. - - It handles various security-related exceptions that are thrown in + See :class:`Symfony\\Component\\Security\\Http\\Firewall\\ExceptionListener` + class code for a real example of an advanced listener of this type. This + listener handles various security-related exceptions that are thrown in your application (like :class:`Symfony\\Component\\Security\\Core\\Exception\\AccessDeniedException`) - and takes measures like redirecting the user to the login page, - logging them out and other things. - -Good luck! + and takes measures like redirecting the user to the login page, logging them + out and other things. -.. _`ExceptionListener`: https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Http/Firewall/ExceptionListener.php +.. _`development environment`: http://symfony.com/doc/current/cookbook/configuration/environments.html +.. _`WebfactoryExceptionsBundle`: https://github.com/webfactory/exceptions-bundle diff --git a/images/cookbook/error_pages/errors-in-prod-environment.png b/images/cookbook/error_pages/errors-in-prod-environment.png new file mode 100644 index 0000000000000000000000000000000000000000..79fe5341b478d10d02b33e9f7fbff183cdfae716 GIT binary patch literal 38662 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 Date: Wed, 25 Mar 2015 22:01:16 +0100 Subject: [PATCH 03/61] Fixed a reStructuredText formatting issue --- cookbook/controller/error_pages.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cookbook/controller/error_pages.rst b/cookbook/controller/error_pages.rst index 8b61d68d5c6..c2646ee8b58 100644 --- a/cookbook/controller/error_pages.rst +++ b/cookbook/controller/error_pages.rst @@ -59,8 +59,8 @@ templates is based on the HTTP status code and request format: or ``error500.xml.twig``); #. If the previous template doesn't exist, discard the status code and look for - a generic template for the given format (like ``error.json.twig`` or - ``error.xml.twig``); + a generic template for the given format (like ``error.json.twig`` or + ``error.xml.twig``); #. If none of the previous template exist, fall back to the generic HTML template (``error.html.twig``). From e304a9d0ed1f607a4743896eaf353ef012c9f9ff Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 27 Mar 2015 09:48:57 +0100 Subject: [PATCH 04/61] Fixed a restructuredtext syntax issue --- cookbook/controller/error_pages.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cookbook/controller/error_pages.rst b/cookbook/controller/error_pages.rst index c2646ee8b58..31486f8e553 100644 --- a/cookbook/controller/error_pages.rst +++ b/cookbook/controller/error_pages.rst @@ -63,7 +63,7 @@ templates is based on the HTTP status code and request format: ``error.xml.twig``); #. If none of the previous template exist, fall back to the generic HTML template - (``error.html.twig``). + (``error.html.twig``). To override these templates, simply rely on the standard Symfony method for :ref:`overriding templates that live inside a bundle `. From 722b9d0c68daa6deb6001f0d8f768f057049d216 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 30 Mar 2015 16:27:42 +0200 Subject: [PATCH 05/61] Fixed the location of the cookbook article images --- .../error_pages/errors-in-prod-environment.png | Bin .../error_pages/exceptions-in-dev-environment.png | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename images/cookbook/{ => controller}/error_pages/errors-in-prod-environment.png (100%) rename images/cookbook/{ => controller}/error_pages/exceptions-in-dev-environment.png (100%) diff --git a/images/cookbook/error_pages/errors-in-prod-environment.png b/images/cookbook/controller/error_pages/errors-in-prod-environment.png similarity index 100% rename from images/cookbook/error_pages/errors-in-prod-environment.png rename to images/cookbook/controller/error_pages/errors-in-prod-environment.png diff --git a/images/cookbook/error_pages/exceptions-in-dev-environment.png b/images/cookbook/controller/error_pages/exceptions-in-dev-environment.png similarity index 100% rename from images/cookbook/error_pages/exceptions-in-dev-environment.png rename to images/cookbook/controller/error_pages/exceptions-in-dev-environment.png From 3073783551a37db0af22fe3cafb812479e549b47 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 1 Apr 2015 10:32:45 +0200 Subject: [PATCH 06/61] Rewordings --- cookbook/controller/error_pages.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cookbook/controller/error_pages.rst b/cookbook/controller/error_pages.rst index 31486f8e553..657be1f70fb 100644 --- a/cookbook/controller/error_pages.rst +++ b/cookbook/controller/error_pages.rst @@ -9,15 +9,15 @@ In Symfony applications, all errors are treated as exceptions, no matter if they are just a 404 Not Found error or a fatal error triggered by throwing some exception in your code. -In the `development environment`_ Symfony catches all the exceptions and displays +In the `development environment`_, Symfony catches all the exceptions and displays a special **exception page** with lots of debug information to help you quickly -discover the root problem. +discover the root problem: .. image:: /images/cookbook/controller/error_pages/exceptions-in-dev-environment.png :alt: A typical exception page in development environment -Since these pages contain a lot of sensitive internal information about your -application, in production environment Symfony displays instead a simple and +Since these pages contain a lot of sensitive internal information, Symfony won't +display them in the production environment. Instead, it'll show a simple and generic **error page**: .. image:: /images/cookbook/controller/error_pages/errors-in-prod-environment.png From 3842b611a3c45d26325db5839dbd13db877bf669 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 2 Apr 2015 17:09:38 +0200 Subject: [PATCH 07/61] Changes suggested by reviewers --- cookbook/controller/error_pages.rst | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/cookbook/controller/error_pages.rst b/cookbook/controller/error_pages.rst index 657be1f70fb..b465cf61913 100644 --- a/cookbook/controller/error_pages.rst +++ b/cookbook/controller/error_pages.rst @@ -14,16 +14,16 @@ a special **exception page** with lots of debug information to help you quickly discover the root problem: .. image:: /images/cookbook/controller/error_pages/exceptions-in-dev-environment.png - :alt: A typical exception page in development environment + :alt: A typical exception page in the development environment Since these pages contain a lot of sensitive internal information, Symfony won't display them in the production environment. Instead, it'll show a simple and generic **error page**: .. image:: /images/cookbook/controller/error_pages/errors-in-prod-environment.png - :alt: A typical error page in production environment + :alt: A typical error page in the production environment -Error pages for production environment can be customized in different ways, +Error pages for the production environment can be customized in different ways depending on your needs: #. If you just want to change the contents and styles of the error pages to match @@ -53,7 +53,7 @@ templates defined for different types of errors and content formats. .. _cookbook-error-pages-by-status-code: The logic followed by the ``ExceptionController`` to pick one of the available -templates is based on the HTTP status code and request format: +templates is based on the HTTP status code and the request format: #. Look for a template for the given format and status code (like ``error404.json.twig`` or ``error500.xml.twig``); @@ -65,6 +65,8 @@ templates is based on the HTTP status code and request format: #. If none of the previous template exist, fall back to the generic HTML template (``error.html.twig``). +.. _overriding-or-adding-templates: + To override these templates, simply rely on the standard Symfony method for :ref:`overriding templates that live inside a bundle `. For example, to override the 404 error template for HTML pages, create a new @@ -129,7 +131,7 @@ Testing Error Pages during Development One of the biggest hurdles of testing how do custom error pages look in your application is the fact that Symfony ignores them in the development environment -and displays instead the default exception pages. +and displays the default exception pages instead. You may be tempted to set the ``kernel.debug`` parameter to ``false`` to disable the debug mode in the development environment. However, this practice is not @@ -142,6 +144,7 @@ custom error pages for arbitrary HTTP status codes even when ``kernel.debug`` is set to ``true``. .. _custom-exception-controller: +.. _replacing-the-default-exceptioncontroller: Overriding the Default ExceptionController ------------------------------------------ @@ -188,8 +191,8 @@ configuration option to point to it: )); The :class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` -class used by TwigBundle as a listener of the ``kernel.exception`` event creates -the Request that will be dispatched to your controller. In addition, your controller +class used by the TwigBundle as a listener of the ``kernel.exception`` event creates +the request that will be dispatched to your controller. In addition, your controller will be passed two parameters: ``exception`` @@ -215,13 +218,11 @@ class catches it and dispatches a ``kernel.exception`` event. This gives you the power to convert the exception into a ``Response`` in a few different ways. Working with this event is actually much more powerful than what has been explained -before but also requires a thorough understanding of Symfony internals. Suppose +before, but also requires a thorough understanding of Symfony internals. Suppose that your code throws specialized exceptions with a particular meaning to your application domain. -If you extend the default ``ExceptionListener``, all you can get is the HTTP -status code and message and display a nice-looking error page. However, -:doc:`writing your own event listener ` +:doc:`Writing your own event listener ` for the ``kernel.exception`` event allows you to have a closer look at the exception and take different actions depending on it. Those actions might include logging the exception, redirecting the user to another page or rendering specialized From d19d959437e705c233507fc3b9753d0169e1917a Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 10 Apr 2015 15:57:56 +0200 Subject: [PATCH 08/61] Minor changes to match the Symfony Demo reference application --- best_practices/web-assets.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/best_practices/web-assets.rst b/best_practices/web-assets.rst index a45d85542b5..9d2570e0bd1 100644 --- a/best_practices/web-assets.rst +++ b/best_practices/web-assets.rst @@ -29,8 +29,8 @@ much more concise: .. note:: Keep in mind that ``web/`` is a public directory and that anything stored - here will be publicly accessible. For that reason, you should put your - compiled web assets here, but not their source files (e.g. SASS files). + here will be publicly accessible, including all the original asset files + (e.g. Sass, LESS and CoffeScript files). Using Assetic ------------- @@ -51,16 +51,15 @@ tools like GruntJS. :doc:`Assetic ` is an asset manager capable of compiling assets developed with a lot of different frontend technologies -like LESS, Sass and CoffeeScript. -Combining all your assets with Assetic is a matter of wrapping all the assets -with a single Twig tag: +like LESS, Sass and CoffeeScript. Combining all your assets with Assetic is a +matter of wrapping all the assets with a single Twig tag: .. code-block:: html+jinja {% stylesheets 'css/bootstrap.min.css' 'css/main.css' - filter='cssrewrite' output='css/compiled/all.css' %} + filter='cssrewrite' output='css/compiled/app.css' %} {% endstylesheets %} @@ -69,7 +68,7 @@ with a single Twig tag: {% javascripts 'js/jquery.min.js' 'js/bootstrap.min.js' - output='js/compiled/all.js' %} + output='js/compiled/app.js' %} {% endjavascripts %} From 46d10a2341069da2a6db2a10d7fa18e2363be0a6 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Wed, 7 Jan 2015 22:43:03 +0100 Subject: [PATCH 09/61] [Cookbook][Routing] Update custom_route_loader.rst --- cookbook/routing/custom_route_loader.rst | 76 ++++++++++++++---------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/cookbook/routing/custom_route_loader.rst b/cookbook/routing/custom_route_loader.rst index a6e682ffe70..5e9b7f25b2e 100644 --- a/cookbook/routing/custom_route_loader.rst +++ b/cookbook/routing/custom_route_loader.rst @@ -14,13 +14,14 @@ slow down the installation process and make it error-prone. Alternatively, you could also use a custom route loader when you want your routes to be automatically generated or located based on some convention or pattern. One example is the `FOSRestBundle`_ where routing is generated based -off the names of the action methods in a controller. +on the names of the action methods in a controller. .. note:: There are many bundles out there that use their own route loaders to accomplish cases like those described above, for instance - `FOSRestBundle`_, `JMSI18nRoutingBundle`_, `KnpRadBundle`_ and `SonataAdminBundle`_. + `FOSRestBundle`_, `JMSI18nRoutingBundle`_, `KnpRadBundle`_ and + `SonataAdminBundle`_. Loading Routes -------------- @@ -35,20 +36,18 @@ and therefore have two important methods: :method:`Symfony\\Component\\Config\\Loader\\LoaderInterface::supports` and :method:`Symfony\\Component\\Config\\Loader\\LoaderInterface::load`. -Take these lines from the ``routing.yml`` in the AcmeDemoBundle of the Standard -Edition: +Take these lines from the ``routing.yml`` in the Symfony Standard Edition: .. code-block:: yaml - # src/Acme/DemoBundle/Resources/config/routing.yml - _demo: - resource: "@AcmeDemoBundle/Controller/DemoController.php" + # app/config/routing.yml + app: + resource: @AppBundle/Controller/ type: annotation - prefix: /demo -When the main loader parses this, it tries all the delegate loaders and calls +When the main loader parses this, it tries all registered delegate loaders and calls their :method:`Symfony\\Component\\Config\\Loader\\LoaderInterface::supports` -method with the given resource (``@AcmeDemoBundle/Controller/DemoController.php``) +method with the given resource (``@AppBundle/Controller/``) and type (``annotation``) as arguments. When one of the loader returns ``true``, its :method:`Symfony\\Component\\Config\\Loader\\LoaderInterface::load` method will be called, which should return a :class:`Symfony\\Component\\Routing\\RouteCollection` @@ -59,13 +58,13 @@ Creating a custom Loader To load routes from some custom source (i.e. from something other than annotations, YAML or XML files), you need to create a custom route loader. This loader -should implement :class:`Symfony\\Component\\Config\\Loader\\LoaderInterface`. +has to implement :class:`Symfony\\Component\\Config\\Loader\\LoaderInterface`. The sample loader below supports loading routing resources with a type of ``extra``. The type ``extra`` isn't important - you can just invent any resource type you want. The resource name itself is not actually used in the example:: - namespace Acme\DemoBundle\Routing; + namespace AppBundle\Routing; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Loader\LoaderResolverInterface; @@ -87,14 +86,14 @@ type you want. The resource name itself is not actually used in the example:: // prepare a new route $path = '/extra/{parameter}'; $defaults = array( - '_controller' => 'AcmeDemoBundle:Demo:extra', + '_controller' => 'AppBundle:Extra:extra', ); $requirements = array( 'parameter' => '\d+', ); $route = new Route($path, $defaults, $requirements); - // add the new route to the route collection: + // add the new route to the route collection $routeName = 'extraRoute'; $routes->add($routeName, $route); @@ -120,9 +119,21 @@ type you want. The resource name itself is not actually used in the example:: } } -.. note:: +Make sure the controller you specify really exists. In this case you +have to create an ``extraAction`` method in the ``ExtraController`` +of the ``AppBundle``:: + + namespace AppBundle\Controller; - Make sure the controller you specify really exists. + use Symfony\Component\HttpFoundation\Response; + + class ExtraController extends Controller + { + public function extraAction($parameter) + { + return new Response($parameter); + } + } Now define a service for the ``ExtraLoader``: @@ -130,9 +141,10 @@ Now define a service for the ``ExtraLoader``: .. code-block:: yaml + # app/config/services.yml services: - acme_demo.routing_loader: - class: Acme\DemoBundle\Routing\ExtraLoader + app.routing_loader: + class: AppBundle\Routing\ExtraLoader tags: - { name: routing.loader } @@ -144,7 +156,7 @@ Now define a service for the ``ExtraLoader``: xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> - + @@ -156,14 +168,15 @@ Now define a service for the ``ExtraLoader``: $container ->setDefinition( - 'acme_demo.routing_loader', - new Definition('Acme\DemoBundle\Routing\ExtraLoader') + 'app.routing_loader', + new Definition('AppBundle\Routing\ExtraLoader') ) ->addTag('routing.loader') ; -Notice the tag ``routing.loader``. All services with this tag will be marked -as potential route loaders and added as specialized routers to the +Notice the tag ``routing.loader``. All services with this *tag* will be marked +as potential route loaders and added as specialized route loaders to the +``routing.loader`` *service*, which is an instance of :class:`Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader`. Using the custom Loader @@ -177,7 +190,7 @@ Instead, you only need to add a few extra lines to the routing configuration: .. code-block:: yaml # app/config/routing.yml - AcmeDemoBundle_Extra: + app_extra: resource: . type: extra @@ -201,8 +214,8 @@ Instead, you only need to add a few extra lines to the routing configuration: return $collection; -The important part here is the ``type`` key. Its value should be "extra". -This is the type which the ``ExtraLoader`` supports and this will make sure +The important part here is the ``type`` key. Its value should be "extra" as +this is the type which the ``ExtraLoader`` supports and this will make sure its ``load()`` method gets called. The ``resource`` key is insignificant for the ``ExtraLoader``, so it is set to ".". @@ -218,8 +231,9 @@ More advanced Loaders In most cases it's better not to implement :class:`Symfony\\Component\\Config\\Loader\\LoaderInterface` yourself, but extend from :class:`Symfony\\Component\\Config\\Loader\\Loader`. -This class knows how to use a :class:`Symfony\\Component\\Config\\Loader\\LoaderResolver` -to load secondary routing resources. +This class knows how to use a +:class:`Symfony\\Component\\Config\\Loader\\LoaderResolver` to load secondary +routing resources. Of course you still need to implement :method:`Symfony\\Component\\Config\\Loader\\LoaderInterface::supports` @@ -228,7 +242,7 @@ Whenever you want to load another resource - for instance a YAML routing configuration file - you can call the :method:`Symfony\\Component\\Config\\Loader\\Loader::import` method:: - namespace Acme\DemoBundle\Routing; + namespace AppBundle\Routing; use Symfony\Component\Config\Loader\Loader; use Symfony\Component\Routing\RouteCollection; @@ -239,7 +253,7 @@ configuration file - you can call the { $collection = new RouteCollection(); - $resource = '@AcmeDemoBundle/Resources/config/import_routing.yml'; + $resource = '@AppBundle/Resources/config/import_routing.yml'; $type = 'yaml'; $importedRoutes = $this->import($resource, $type); @@ -251,7 +265,7 @@ configuration file - you can call the public function supports($resource, $type = null) { - return $type === 'advanced_extra'; + return 'advanced_extra' === $type; } } From bd6e3f31c7a4dda9efb5eb9f8664d382e94975d5 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 29 Mar 2015 15:18:16 +0200 Subject: [PATCH 10/61] Rewrite first paragraph --- cookbook/routing/custom_route_loader.rst | 26 ++++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/cookbook/routing/custom_route_loader.rst b/cookbook/routing/custom_route_loader.rst index 5e9b7f25b2e..d93bac0bd67 100644 --- a/cookbook/routing/custom_route_loader.rst +++ b/cookbook/routing/custom_route_loader.rst @@ -4,17 +4,21 @@ How to Create a custom Route Loader =================================== -A custom route loader allows you to add routes to an application without -including them, for example, in a YAML file. This comes in handy when -you have a bundle but don't want to manually add the routes for the bundle -to ``app/config/routing.yml``. This may be especially important when you want -to make the bundle reusable, or when you have open-sourced it as this would -slow down the installation process and make it error-prone. - -Alternatively, you could also use a custom route loader when you want your -routes to be automatically generated or located based on some convention or -pattern. One example is the `FOSRestBundle`_ where routing is generated based -on the names of the action methods in a controller. +What is a Custom Route Loader +----------------------------- + +A custom route loader enables you to generate routes based on some +conventions or patterns. A great example for this use-case is the +`FOSRestBundle`_ where routes are generated based on the names of the +action methods in a controller. + +A custom route loader does not enable your bundle to inject routes +without the need to modify the routing configuration +(e.g. ``app/config/routing.yml``) manually. +If your bundle provides routes, whether via a configuration file, like +the `WebProfilerBundle` does, or via a custom route loader, like the +`FOSRestBundle`_ does, an entry in the routing configuration is always +necessary. .. note:: From fe1a574db6ed904667dc164c88328aa870562b00 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 29 Mar 2015 23:01:29 +0200 Subject: [PATCH 11/61] Change code example to extend from Loader class --- cookbook/routing/custom_route_loader.rst | 30 +++++++++--------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/cookbook/routing/custom_route_loader.rst b/cookbook/routing/custom_route_loader.rst index d93bac0bd67..bff77ee78cf 100644 --- a/cookbook/routing/custom_route_loader.rst +++ b/cookbook/routing/custom_route_loader.rst @@ -64,18 +64,21 @@ To load routes from some custom source (i.e. from something other than annotatio YAML or XML files), you need to create a custom route loader. This loader has to implement :class:`Symfony\\Component\\Config\\Loader\\LoaderInterface`. +In most cases it's better not to implement +:class:`Symfony\\Component\\Config\\Loader\\LoaderInterface` +yourself, but extend from :class:`Symfony\\Component\\Config\\Loader\\Loader`. + The sample loader below supports loading routing resources with a type of ``extra``. The type ``extra`` isn't important - you can just invent any resource type you want. The resource name itself is not actually used in the example:: namespace AppBundle\Routing; - use Symfony\Component\Config\Loader\LoaderInterface; - use Symfony\Component\Config\Loader\LoaderResolverInterface; + use Symfony\Component\Config\Loader\Loader; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; - class ExtraLoader implements LoaderInterface + class ExtraLoader extends Loader { private $loaded = false; @@ -110,17 +113,6 @@ type you want. The resource name itself is not actually used in the example:: { return 'extra' === $type; } - - public function getResolver() - { - // needed, but can be blank, unless you want to load other resources - // and if you do, using the Loader base class is easier (see below) - } - - public function setResolver(LoaderResolverInterface $resolver) - { - // same as above - } } Make sure the controller you specify really exists. In this case you @@ -130,6 +122,7 @@ of the ``AppBundle``:: namespace AppBundle\Controller; use Symfony\Component\HttpFoundation\Response; + use Symfony\Bundle\FrameworkBundle\Controller\Controller; class ExtraController extends Controller { @@ -232,11 +225,10 @@ for the ``ExtraLoader``, so it is set to ".". More advanced Loaders --------------------- -In most cases it's better not to implement -:class:`Symfony\\Component\\Config\\Loader\\LoaderInterface` -yourself, but extend from :class:`Symfony\\Component\\Config\\Loader\\Loader`. -This class knows how to use a -:class:`Symfony\\Component\\Config\\Loader\\LoaderResolver` to load secondary +If your custom route loader extends from +:class:`Symfony\\Component\\Config\\Loader\\Loader` as shown above, you +can also make use of the provided resolver, an instance of +:class:`Symfony\\Component\\Config\\Loader\\LoaderResolver`, to load secondary routing resources. Of course you still need to implement From 08b1527eea08d0b2ebcd81eacc50c6e5d659a956 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Wed, 29 Apr 2015 20:52:48 +0200 Subject: [PATCH 12/61] Add filename comments to code blocks --- cookbook/routing/custom_route_loader.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cookbook/routing/custom_route_loader.rst b/cookbook/routing/custom_route_loader.rst index bff77ee78cf..046ea128409 100644 --- a/cookbook/routing/custom_route_loader.rst +++ b/cookbook/routing/custom_route_loader.rst @@ -72,6 +72,7 @@ The sample loader below supports loading routing resources with a type of ``extra``. The type ``extra`` isn't important - you can just invent any resource type you want. The resource name itself is not actually used in the example:: + // src/AppBundle/Routing/ExtraLoader.php namespace AppBundle\Routing; use Symfony\Component\Config\Loader\Loader; @@ -119,6 +120,7 @@ Make sure the controller you specify really exists. In this case you have to create an ``extraAction`` method in the ``ExtraController`` of the ``AppBundle``:: + // src/AppBundle/Controller/ExtraController.php namespace AppBundle\Controller; use Symfony\Component\HttpFoundation\Response; @@ -238,6 +240,7 @@ Whenever you want to load another resource - for instance a YAML routing configuration file - you can call the :method:`Symfony\\Component\\Config\\Loader\\Loader::import` method:: + // src/AppBundle/Routing/AdvancedLoader.php namespace AppBundle\Routing; use Symfony\Component\Config\Loader\Loader; From 751d0dfca017ff44693962901cff7dcbefb24495 Mon Sep 17 00:00:00 2001 From: Javier Spagnoletti Date: Tue, 5 May 2015 15:00:23 -0300 Subject: [PATCH 13/61] [Cookbook] [Deployment] Added note about Nginx setup | Q | A | ------------- | --- | Doc fix? | yes | New docs? | no | Applies to | 2.3+ | Fixed tickets | --- cookbook/deployment/heroku.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cookbook/deployment/heroku.rst b/cookbook/deployment/heroku.rst index 83f71d8949b..7bd8373d381 100644 --- a/cookbook/deployment/heroku.rst +++ b/cookbook/deployment/heroku.rst @@ -106,6 +106,16 @@ directory of the application and add just the following content: web: bin/heroku-php-apache2 web/ +.. note:: + + If you prefer to use Nginx, which is also available on Heroku, you can create + a configuration file for it and point to it from your Procfile as described + in the `Heroku documentation`_: + + .. code-block:: text + + web: bin/heroku-php-nginx -C nginx_app.conf web/ + If you prefer working on the command console, execute the following commands to create the ``Procfile`` file and to add it to the repository: @@ -329,3 +339,4 @@ This is also very useful to build assets on the production system, e.g. with Ass .. _`multiple buildpack`: https://github.com/ddollar/heroku-buildpack-multi.git .. _`Grunt`: http://gruntjs.com .. _`gulp`: http://gulpjs.com +.. _`Heroku documentation`: https://devcenter.heroku.com/articles/custom-php-settings#nginx From 4e0dee6c6caacc8672775f775867fb6ba973020e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Kr=C3=B3lak?= Date: Wed, 6 May 2015 23:51:27 +0200 Subject: [PATCH 14/61] Update authentication.rst Added missing ```use``` base class for FoobarEncoder --- components/security/authentication.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/security/authentication.rst b/components/security/authentication.rst index 4708d569c69..5e1159a345a 100644 --- a/components/security/authentication.rst +++ b/components/security/authentication.rst @@ -214,6 +214,7 @@ own, it just needs to follow these rules: method for this check:: use Symfony\Component\Security\Core\Exception\BadCredentialsException; + use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder; class FoobarEncoder extends BasePasswordEncoder { From 91bdf7e0e39b9b7aaead419a549b2ac347718f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Kr=C3=B3lak?= Date: Thu, 7 May 2015 19:08:41 +0200 Subject: [PATCH 15/61] Update authentication.rst --- components/security/authentication.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/security/authentication.rst b/components/security/authentication.rst index 5e1159a345a..f5522f5fc3e 100644 --- a/components/security/authentication.rst +++ b/components/security/authentication.rst @@ -213,8 +213,8 @@ own, it just needs to follow these rules: :method:`Symfony\\Component\\Security\\Core\\Encoder\\BasePasswordEncoder::isPasswordTooLong` method for this check:: - use Symfony\Component\Security\Core\Exception\BadCredentialsException; use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder; + use Symfony\Component\Security\Core\Exception\BadCredentialsException; class FoobarEncoder extends BasePasswordEncoder { From d9f7e4e470e5ea447bc86c18aaeb90be67b8cdb4 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Thu, 7 May 2015 20:02:57 +0200 Subject: [PATCH 16/61] apply some fixes to the Form events chapter * remove serial commas * replace wrong event constant * replace reference to form events overview that did not provide any context with a more meaningful `seealso` section --- components/form/form_events.rst | 45 ++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/components/form/form_events.rst b/components/form/form_events.rst index 838d59efe02..3b93632e116 100644 --- a/components/form/form_events.rst +++ b/components/form/form_events.rst @@ -59,8 +59,6 @@ The ``FormEvents::PRE_SET_DATA`` event is dispatched at the beginning of the * Modify the data given during pre-population; * Modify a form depending on the pre-populated data (adding or removing fields dynamically). -:ref:`Form Events Information Table` - =============== ======== Data Type Value =============== ======== @@ -69,6 +67,11 @@ Normalized data ``null`` View data ``null`` =============== ======== +.. seealso:: + + See all form events at a glance in the + :ref:`Form Events Information Table `. + .. caution:: During ``FormEvents::PRE_SET_DATA``, @@ -94,8 +97,6 @@ The ``FormEvents::POST_SET_DATA`` event is dispatched at the end of the method. This event is mostly here for reading data after having pre-populated the form. -:ref:`Form Events Information Table` - =============== ==================================================== Data Type Value =============== ==================================================== @@ -104,6 +105,11 @@ Normalized data Model data transformed using a model transformer View data Normalized data transformed using a view transformer =============== ==================================================== +.. seealso:: + + See all form events at a glance in the + :ref:`Form Events Information Table `. + .. sidebar:: ``FormEvents::POST_SET_DATA`` in the Form component The ``Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorListener`` @@ -134,8 +140,6 @@ It can be used to: * Change data from the request, before submitting the data to the form; * Add or remove form fields, before submitting the data to the form. -:ref:`Form Events Information Table` - =============== ======================================== Data Type Value =============== ======================================== @@ -144,6 +148,11 @@ Normalized data Same as in ``FormEvents::POST_SET_DATA`` View data Same as in ``FormEvents::POST_SET_DATA`` =============== ======================================== +.. seealso:: + + See all form events at a glance in the + :ref:`Form Events Information Table `. + .. sidebar:: ``FormEvents::PRE_SUBMIT`` in the Form component The ``Symfony\Component\Form\Extension\Core\EventListener\TrimListener`` @@ -162,8 +171,6 @@ transforms back the normalized data to the model and view data. It can be used to change data from the normalized representation of the data. -:ref:`Form Events Information Table` - =============== =================================================================================== Data Type Value =============== =================================================================================== @@ -172,6 +179,11 @@ Normalized data Data from the request reverse-transformed from the request usin View data Same as in ``FormEvents::POST_SET_DATA`` =============== =================================================================================== +.. seealso:: + + See all form events at a glance in the + :ref:`Form Events Information Table `. + .. caution:: At this point, you cannot add or remove fields to the form. @@ -192,16 +204,19 @@ model and view data have been denormalized. It can be used to fetch data after denormalization. -:ref:`Form Events Information Table` - =============== ============================================================= Data Type Value =============== ============================================================= Model data Normalized data reverse-transformed using a model transformer -Normalized data Same as in ``FormEvents::POST_SUBMIT`` +Normalized data Same as in ``FormEvents::SUBMIT`` View data Normalized data transformed using a view transformer =============== ============================================================= +.. seealso:: + + See all form events at a glance in the + :ref:`Form Events Information Table `. + .. caution:: At this point, you cannot add or remove fields to the form. @@ -213,21 +228,21 @@ View data Normalized data transformed using a view transformer information about the forms. The ``Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener`` subscribes to the ``FormEvents::POST_SUBMIT`` event in order to - automatically validate the denormalized object, and update the normalized - as well as the view's representations. + automatically validate the denormalized object and to update the normalized + representation as well as the view representations. Registering Event Listeners or Event Subscribers ------------------------------------------------ In order to be able to use Form events, you need to create an event listener -or an event subscriber, and register it to an event. +or an event subscriber and register it to an event. The name of each of the "form" events is defined as a constant on the :class:`Symfony\\Component\\Form\\FormEvents` class. Additionally, each event callback (listener or subscriber method) is passed a single argument, which is an instance of :class:`Symfony\\Component\\Form\\FormEvent`. The event object contains a -reference to the current state of the form, and the current data being +reference to the current state of the form and the current data being processed. .. _component-form-event-table: From bd6207832e38ffa4669216d3dd94030889e19f72 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Tue, 12 May 2015 23:38:45 +0200 Subject: [PATCH 17/61] replace docs for removed `forward()` method The `forward()` method was removed from the `HttpKernel` class in the FrameworkBundle in Symfony 2.3. Instead, the current request needs to be duplicated and handled by the kernel's `handle()` method. --- cookbook/controller/service.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cookbook/controller/service.rst b/cookbook/controller/service.rst index 50f781754b6..4fa3af4deb5 100644 --- a/cookbook/controller/service.rst +++ b/cookbook/controller/service.rst @@ -258,7 +258,13 @@ controller: :method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::forward` (service: ``http_kernel``) .. code-block:: php - $httpKernel->forward($controller, $path, $query); + use Symfony\Component\HttpKernel\HttpKernelInterface; + // ... + + $request = ...; + $attributes = array_merge($path, array('_controller' => $controller)); + $subRequest = $request->duplicate($query, null, $attributes); + $httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST); :method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::generateUrl` (service: ``router``) .. code-block:: php From 67831b3488cbe03cc73a589e3d8a6b3b83e32878 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 22 Jan 2015 17:48:42 +0100 Subject: [PATCH 18/61] Removed the Internals chapter from the Symfony book --- book/index.rst | 2 +- book/internals.rst | 668 ------------------------------------------ book/map.rst.inc | 2 +- reference/events.rst | 189 ++++++++++++ reference/index.rst | 1 + reference/map.rst.inc | 1 + 6 files changed, 193 insertions(+), 670 deletions(-) delete mode 100644 book/internals.rst create mode 100644 reference/events.rst diff --git a/book/index.rst b/book/index.rst index 185f7ccb88f..4fe44317b52 100644 --- a/book/index.rst +++ b/book/index.rst @@ -21,6 +21,6 @@ The Book translation service_container performance - internals + stable_api .. include:: /book/map.rst.inc diff --git a/book/internals.rst b/book/internals.rst deleted file mode 100644 index 7a0db79fb61..00000000000 --- a/book/internals.rst +++ /dev/null @@ -1,668 +0,0 @@ -.. index:: - single: Internals - -Internals -========= - -Looks like you want to understand how Symfony works and how to extend it. -That makes me very happy! This section is an in-depth explanation of the -Symfony internals. - -.. note:: - - You only need to read this section if you want to understand how Symfony - works behind the scenes, or if you want to extend Symfony. - -Overview --------- - -The Symfony code is made of several independent layers. Each layer is built -on top of the previous one. - -.. tip:: - - Autoloading is not managed by the framework directly; it's done by using - Composer's autoloader (``vendor/autoload.php``), which is included in - the ``app/autoload.php`` file. - -HttpFoundation Component -~~~~~~~~~~~~~~~~~~~~~~~~ - -The deepest level is the :namespace:`Symfony\\Component\\HttpFoundation` -component. HttpFoundation provides the main objects needed to deal with HTTP. -It is an object-oriented abstraction of some native PHP functions and -variables: - -* The :class:`Symfony\\Component\\HttpFoundation\\Request` class abstracts - the main PHP global variables like ``$_GET``, ``$_POST``, ``$_COOKIE``, - ``$_FILES``, and ``$_SERVER``; - -* The :class:`Symfony\\Component\\HttpFoundation\\Response` class abstracts - some PHP functions like ``header()``, ``setcookie()``, and ``echo``; - -* The :class:`Symfony\\Component\\HttpFoundation\\Session\\Session` class and - :class:`Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface` - interface abstract session management ``session_*()`` functions. - -.. note:: - - Read more about the :doc:`HttpFoundation component `. - -HttpKernel Component -~~~~~~~~~~~~~~~~~~~~ - -On top of HttpFoundation is the :namespace:`Symfony\\Component\\HttpKernel` -component. HttpKernel handles the dynamic part of HTTP; it is a thin wrapper -on top of the Request and Response classes to standardize the way requests are -handled. It also provides extension points and tools that makes it the ideal -starting point to create a web framework without too much overhead. - -It also optionally adds configurability and extensibility, thanks to the -DependencyInjection component and a powerful plugin system (bundles). - -.. seealso:: - - Read more about the :doc:`HttpKernel component `, - :doc:`Dependency Injection ` and - :doc:`Bundles `. - -FrameworkBundle -~~~~~~~~~~~~~~~ - -The :namespace:`Symfony\\Bundle\\FrameworkBundle` bundle is the bundle that -ties the main components and libraries together to make a lightweight and fast -MVC framework. It comes with a sensible default configuration and conventions -to ease the learning curve. - -.. index:: - single: Internals; Kernel - -Kernel ------- - -The :class:`Symfony\\Component\\HttpKernel\\HttpKernel` class is the central -class of Symfony and is responsible for handling client requests. Its main -goal is to "convert" a :class:`Symfony\\Component\\HttpFoundation\\Request` -object to a :class:`Symfony\\Component\\HttpFoundation\\Response` object. - -Every Symfony Kernel implements -:class:`Symfony\\Component\\HttpKernel\\HttpKernelInterface`:: - - function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) - -.. index:: - single: Internals; Controller resolver - -Controllers -~~~~~~~~~~~ - -To convert a Request to a Response, the Kernel relies on a "Controller". A -Controller can be any valid PHP callable. - -The Kernel delegates the selection of what Controller should be executed -to an implementation of -:class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface`:: - - public function getController(Request $request); - - public function getArguments(Request $request, $controller); - -The -:method:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface::getController` -method returns the Controller (a PHP callable) associated with the given -Request. The default implementation -(:class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver`) -looks for a ``_controller`` request attribute that represents the controller -name (a "class::method" string, like ``Bundle\BlogBundle\PostController:indexAction``). - -.. tip:: - - The default implementation uses the - :class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\RouterListener` - to define the ``_controller`` Request attribute (see :ref:`kernel-core-request`). - -The -:method:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface::getArguments` -method returns an array of arguments to pass to the Controller callable. The -default implementation automatically resolves the method arguments, based on -the Request attributes. - -.. sidebar:: Matching Controller Method Arguments from Request Attributes - - For each method argument, Symfony tries to get the value of a Request - attribute with the same name. If it is not defined, the argument default - value is used if defined:: - - // Symfony will look for an 'id' attribute (mandatory) - // and an 'admin' one (optional) - public function showAction($id, $admin = true) - { - // ... - } - -.. index:: - single: Internals; Request handling - -Handling Requests -~~~~~~~~~~~~~~~~~ - -The :method:`Symfony\\Component\\HttpKernel\\HttpKernel::handle` method -takes a ``Request`` and *always* returns a ``Response``. To convert the -``Request``, ``handle()`` relies on the Resolver and an ordered chain of -Event notifications (see the next section for more information about each -Event): - -#. Before doing anything else, the ``kernel.request`` event is notified -- if - one of the listeners returns a ``Response``, it jumps to step 8 directly; - -#. The Resolver is called to determine the Controller to execute; - -#. Listeners of the ``kernel.controller`` event can now manipulate the - Controller callable the way they want (change it, wrap it, ...); - -#. The Kernel checks that the Controller is actually a valid PHP callable; - -#. The Resolver is called to determine the arguments to pass to the Controller; - -#. The Kernel calls the Controller; - -#. If the Controller does not return a ``Response``, listeners of the - ``kernel.view`` event can convert the Controller return value to a ``Response``; - -#. Listeners of the ``kernel.response`` event can manipulate the ``Response`` - (content and headers); - -#. The Response is returned; - -#. Listeners of the ``kernel.terminate`` event can perform tasks after the - Response has been served. - -If an exception is thrown during processing, the ``kernel.exception`` is -notified and listeners are given a chance to convert the exception into a -Response. If that works, the ``kernel.response`` event is notified; if not, the -Exception is re-thrown. - -If you don't want exceptions to be caught (for embedded requests for -instance), disable the ``kernel.exception`` event by passing ``false`` as the -third argument to the ``handle()`` method. - -.. index:: - single: Internals; Internal requests - -Internal Requests -~~~~~~~~~~~~~~~~~ - -At any time during the handling of a request (the 'master' one), a sub-request -can be handled. You can pass the request type to the ``handle()`` method (its -second argument): - -* ``HttpKernelInterface::MASTER_REQUEST``; -* ``HttpKernelInterface::SUB_REQUEST``. - -The type is passed to all events and listeners can act accordingly (some -processing must only occur on the master request). - -.. index:: - pair: Kernel; Event - -Events -~~~~~~ - -Each event thrown by the Kernel is a subclass of -:class:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent`. This means that -each event has access to the same basic information: - -:method:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent::getRequestType` - Returns the *type* of the request (``HttpKernelInterface::MASTER_REQUEST`` or - ``HttpKernelInterface::SUB_REQUEST``). - -:method:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent::getKernel` - Returns the Kernel handling the request. - -:method:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent::getRequest` - Returns the current ``Request`` being handled. - -``getRequestType()`` -.................... - -The ``getRequestType()`` method allows listeners to know the type of the -request. For instance, if a listener must only be active for master requests, -add the following code at the beginning of your listener method:: - - use Symfony\Component\HttpKernel\HttpKernelInterface; - - if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { - // return immediately - return; - } - -.. tip:: - - If you are not yet familiar with the Symfony EventDispatcher component, - read :doc:`its documentation ` - section first. - -.. index:: - single: Event; kernel.request - -.. _kernel-core-request: - -``kernel.request`` Event -........................ - -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent` - -The goal of this event is to either return a ``Response`` object immediately -or setup variables so that a Controller can be called after the event. Any -listener can return a ``Response`` object via the ``setResponse()`` method on -the event. In this case, all other listeners won't be called. - -This event is used by the FrameworkBundle to populate the ``_controller`` -``Request`` attribute, via the -:class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\RouterListener`. RequestListener -uses a :class:`Symfony\\Component\\Routing\\RouterInterface` object to match -the ``Request`` and determine the Controller name (stored in the -``_controller`` ``Request`` attribute). - -.. seealso:: - - Read more on the :ref:`kernel.request event `. - -.. index:: - single: Event; kernel.controller - -``kernel.controller`` Event -........................... - -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent` - -This event is not used by the FrameworkBundle, but can be an entry point used -to modify the controller that should be executed:: - - use Symfony\Component\HttpKernel\Event\FilterControllerEvent; - - public function onKernelController(FilterControllerEvent $event) - { - $controller = $event->getController(); - // ... - - // the controller can be changed to any PHP callable - $event->setController($controller); - } - -.. seealso:: - - Read more on the :ref:`kernel.controller event `. - -.. index:: - single: Event; kernel.view - -``kernel.view`` Event -..................... - -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent` - -This event is not used by the FrameworkBundle, but it can be used to implement -a view sub-system. This event is called *only* if the Controller does *not* -return a ``Response`` object. The purpose of the event is to allow some other -return value to be converted into a ``Response``. - -The value returned by the Controller is accessible via the -``getControllerResult`` method:: - - use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; - use Symfony\Component\HttpFoundation\Response; - - public function onKernelView(GetResponseForControllerResultEvent $event) - { - $val = $event->getControllerResult(); - $response = new Response(); - - // ... some how customize the Response from the return value - - $event->setResponse($response); - } - -.. seealso:: - - Read more on the :ref:`kernel.view event `. - -.. index:: - single: Event; kernel.response - -``kernel.response`` Event -......................... - -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent` - -The purpose of this event is to allow other systems to modify or replace the -``Response`` object after its creation:: - - public function onKernelResponse(FilterResponseEvent $event) - { - $response = $event->getResponse(); - - // ... modify the response object - } - -The FrameworkBundle registers several listeners: - -:class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` - Collects data for the current request. - -:class:`Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener` - Injects the web debug toolbar. - -:class:`Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener` - Fixes the Response ``Content-Type`` based on the request format. - -:class:`Symfony\\Component\\HttpKernel\\EventListener\\EsiListener` - Adds a ``Surrogate-Control`` HTTP header when the Response needs to be parsed - for ESI tags. - -.. seealso:: - - Read more on the :ref:`kernel.response event `. - -.. index:: - single: Event; kernel.terminate - -``kernel.terminate`` Event -.......................... - -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent` - -The purpose of this event is to perform "heavier" tasks after the response -was already served to the client. - -.. seealso:: - - Read more on the :ref:`kernel.terminate event `. - -.. index:: - single: Event; kernel.exception - -.. _kernel-kernel.exception: - -``kernel.exception`` Event -.......................... - -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent` - -The FrameworkBundle registers an -:class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` that -forwards the ``Request`` to a given Controller (the value of the -``exception_listener.controller`` parameter -- must be in the -``class::method`` notation). - -A listener on this event can create and set a ``Response`` object, create -and set a new ``Exception`` object or do nothing:: - - use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; - use Symfony\Component\HttpFoundation\Response; - - public function onKernelException(GetResponseForExceptionEvent $event) - { - $exception = $event->getException(); - $response = new Response(); - // setup the Response object based on the caught exception - $event->setResponse($response); - - // you can alternatively set a new Exception - // $exception = new \Exception('Some special exception'); - // $event->setException($exception); - } - -.. note:: - - As Symfony ensures that the Response status code is set to the most - appropriate one depending on the exception, setting the status on the - response won't work. If you want to overwrite the status code (which you - should not without a good reason), set the ``X-Status-Code`` header:: - - return new Response( - 'Error', - 404 // ignored, - array('X-Status-Code' => 200) - ); - -.. seealso:: - - Read more on the :ref:`kernel.exception event `. - -.. index:: - single: EventDispatcher - -.. _the-eventdispatcher: - -The EventDispatcher Component ------------------------------ - -The EventDispatcher is a standalone component that is responsible for much -of the underlying logic and flow behind a Symfony request. For more information, -see the :doc:`EventDispatcher component documentation `. - -.. index:: - single: Profiler - -.. _internals-profiler: - -Profiler --------- - -When enabled, the Symfony profiler collects useful information about each -request made to your application and store them for later analysis. Use the -profiler in the development environment to help you to debug your code and -enhance performance; use it in the production environment to explore problems -after the fact. - -You rarely have to deal with the profiler directly as Symfony provides -visualizer tools like the web debug toolbar and the web profiler. If you use -the Symfony Standard Edition, the profiler, the web debug toolbar, and the -web profiler are all already configured with sensible settings. - -.. note:: - - The profiler collects information for all requests (simple requests, - redirects, exceptions, Ajax requests, ESI requests; and for all HTTP - methods and all formats). It means that for a single URL, you can have - several associated profiling data (one per external request/response - pair). - -.. index:: - single: Profiler; Visualizing - -Visualizing Profiling Data -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Using the Web Debug Toolbar -........................... - -In the development environment, the web debug toolbar is available at the -bottom of all pages. It displays a good summary of the profiling data that -gives you instant access to a lot of useful information when something does -not work as expected. - -If the summary provided by the web debug toolbar is not enough, click on the -token link (a string made of 13 random characters) to access the Web Profiler. - -.. note:: - - If the token is not clickable, it means that the profiler routes are not - registered (see below for configuration information). - -Analyzing Profiling Data with the Web Profiler -.............................................. - -The Web Profiler is a visualization tool for profiling data that you can use -in development to debug your code and enhance performance; but it can also be -used to explore problems that occur in production. It exposes all information -collected by the profiler in a web interface. - -.. index:: - single: Profiler; Using the profiler service - -Accessing the Profiling information -................................... - -You don't need to use the default visualizer to access the profiling -information. But how can you retrieve profiling information for a specific -request after the fact? When the profiler stores data about a Request, it also -associates a token with it; this token is available in the ``X-Debug-Token`` -HTTP header of the Response:: - - $profile = $container->get('profiler')->loadProfileFromResponse($response); - - $profile = $container->get('profiler')->loadProfile($token); - -.. tip:: - - When the profiler is enabled but not the web debug toolbar, or when you - want to get the token for an Ajax request, use a tool like Firebug to get - the value of the ``X-Debug-Token`` HTTP header. - -Use the :method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::find` -method to access tokens based on some criteria:: - - // get the latest 10 tokens - $tokens = $container->get('profiler')->find('', '', 10, '', ''); - - // get the latest 10 tokens for all URL containing /admin/ - $tokens = $container->get('profiler')->find('', '/admin/', 10, '', ''); - - // get the latest 10 tokens for local requests - $tokens = $container->get('profiler')->find('127.0.0.1', '', 10, '', ''); - - // get the latest 10 tokens for requests that happened between 2 and 4 days ago - $tokens = $container->get('profiler') - ->find('', '', 10, '4 days ago', '2 days ago'); - -If you want to manipulate profiling data on a different machine than the one -where the information were generated, use the -:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::export` and -:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::import` methods:: - - // on the production machine - $profile = $container->get('profiler')->loadProfile($token); - $data = $profiler->export($profile); - - // on the development machine - $profiler->import($data); - -.. index:: - single: Profiler; Visualizing - -Configuration -............. - -The default Symfony configuration comes with sensible settings for the -profiler, the web debug toolbar, and the web profiler. Here is for instance -the configuration for the development environment: - -.. configuration-block:: - - .. code-block:: yaml - - # load the profiler - framework: - profiler: { only_exceptions: false } - - # enable the web profiler - web_profiler: - toolbar: true - intercept_redirects: true - - .. code-block:: xml - - - - - - - - - - - - - - .. code-block:: php - - // load the profiler - $container->loadFromExtension('framework', array( - 'profiler' => array('only_exceptions' => false), - )); - - // enable the web profiler - $container->loadFromExtension('web_profiler', array( - 'toolbar' => true, - 'intercept_redirects' => true, - )); - -When ``only_exceptions`` is set to ``true``, the profiler only collects data -when an exception is thrown by the application. - -When ``intercept_redirects`` is set to ``true``, the web profiler intercepts -the redirects and gives you the opportunity to look at the collected data -before following the redirect. - -If you enable the web profiler, you also need to mount the profiler routes: - -.. configuration-block:: - - .. code-block:: yaml - - _profiler: - resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" - prefix: /_profiler - - .. code-block:: xml - - - - - - - - .. code-block:: php - - use Symfony\Component\Routing\RouteCollection; - - $profiler = $loader->import( - '@WebProfilerBundle/Resources/config/routing/profiler.xml' - ); - $profiler->addPrefix('/_profiler'); - - $collection = new RouteCollection(); - $collection->addCollection($profiler); - -As the profiler adds some overhead, you might want to enable it only under -certain circumstances in the production environment. The ``only_exceptions`` -settings limits profiling to exceptions, but what if you want to get -information when the client IP comes from a specific address, or for a limited -portion of the website? You can use a Profiler Matcher, learn more about that -in ":doc:`/cookbook/profiler/matchers`". - -Learn more from the Cookbook ----------------------------- - -* :doc:`/cookbook/testing/profiling` -* :doc:`/cookbook/profiler/data_collector` -* :doc:`/cookbook/event_dispatcher/class_extension` -* :doc:`/cookbook/event_dispatcher/method_behavior` diff --git a/book/map.rst.inc b/book/map.rst.inc index 0a1b3381c09..07af618d937 100644 --- a/book/map.rst.inc +++ b/book/map.rst.inc @@ -15,4 +15,4 @@ * :doc:`/book/translation` * :doc:`/book/service_container` * :doc:`/book/performance` -* :doc:`/book/internals` +* :doc:`/book/stable_api` diff --git a/reference/events.rst b/reference/events.rst new file mode 100644 index 00000000000..8fda05d2db1 --- /dev/null +++ b/reference/events.rst @@ -0,0 +1,189 @@ +Symfony Framework Events +======================== + +Kernel Events +------------- + +Each event thrown by the Kernel is a subclass of +:class:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent`. This means that +each event has access to the following information: + +:method:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent::getRequestType` + Returns the *type* of the request (``HttpKernelInterface::MASTER_REQUEST`` or + ``HttpKernelInterface::SUB_REQUEST``). + +:method:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent::getKernel` + Returns the Kernel handling the request. + +:method:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent::getRequest` + Returns the current ``Request`` being handled. + +.. _kernel-core-request: + +``kernel.request`` Event +~~~~~~~~~~~~~~~~~~~~~~~~ + +*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent` + +The goal of this event is to either return a ``Response`` object immediately +or setup variables so that a Controller can be called after the event. Any +listener can return a ``Response`` object via the ``setResponse()`` method on +the event. In this case, all other listeners won't be called. + +This event is used by the FrameworkBundle to populate the ``_controller`` +``Request`` attribute, via the +:class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\RouterListener`. +RequestListener uses a :class:`Symfony\\Component\\Routing\\RouterInterface` +object to match the ``Request`` and determine the Controller name (stored in the +``_controller`` ``Request`` attribute). + +.. seealso:: + + Read more on the :ref:`kernel.request event `. + +``kernel.controller`` Event +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent` + +This event is not used by the FrameworkBundle, but can be an entry point used +to modify the controller that should be executed:: + + use Symfony\Component\HttpKernel\Event\FilterControllerEvent; + + public function onKernelController(FilterControllerEvent $event) + { + $controller = $event->getController(); + // ... + + // the controller can be changed to any PHP callable + $event->setController($controller); + } + +.. seealso:: + + Read more on the :ref:`kernel.controller event `. + +``kernel.view`` Event +~~~~~~~~~~~~~~~~~~~~~ + +*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent` + +This event is not used by the FrameworkBundle, but it can be used to implement +a view sub-system. This event is called *only* if the Controller does *not* +return a ``Response`` object. The purpose of the event is to allow some other +return value to be converted into a ``Response``. + +The value returned by the Controller is accessible via the ``getControllerResult`` +method:: + + use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; + use Symfony\Component\HttpFoundation\Response; + + public function onKernelView(GetResponseForControllerResultEvent $event) + { + $val = $event->getControllerResult(); + $response = new Response(); + + // ... some how customize the Response from the return value + + $event->setResponse($response); + } + +.. seealso:: + + Read more on the :ref:`kernel.view event `. + +``kernel.response`` Event +~~~~~~~~~~~~~~~~~~~~~~~~~ + +*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent` + +The purpose of this event is to allow other systems to modify or replace the +``Response`` object after its creation:: + + public function onKernelResponse(FilterResponseEvent $event) + { + $response = $event->getResponse(); + + // ... modify the response object + } + +The FrameworkBundle registers several listeners: + +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` + Collects data for the current request. + +:class:`Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener` + Injects the Web Debug Toolbar. + +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener` + Fixes the Response ``Content-Type`` based on the request format. + +:class:`Symfony\\Component\\HttpKernel\\EventListener\\EsiListener` + Adds a ``Surrogate-Control`` HTTP header when the Response needs to be parsed + for ESI tags. + +.. seealso:: + + Read more on the :ref:`kernel.response event `. + +``kernel.terminate`` Event +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent` + +The purpose of this event is to perform "heavier" tasks after the response +was already served to the client. + +.. seealso:: + + Read more on the :ref:`kernel.terminate event `. + +.. _kernel-kernel.exception: + +``kernel.exception`` Event +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent` + +The FrameworkBundle registers an +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` that +forwards the ``Request`` to a given Controller (the value of the +``exception_listener.controller`` parameter -- must be in the +``class::method`` notation). + +A listener on this event can create and set a ``Response`` object, create +and set a new ``Exception`` object, or do nothing:: + + use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; + use Symfony\Component\HttpFoundation\Response; + + public function onKernelException(GetResponseForExceptionEvent $event) + { + $exception = $event->getException(); + $response = new Response(); + // setup the Response object based on the caught exception + $event->setResponse($response); + + // you can alternatively set a new Exception + // $exception = new \Exception('Some special exception'); + // $event->setException($exception); + } + +.. note:: + + As Symfony ensures that the Response status code is set to the most + appropriate one depending on the exception, setting the status on the + response won't work. If you want to overwrite the status code (which you + should not without a good reason), set the ``X-Status-Code`` header:: + + return new Response( + 'Error', + 404 // ignored, + array('X-Status-Code' => 200) + ); + +.. seealso:: + + Read more on the :ref:`kernel.exception event `. diff --git a/reference/index.rst b/reference/index.rst index c5143e58f53..9d07c4c4609 100644 --- a/reference/index.rst +++ b/reference/index.rst @@ -22,6 +22,7 @@ Reference Documents twig_reference dic_tags + events requirements .. include:: /reference/map.rst.inc diff --git a/reference/map.rst.inc b/reference/map.rst.inc index 1b3ed361694..0bf22aa3b44 100644 --- a/reference/map.rst.inc +++ b/reference/map.rst.inc @@ -27,4 +27,5 @@ * **Other Areas** * :doc:`/reference/dic_tags` + * :doc:`/reference/events` * :doc:`/reference/requirements` From fc8575265351f0be4b660536416b84970b843872 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 22 Jan 2015 18:28:13 +0100 Subject: [PATCH 19/61] Created a new cookbook about getting profiler data programmatically --- cookbook/map.rst.inc | 1 + cookbook/profiler/index.rst | 1 + cookbook/profiler/profiling_data.rst | 60 ++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 cookbook/profiler/profiling_data.rst diff --git a/cookbook/map.rst.inc b/cookbook/map.rst.inc index 6c8e5d59d89..01c63dfa6cf 100644 --- a/cookbook/map.rst.inc +++ b/cookbook/map.rst.inc @@ -119,6 +119,7 @@ * :doc:`/cookbook/profiler/data_collector` * :doc:`/cookbook/profiler/matchers` * :doc:`/cookbook/profiler/storage` + * :doc:`/cookbook/profiler/profiling_data` * :doc:`/cookbook/request/index` diff --git a/cookbook/profiler/index.rst b/cookbook/profiler/index.rst index 7ff3abe1982..b5fb1091099 100644 --- a/cookbook/profiler/index.rst +++ b/cookbook/profiler/index.rst @@ -7,3 +7,4 @@ Profiler data_collector matchers storage + profiling_data diff --git a/cookbook/profiler/profiling_data.rst b/cookbook/profiler/profiling_data.rst new file mode 100644 index 00000000000..97f3c7dbfd3 --- /dev/null +++ b/cookbook/profiler/profiling_data.rst @@ -0,0 +1,60 @@ +.. index:: + single: Profiling; Profiling data + +How to Access Profiling Data Programmatically +============================================= + +Most of the times, the profiler information is accessed and analyzed using its +web-based visualizer. However, you can also retrieve profiling information +programmatically thanks to the methods provided by the ``profiler`` service. + +When the response object is available, use the +:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::loadProfileFromResponse` +method to access to its associated profile:: + + $profile = $container->get('profiler')->loadProfileFromResponse($response); + +When the profiler stores data about a request, it also associates a token with it; +this token is available in the ``X-Debug-Token`` HTTP header of the response. +Using this token, you can access the profile of any past response thanks to the +:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::loadProfile` method:: + + $token = $request->headers->get(X-Debug-Token); + $profile = $container->get('profiler')->loadProfile($token); + +.. tip:: + + When the profiler is enabled but not the web debug toolbar, use a tool like + Firebug to get the value of the ``X-Debug-Token`` HTTP header. + +The ``profiler`` service also provides the +:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::find` method to +look for tokens based on some criteria:: + + // get the latest 10 tokens + $tokens = $container->get('profiler')->find('', '', 10, '', ''); + + // get the latest 10 tokens for all URL containing /admin/ + $tokens = $container->get('profiler')->find('', '/admin/', 10, '', ''); + + // get the latest 10 tokens for local requests + $tokens = $container->get('profiler')->find('127.0.0.1', '', 10, '', ''); + + // get the latest 10 tokens for requests that happened between 2 and 4 days ago + $tokens = $container->get('profiler') + ->find('', '', 10, '4 days ago', '2 days ago'); + +Lastly, if you want to manipulate profiling data on a different machine than the +one where the information were generated, use the ``profiler:export`` and +``profiler:import`` commands: + +.. code-block:: bash + + # on the production machine + $ php app/console profiler:export > profile.data + + # on the development machine + $ php app/console profiler:import /path/to/profile.data + + # you can also pipe from the STDIN + $ cat /path/to/profile.data | php app/console profiler:import From 81e4cfe29bb152b4feabf819a7dd94a593ced975 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 23 Jan 2015 09:59:49 +0100 Subject: [PATCH 20/61] Added a redirection to avoid 404 errors --- redirection_map | 1 + 1 file changed, 1 insertion(+) diff --git a/redirection_map b/redirection_map index 2d782f924fb..e2f84707c66 100644 --- a/redirection_map +++ b/redirection_map @@ -1,4 +1,5 @@ /book/stable_api /contributing/code/bc +/book/internals /reference/events /cookbook/deployment-tools /cookbook/deployment/tools /cookbook/doctrine/migrations /bundles/DoctrineFixturesBundle/index /cookbook/doctrine/doctrine_fixtures /bundles/DoctrineFixturesBundle/index From fb4a63f83b17b4ff80aeed392497804016f949b3 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 23 Jan 2015 10:47:26 +0100 Subject: [PATCH 21/61] Updated the references to the Symfony Profiler documentation --- cookbook/email/testing.rst | 2 +- cookbook/profiler/data_collector.rst | 2 +- cookbook/testing/profiling.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/email/testing.rst b/cookbook/email/testing.rst index c95ea6cb5dc..7ba2d357b6d 100644 --- a/cookbook/email/testing.rst +++ b/cookbook/email/testing.rst @@ -8,7 +8,7 @@ Sending emails with Symfony is pretty straightforward thanks to the SwiftmailerBundle, which leverages the power of the `Swift Mailer`_ library. To functionally test that an email was sent, and even assert the email subject, -content or any other headers, you can use :ref:`the Symfony Profiler `. +content or any other headers, you can use :doc:`the Symfony Profiler `. Start with an easy controller action that sends an email:: diff --git a/cookbook/profiler/data_collector.rst b/cookbook/profiler/data_collector.rst index db3a86bfdab..70d651a30f5 100644 --- a/cookbook/profiler/data_collector.rst +++ b/cookbook/profiler/data_collector.rst @@ -4,7 +4,7 @@ How to Create a custom Data Collector ===================================== -The Symfony :ref:`Profiler ` delegates data collecting to +:doc:`The Symfony Profiler ` delegates data collecting to data collectors. Symfony comes bundled with a few of them, but you can easily create your own. diff --git a/cookbook/testing/profiling.rst b/cookbook/testing/profiling.rst index 0f822cc2079..2f8c8fe2f00 100644 --- a/cookbook/testing/profiling.rst +++ b/cookbook/testing/profiling.rst @@ -9,7 +9,7 @@ you write functional tests that monitor your production servers, you might want to write tests on the profiling data as it gives you a great way to check various things and enforce some metrics. -The Symfony :ref:`Profiler ` gathers a lot of data for +:doc:`The Symfony Profiler ` gathers a lot of data for each request. Use this data to check the number of database calls, the time spent in the framework, etc. But before writing assertions, enable the profiler and check that the profiler is indeed available (it is enabled by default in From f6432ad553ec0953f55f457b7db8014fcd1959df Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 29 Jan 2015 10:41:34 +0100 Subject: [PATCH 22/61] Fixed some wrong cross references --- cookbook/email/testing.rst | 2 +- cookbook/profiler/data_collector.rst | 2 +- cookbook/testing/profiling.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/email/testing.rst b/cookbook/email/testing.rst index 7ba2d357b6d..3797f81b582 100644 --- a/cookbook/email/testing.rst +++ b/cookbook/email/testing.rst @@ -8,7 +8,7 @@ Sending emails with Symfony is pretty straightforward thanks to the SwiftmailerBundle, which leverages the power of the `Swift Mailer`_ library. To functionally test that an email was sent, and even assert the email subject, -content or any other headers, you can use :doc:`the Symfony Profiler `. +content or any other headers, you can use :doc:`the Symfony Profiler `. Start with an easy controller action that sends an email:: diff --git a/cookbook/profiler/data_collector.rst b/cookbook/profiler/data_collector.rst index 70d651a30f5..cc0e0b6fea2 100644 --- a/cookbook/profiler/data_collector.rst +++ b/cookbook/profiler/data_collector.rst @@ -4,7 +4,7 @@ How to Create a custom Data Collector ===================================== -:doc:`The Symfony Profiler ` delegates data collecting to +:doc:`The Symfony Profiler ` delegates data collecting to data collectors. Symfony comes bundled with a few of them, but you can easily create your own. diff --git a/cookbook/testing/profiling.rst b/cookbook/testing/profiling.rst index 2f8c8fe2f00..1789c69dbc9 100644 --- a/cookbook/testing/profiling.rst +++ b/cookbook/testing/profiling.rst @@ -9,7 +9,7 @@ you write functional tests that monitor your production servers, you might want to write tests on the profiling data as it gives you a great way to check various things and enforce some metrics. -:doc:`The Symfony Profiler ` gathers a lot of data for +:doc:`The Symfony Profiler ` gathers a lot of data for each request. Use this data to check the number of database calls, the time spent in the framework, etc. But before writing assertions, enable the profiler and check that the profiler is indeed available (it is enabled by default in From 650d82dd840e99558b427457d21dd878c79e08b5 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 29 Jan 2015 10:51:14 +0100 Subject: [PATCH 23/61] Fixed another wrong internal cross reference --- glossary.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glossary.rst b/glossary.rst index 07f3eeb44a4..612ba71e473 100644 --- a/glossary.rst +++ b/glossary.rst @@ -110,7 +110,7 @@ Glossary The *Kernel* is the core of Symfony. The Kernel object handles HTTP requests using all the bundles and libraries registered to it. See :ref:`The Architecture: The Application Directory ` and the - :doc:`/book/internals` chapter. + :doc:`Internal Events Reference `. Firewall In Symfony, a *Firewall* doesn't have to do with networking. Instead, From 8dabfb1981abd529a8b03a7fda280ef51523a4d7 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 2 Feb 2015 17:04:34 +0100 Subject: [PATCH 24/61] Implemented most of the changes suggested by reviewers --- cookbook/profiler/profiling_data.rst | 9 ++++--- glossary.rst | 2 +- reference/events.rst | 40 ++++++++++++++-------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/cookbook/profiler/profiling_data.rst b/cookbook/profiler/profiling_data.rst index 97f3c7dbfd3..8310ab24eca 100644 --- a/cookbook/profiler/profiling_data.rst +++ b/cookbook/profiler/profiling_data.rst @@ -12,20 +12,21 @@ When the response object is available, use the :method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::loadProfileFromResponse` method to access to its associated profile:: - $profile = $container->get('profiler')->loadProfileFromResponse($response); + // ... $profiler is the 'profiler' service + $profile = $profiler->loadProfileFromResponse($response); When the profiler stores data about a request, it also associates a token with it; this token is available in the ``X-Debug-Token`` HTTP header of the response. Using this token, you can access the profile of any past response thanks to the :method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::loadProfile` method:: - $token = $request->headers->get(X-Debug-Token); + $token = $request->headers->get('X-Debug-Token'); $profile = $container->get('profiler')->loadProfile($token); .. tip:: - When the profiler is enabled but not the web debug toolbar, use a tool like - Firebug to get the value of the ``X-Debug-Token`` HTTP header. + When the profiler is enabled but not the web debug toolbar, use your browser + inspection tools to get the value of the ``X-Debug-Token`` HTTP header. The ``profiler`` service also provides the :method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::find` method to diff --git a/glossary.rst b/glossary.rst index 612ba71e473..87c53f4e9ba 100644 --- a/glossary.rst +++ b/glossary.rst @@ -110,7 +110,7 @@ Glossary The *Kernel* is the core of Symfony. The Kernel object handles HTTP requests using all the bundles and libraries registered to it. See :ref:`The Architecture: The Application Directory ` and the - :doc:`Internal Events Reference `. + :doc:`Internal Events Reference `. Firewall In Symfony, a *Firewall* doesn't have to do with networking. Instead, diff --git a/reference/events.rst b/reference/events.rst index 8fda05d2db1..70fd5ffdc11 100644 --- a/reference/events.rst +++ b/reference/events.rst @@ -4,7 +4,7 @@ Symfony Framework Events Kernel Events ------------- -Each event thrown by the Kernel is a subclass of +Each event dispatched by the kernel is a subclass of :class:`Symfony\\Component\\HttpKernel\\Event\\KernelEvent`. This means that each event has access to the following information: @@ -20,10 +20,10 @@ each event has access to the following information: .. _kernel-core-request: -``kernel.request`` Event -~~~~~~~~~~~~~~~~~~~~~~~~ +``kernel.request`` +~~~~~~~~~~~~~~~~~~ -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent` +**Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent` The goal of this event is to either return a ``Response`` object immediately or setup variables so that a Controller can be called after the event. Any @@ -41,10 +41,10 @@ object to match the ``Request`` and determine the Controller name (stored in the Read more on the :ref:`kernel.request event `. -``kernel.controller`` Event -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``kernel.controller`` +~~~~~~~~~~~~~~~~~~~~~ -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent` +**Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent` This event is not used by the FrameworkBundle, but can be an entry point used to modify the controller that should be executed:: @@ -64,10 +64,10 @@ to modify the controller that should be executed:: Read more on the :ref:`kernel.controller event `. -``kernel.view`` Event -~~~~~~~~~~~~~~~~~~~~~ +``kernel.view`` +~~~~~~~~~~~~~~~ -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent` +**Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent` This event is not used by the FrameworkBundle, but it can be used to implement a view sub-system. This event is called *only* if the Controller does *not* @@ -85,7 +85,7 @@ method:: $val = $event->getControllerResult(); $response = new Response(); - // ... some how customize the Response from the return value + // ... somehow customize the Response from the return value $event->setResponse($response); } @@ -94,10 +94,10 @@ method:: Read more on the :ref:`kernel.view event `. -``kernel.response`` Event -~~~~~~~~~~~~~~~~~~~~~~~~~ +``kernel.response`` +~~~~~~~~~~~~~~~~~~~ -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent` +**Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent` The purpose of this event is to allow other systems to modify or replace the ``Response`` object after its creation:: @@ -128,10 +128,10 @@ The FrameworkBundle registers several listeners: Read more on the :ref:`kernel.response event `. -``kernel.terminate`` Event -~~~~~~~~~~~~~~~~~~~~~~~~~~ +``kernel.terminate`` +~~~~~~~~~~~~~~~~~~~~ -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent` +**Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent` The purpose of this event is to perform "heavier" tasks after the response was already served to the client. @@ -142,10 +142,10 @@ was already served to the client. .. _kernel-kernel.exception: -``kernel.exception`` Event -~~~~~~~~~~~~~~~~~~~~~~~~~~ +``kernel.exception`` +~~~~~~~~~~~~~~~~~~~~ -*Event Class*: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent` +**Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent` The FrameworkBundle registers an :class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` that From 8fcda08d7051d253153ca6df5a58b43031bf5ae5 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 2 Feb 2015 17:25:27 +0100 Subject: [PATCH 25/61] Moved the table of event listeners from the DIC tags article to the events reference --- reference/dic_tags.rst | 85 ++---------------------------------------- reference/events.rst | 55 +++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 82 deletions(-) diff --git a/reference/dic_tags.rst b/reference/dic_tags.rst index 7e4c467849d..03a6e4d8c66 100644 --- a/reference/dic_tags.rst +++ b/reference/dic_tags.rst @@ -132,7 +132,7 @@ And then register it as a tagged service: xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> - @@ -549,86 +549,8 @@ cookbook entry. For another practical example of a kernel listener, see the cookbook article: :doc:`/cookbook/request/mime_type`. -Core Event Listener Reference -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When adding your own listeners, it might be useful to know about the other -core Symfony listeners and their priorities. - -.. note:: - - All listeners listed here may not be listening depending on your environment, - settings and bundles. Additionally, third-party bundles will bring in - additional listeners not listed here. - -kernel.request -.............. - -+-------------------------------------------------------------------------------------------+-----------+ -| Listener Class Name | Priority | -+===========================================================================================+===========+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` | 1024 | -+-------------------------------------------------------------------------------------------+-----------+ -| :class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListener` | 192 | -+-------------------------------------------------------------------------------------------+-----------+ -| :class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener` | 128 | -+-------------------------------------------------------------------------------------------+-----------+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\RouterListener` | 32 | -+-------------------------------------------------------------------------------------------+-----------+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener` | 16 | -+-------------------------------------------------------------------------------------------+-----------+ -| :class:`Symfony\\Component\\Security\\Http\\Firewall` | 8 | -+-------------------------------------------------------------------------------------------+-----------+ - -kernel.controller -................. - -+-------------------------------------------------------------------------------------------+----------+ -| Listener Class Name | Priority | -+===========================================================================================+==========+ -| :class:`Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector` | 0 | -+-------------------------------------------------------------------------------------------+----------+ - -kernel.response -............... - -+-------------------------------------------------------------------------------------------+----------+ -| Listener Class Name | Priority | -+===========================================================================================+==========+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\EsiListener` | 0 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener` | 0 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Bundle\\SecurityBundle\\EventListener\\ResponseListener` | 0 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` | -100 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListener` | -128 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener` | -128 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener` | -1024 | -+-------------------------------------------------------------------------------------------+----------+ - -kernel.exception -................ - -+-------------------------------------------------------------------------------------------+----------+ -| Listener Class Name | Priority | -+===========================================================================================+==========+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` | 0 | -+-------------------------------------------------------------------------------------------+----------+ -| :class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` | -128 | -+-------------------------------------------------------------------------------------------+----------+ - -kernel.terminate -................ - -+-------------------------------------------------------------------------------------------+----------+ -| Listener Class Name | Priority | -+===========================================================================================+==========+ -| `EmailSenderListener`_ | 0 | -+-------------------------------------------------------------------------------------------+----------+ +For the reference of Event Listeners associated with each kernel event, see the +:doc:`Symfony Events Reference reference/events`. .. _dic-tags-kernel-event-subscriber: @@ -1423,4 +1345,3 @@ Bridge. .. _`Twig official extension repository`: https://github.com/twigphp/Twig-extensions .. _`SwiftMailer's Plugin Documentation`: http://swiftmailer.org/docs/plugins.html .. _`Twig Loader`: http://twig.sensiolabs.org/doc/api.html#loaders -.. _`EmailSenderListener`: https://github.com/symfony/SwiftmailerBundle/blob/master/EventListener/EmailSenderListener.php diff --git a/reference/events.rst b/reference/events.rst index 70fd5ffdc11..08ae6611c26 100644 --- a/reference/events.rst +++ b/reference/events.rst @@ -41,6 +41,19 @@ object to match the ``Request`` and determine the Controller name (stored in the Read more on the :ref:`kernel.request event `. +These are the built-in Symfony listeners related to this event: + +============================================================================= ======== +Listener Class Name Priority +============================================================================= ======== +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` 1024 +:class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListener` 192 +:class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener` 128 +:class:`Symfony\\Component\\HttpKernel\\EventListener\\RouterListener` 32 +:class:`Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener` 16 +:class:`Symfony\\Component\\Security\\Http\\Firewall` 8 +============================================================================= ======== + ``kernel.controller`` ~~~~~~~~~~~~~~~~~~~~~ @@ -64,6 +77,14 @@ to modify the controller that should be executed:: Read more on the :ref:`kernel.controller event `. +This is the built-in Symfony listener related to this event: + +============================================================================== ======== +Listener Class Name Priority +============================================================================== ======== +:class:`Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector` 0 +============================================================================== ======== + ``kernel.view`` ~~~~~~~~~~~~~~~ @@ -128,6 +149,20 @@ The FrameworkBundle registers several listeners: Read more on the :ref:`kernel.response event `. +These are the built-in Symfony listeners related to this event: + +=================================================================================== ======== +Listener Class Name Priority +=================================================================================== ======== +:class:`Symfony\\Component\\HttpKernel\\EventListener\\EsiListener` 0 +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener` 0 +:class:`Symfony\\Bundle\\SecurityBundle\\EventListener\\ResponseListener` 0 +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` -100 +:class:`Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListener` -128 +:class:`Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener` -128 +:class:`Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener` -1024 +=================================================================================== ======== + ``kernel.terminate`` ~~~~~~~~~~~~~~~~~~~~ @@ -140,6 +175,15 @@ was already served to the client. Read more on the :ref:`kernel.terminate event `. +This is the built-in Symfony listener related to this event: + +========================================================================= ======== +Listener Class Name Priority +========================================================================= ======== +`EmailSenderListener`_ 0 +========================================================================= ======== + + .. _kernel-kernel.exception: ``kernel.exception`` @@ -187,3 +231,14 @@ and set a new ``Exception`` object, or do nothing:: .. seealso:: Read more on the :ref:`kernel.exception event `. + +These are the built-in Symfony listeners related to this event: + +========================================================================= ======== +Listener Class Name Priority +========================================================================= ======== +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener` 0 +:class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` -128 +========================================================================= ======== + +.. _`EmailSenderListener`: https://github.com/symfony/SwiftmailerBundle/blob/master/EventListener/EmailSenderListener.php From bf33953b0345f97b572c69171a29727e7e45d369 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 2 Feb 2015 18:09:29 +0100 Subject: [PATCH 26/61] Removed the reference to the deleted Stable API book chapter --- book/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/book/index.rst b/book/index.rst index 4fe44317b52..70d6cd2558e 100644 --- a/book/index.rst +++ b/book/index.rst @@ -21,6 +21,5 @@ The Book translation service_container performance - stable_api .. include:: /book/map.rst.inc From 0f6141a2c669e8a1b31dc1c3c88c87d30c30c99a Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 3 Feb 2015 10:21:47 +0100 Subject: [PATCH 27/61] Removed reference to Stable API chapter from book map file --- book/map.rst.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/book/map.rst.inc b/book/map.rst.inc index 07af618d937..d432bfe3674 100644 --- a/book/map.rst.inc +++ b/book/map.rst.inc @@ -15,4 +15,3 @@ * :doc:`/book/translation` * :doc:`/book/service_container` * :doc:`/book/performance` -* :doc:`/book/stable_api` From 4c5c8519f39b6db1746f718f88936228bee12a42 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 3 Feb 2015 10:28:52 +0100 Subject: [PATCH 28/61] Fixed the link of an internal cross reference --- reference/dic_tags.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/dic_tags.rst b/reference/dic_tags.rst index 03a6e4d8c66..993d7ad80e0 100644 --- a/reference/dic_tags.rst +++ b/reference/dic_tags.rst @@ -550,7 +550,7 @@ For another practical example of a kernel listener, see the cookbook article: :doc:`/cookbook/request/mime_type`. For the reference of Event Listeners associated with each kernel event, see the -:doc:`Symfony Events Reference reference/events`. +:doc:`Symfony Events Reference `. .. _dic-tags-kernel-event-subscriber: From 417dae61bb3349c178c48b29958501f64e5e6425 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 17 Feb 2015 13:04:33 +0100 Subject: [PATCH 29/61] Improved a lot of things thanks to the comments made by reviewers --- cookbook/profiler/profiling_data.rst | 7 ++++--- reference/events.rst | 21 +++++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cookbook/profiler/profiling_data.rst b/cookbook/profiler/profiling_data.rst index 8310ab24eca..fd5937f51e3 100644 --- a/cookbook/profiler/profiling_data.rst +++ b/cookbook/profiler/profiling_data.rst @@ -25,8 +25,9 @@ Using this token, you can access the profile of any past response thanks to the .. tip:: - When the profiler is enabled but not the web debug toolbar, use your browser - inspection tools to get the value of the ``X-Debug-Token`` HTTP header. + When the profiler is enabled but not the web debug toolbar, inspect the page + with your browser's developer tools to get the value of the ``X-Debug-Token`` + HTTP header. The ``profiler`` service also provides the :method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::find` method to @@ -46,7 +47,7 @@ look for tokens based on some criteria:: ->find('', '', 10, '4 days ago', '2 days ago'); Lastly, if you want to manipulate profiling data on a different machine than the -one where the information were generated, use the ``profiler:export`` and +one where the information was generated, use the ``profiler:export`` and ``profiler:import`` commands: .. code-block:: bash diff --git a/reference/events.rst b/reference/events.rst index 08ae6611c26..f60c566380a 100644 --- a/reference/events.rst +++ b/reference/events.rst @@ -41,7 +41,7 @@ object to match the ``Request`` and determine the Controller name (stored in the Read more on the :ref:`kernel.request event `. -These are the built-in Symfony listeners related to this event: +These are the built-in Symfony listeners registered to this event: ============================================================================= ======== Listener Class Name Priority @@ -59,8 +59,7 @@ Listener Class Name P **Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent` -This event is not used by the FrameworkBundle, but can be an entry point used -to modify the controller that should be executed:: +This event can be an entry point used to modify the controller that should be executed:: use Symfony\Component\HttpKernel\Event\FilterControllerEvent; @@ -149,7 +148,7 @@ The FrameworkBundle registers several listeners: Read more on the :ref:`kernel.response event `. -These are the built-in Symfony listeners related to this event: +These are the built-in Symfony listeners registered to this event: =================================================================================== ======== Listener Class Name Priority @@ -168,8 +167,8 @@ Listener Class Name **Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent` -The purpose of this event is to perform "heavier" tasks after the response -was already served to the client. +The purpose of this event is to perform tasks after the response was already +served to the client. .. seealso:: @@ -191,11 +190,9 @@ Listener Class Name Prior **Event Class**: :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent` -The FrameworkBundle registers an -:class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` that -forwards the ``Request`` to a given Controller (the value of the -``exception_listener.controller`` parameter -- must be in the -``class::method`` notation). +The TwigBundle registers an :class:`Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener` +that forwards the ``Request`` to a given controller defined by the +``exception_listener.controller`` parameter. A listener on this event can create and set a ``Response`` object, create and set a new ``Exception`` object, or do nothing:: @@ -232,7 +229,7 @@ and set a new ``Exception`` object, or do nothing:: Read more on the :ref:`kernel.exception event `. -These are the built-in Symfony listeners related to this event: +These are the built-in Symfony listeners registered to this event: ========================================================================= ======== Listener Class Name Priority From b078da382734293f95cb573f4dde006348ba01c0 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Fri, 22 May 2015 23:28:37 +0200 Subject: [PATCH 30/61] store templates under app/Resources/views --- cookbook/form/create_custom_field_type.rst | 4 ++-- cookbook/form/dynamic_form_modification.rst | 4 ++-- cookbook/form/form_customization.rst | 12 ++++++------ cookbook/templating/PHP.rst | 12 ++++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cookbook/form/create_custom_field_type.rst b/cookbook/form/create_custom_field_type.rst index 17b28778bac..c13d2c44903 100644 --- a/cookbook/form/create_custom_field_type.rst +++ b/cookbook/form/create_custom_field_type.rst @@ -111,7 +111,7 @@ link for details), create a ``gender_widget`` block to handle this: .. code-block:: html+jinja - {# src/AppBundle/Resources/views/Form/fields.html.twig #} + {# app/Resources/views/Form/fields.html.twig #} {% block gender_widget %} {% spaceless %} {% if expanded %} @@ -132,7 +132,7 @@ link for details), create a ``gender_widget`` block to handle this: .. code-block:: html+php - +
    block($form, 'widget_container_attributes') ?>> diff --git a/cookbook/form/dynamic_form_modification.rst b/cookbook/form/dynamic_form_modification.rst index acada20afda..54b0c09cea6 100644 --- a/cookbook/form/dynamic_form_modification.rst +++ b/cookbook/form/dynamic_form_modification.rst @@ -632,7 +632,7 @@ field according to the current selection in the ``sport`` field: .. code-block:: html+jinja - {# src/AppBundle/Resources/views/Meetup/create.html.twig #} + {# app/Resources/views/Meetup/create.html.twig #} {{ form_start(form) }} {{ form_row(form.sport) }} {# + By replacing ``__name__`` with some unique value (e.g. ``2``), you can build and insert new HTML fields into your form. @@ -160,7 +165,8 @@ you need is the JavaScript: {# ... #} {# store the prototype on the data-prototype attribute #} -
      +
        {% for emailField in form.emails %}
      • {{ form_errors(emailField) }} @@ -203,10 +209,10 @@ you need is the JavaScript: If you're rendering the entire collection at once, then the prototype is automatically available on the ``data-prototype`` attribute of the - element (e.g. ``div`` or ``table``) that surrounds your collection. The - only difference is that the entire "form row" is rendered for you, meaning - you wouldn't have to wrap it in any container element as it was done - above. + element (e.g. ``div`` or ``table``) that surrounds your collection. + The only difference is that the entire "form row" is rendered for you, + meaning you wouldn't have to wrap it in any container element as it + was done above. Field Options ------------- @@ -222,8 +228,9 @@ items as well as the new item that was in the submitted data. See the above example for more details. The `prototype`_ option can be used to help render a prototype item that -can be used - with JavaScript - to create new form items dynamically on the -client side. For more information, see the above example and :ref:`cookbook-form-collections-new-prototype`. +can be used - with JavaScript - to create new form items dynamically on +the client side. For more information, see the above example and +:ref:`cookbook-form-collections-new-prototype`. .. caution:: @@ -249,11 +256,11 @@ For more information, see :ref:`cookbook-form-collections-remove`. Be careful when using this option when you're embedding a collection of objects. In this case, if any embedded forms are removed, they *will* - correctly be missing from the final array of objects. However, depending on - your application logic, when one of those objects is removed, you may want - to delete it or at least remove its foreign key reference to the main object. - None of this is handled automatically. For more information, see - :ref:`cookbook-form-collections-remove`. + correctly be missing from the final array of objects. However, depending + on your application logic, when one of those objects is removed, you + may want to delete it or at least remove its foreign key reference to + the main object. None of this is handled automatically. For more + information, see :ref:`cookbook-form-collections-remove`. options ~~~~~~~ @@ -262,8 +269,9 @@ options This is the array that's passed to the form type specified in the `type`_ option. For example, if you used the :doc:`choice ` -type as your `type`_ option (e.g. for a collection of drop-down menus), then -you'd need to at least pass the ``choices`` option to the underlying type:: +type as your `type`_ option (e.g. for a collection of drop-down menus), +then you'd need to at least pass the ``choices`` option to the underlying +type:: $builder->add('favorite_cities', 'collection', array( 'type' => 'choice', @@ -283,13 +291,13 @@ prototype **type**: ``boolean`` **default**: ``true`` This option is useful when using the `allow_add`_ option. If ``true`` (and -if `allow_add`_ is also ``true``), a special "prototype" attribute will be -available so that you can render a "template" example on your page of what -a new element should look like. The ``name`` attribute given to this element -is ``__name__``. This allows you to add a "add another" button via JavaScript -which reads the prototype, replaces ``__name__`` with some unique name or -number, and render it inside your form. When submitted, it will be added -to your underlying array due to the `allow_add`_ option. +if `allow_add`_ is also ``true``), a special "prototype" attribute will +be available so that you can render a "template" example on your page of +what a new element should look like. The ``name`` attribute given to this +element is ``__name__``. This allows you to add a "add another" button via +JavaScript which reads the prototype, replaces ``__name__`` with some unique +name or number and render it inside your form. When submitted, it will +be added to your underlying array due to the `allow_add`_ option. The prototype field can be rendered via the ``prototype`` variable in the collection field: @@ -313,8 +321,8 @@ rendering your form, having the entire "form row" may be easier for you. form row is automatically available on the ``data-prototype`` attribute of the element (e.g. ``div`` or ``table``) that surrounds your collection. -For details on how to actually use this option, see the above example as well -as :ref:`cookbook-form-collections-new-prototype`. +For details on how to actually use this option, see the above example as +well as :ref:`cookbook-form-collections-new-prototype`. prototype_name ~~~~~~~~~~~~~~ @@ -322,25 +330,26 @@ prototype_name **type**: ``String`` **default**: ``__name__`` If you have several collections in your form, or worse, nested collections -you may want to change the placeholder so that unrelated placeholders are not -replaced with the same value. +you may want to change the placeholder so that unrelated placeholders are +not replaced with the same value. type ~~~~ **type**: ``string`` or :class:`Symfony\\Component\\Form\\FormTypeInterface` **required** -This is the field type for each item in this collection (e.g. ``text``, ``choice``, -etc). For example, if you have an array of email addresses, you'd use the -:doc:`email ` type. If you want to embed -a collection of some other form, create a new instance of your form type -and pass it as this option. +This is the field type for each item in this collection (e.g. ``text``, +``choice``, etc). For example, if you have an array of email addresses, +you'd use the :doc:`email ` type. If you want +to embed a collection of some other form, create a new instance of your +form type and pass it as this option. Inherited Options ----------------- -These options inherit from the :doc:`form ` type. -Not all options are listed here - only the most applicable to this type: +These options inherit from the :doc:`form ` +type. Not all options are listed here - only the most applicable to this +type: .. _reference-form-types-by-reference: diff --git a/reference/forms/types/country.rst b/reference/forms/types/country.rst index c50ac519a48..6efabd4dad1 100644 --- a/reference/forms/types/country.rst +++ b/reference/forms/types/country.rst @@ -5,8 +5,8 @@ country Field Type ================== The ``country`` type is a subset of the ``ChoiceType`` that displays countries -of the world. As an added bonus, the country names are displayed in the language -of the user. +of the world. As an added bonus, the country names are displayed in the +language of the user. The "value" for each country is the two-letter country code. @@ -64,7 +64,8 @@ The locale is used to translate the countries names. Inherited Options ----------------- -These options inherit from the :doc:`choice ` type: +These options inherit from the :doc:`choice ` +type: .. include:: /reference/forms/types/options/empty_value.rst.inc @@ -78,7 +79,8 @@ These options inherit from the :doc:`choice ` typ .. include:: /reference/forms/types/options/preferred_choices.rst.inc -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/currency.rst b/reference/forms/types/currency.rst index f009d726993..14a433fc188 100644 --- a/reference/forms/types/currency.rst +++ b/reference/forms/types/currency.rst @@ -5,13 +5,13 @@ currency Field Type =================== The ``currency`` type is a subset of the -:doc:`choice type ` that allows the user to -select from a large list of `3-letter ISO 4217`_ currencies. +:doc:`choice type ` that allows the user +to select from a large list of `3-letter ISO 4217`_ currencies. Unlike the ``choice`` type, you don't need to specify a ``choices`` or -``choice_list`` option as the field type automatically uses a large list of -currencies. You *can* specify either of these options manually, but then you -should just use the ``choice`` type directly. +``choice_list`` option as the field type automatically uses a large list +of currencies. You *can* specify either of these options manually, but then +you should just use the ``choice`` type directly. +-------------+------------------------------------------------------------------------+ | Rendered as | can be various tags (see :ref:`forms-reference-choice-tags`) | @@ -56,7 +56,8 @@ The choices option defaults to all currencies. Inherited Options ----------------- -These options inherit from the :doc:`choice` type: +These options inherit from the :doc:`choice` +type: .. include:: /reference/forms/types/options/empty_value.rst.inc @@ -68,7 +69,8 @@ These options inherit from the :doc:`choice` type .. include:: /reference/forms/types/options/preferred_choices.rst.inc -These options inherit from the :doc:`form` type: +These options inherit from the :doc:`form` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/date.rst b/reference/forms/types/date.rst index 994ff6156b3..33794d61d78 100644 --- a/reference/forms/types/date.rst +++ b/reference/forms/types/date.rst @@ -12,7 +12,7 @@ a string, a timestamp or an array. As long as the `input`_ option is set correctly, the field will take care of all of the details. The field can be rendered as a single text box, three text boxes (month, -day, and year) or three select boxes (see the `widget`_ option). +day and year) or three select boxes (see the `widget`_ option). +----------------------+-----------------------------------------------------------------------------+ | Underlying Data Type | can be ``DateTime``, string, timestamp, or array (see the ``input`` option) | @@ -54,9 +54,7 @@ options are ``input`` and ``widget``. Suppose that you have a ``publishedAt`` field whose underlying date is a ``DateTime`` object. The following configures the ``date`` type for that -field as three different choice fields: - -.. code-block:: php +field as three different choice fields:: $builder->add('publishedAt', 'date', array( 'input' => 'datetime', @@ -64,10 +62,8 @@ field as three different choice fields: )); The ``input`` option *must* be changed to match the type of the underlying -date data. For example, if the ``publishedAt`` field's data were a unix timestamp, -you'd need to set ``input`` to ``timestamp``: - -.. code-block:: php +date data. For example, if the ``publishedAt`` field's data were a unix +timestamp, you'd need to set ``input`` to ``timestamp``:: $builder->add('publishedAt', 'date', array( 'input' => 'timestamp', @@ -88,8 +84,8 @@ empty_value **type**: ``string`` or ``array`` If your widget option is set to ``choice``, then this field will be represented -as a series of ``select`` boxes. The ``empty_value`` option can be used to -add a "blank" entry to the top of each select box:: +as a series of ``select`` boxes. The ``empty_value`` option can be used +to add a "blank" entry to the top of each select box:: $builder->add('dueDate', 'date', array( 'empty_value' => '', @@ -137,7 +133,8 @@ error_bubbling Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/datetime.rst b/reference/forms/types/datetime.rst index b5caab71dd6..01ac12fb25c 100644 --- a/reference/forms/types/datetime.rst +++ b/reference/forms/types/datetime.rst @@ -7,8 +7,8 @@ datetime Field Type This field type allows the user to modify data that represents a specific date and time (e.g. ``1984-06-05 12:15:30``). -Can be rendered as a text input or select tags. The underlying format of the -data can be a ``DateTime`` object, a string, a timestamp or an array. +Can be rendered as a text input or select tags. The underlying format of +the data can be a ``DateTime`` object, a string, a timestamp or an array. +----------------------+-----------------------------------------------------------------------------+ | Underlying Data Type | can be ``DateTime``, string, timestamp, or array (see the ``input`` option) | @@ -85,8 +85,8 @@ input **type**: ``string`` **default**: ``datetime`` -The format of the *input* data - i.e. the format that the date is stored on -your underlying object. Valid values are: +The format of the *input* data - i.e. the format that the date is stored +on your underlying object. Valid values are: * ``string`` (e.g. ``2011-06-05 12:15:00``) * ``datetime`` (a ``DateTime`` object) @@ -111,7 +111,8 @@ time_widget **type**: ``string`` **default**: ``choice`` -Defines the ``widget`` option for the :doc:`time ` type +Defines the ``widget`` option for the :doc:`time ` +type .. include:: /reference/forms/types/options/view_timezone.rst.inc @@ -121,8 +122,8 @@ widget **type**: ``string`` **default**: ``null`` Defines the ``widget`` option for both the :doc:`date ` -type and :doc:`time ` type. This can be overridden with -the `date_widget`_ and `time_widget`_ options. +type and :doc:`time ` type. This can be overridden +with the `date_widget`_ and `time_widget`_ options. .. include:: /reference/forms/types/options/with_minutes.rst.inc @@ -133,7 +134,8 @@ the `date_widget`_ and `time_widget`_ options. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/email.rst b/reference/forms/types/email.rst index 9a60ae4f32c..780f47a46d8 100644 --- a/reference/forms/types/email.rst +++ b/reference/forms/types/email.rst @@ -31,7 +31,8 @@ The ``email`` field is a text field that is rendered using the HTML5 Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/entity.rst b/reference/forms/types/entity.rst index 85d6d4b4c68..f8cea7271d1 100644 --- a/reference/forms/types/entity.rst +++ b/reference/forms/types/entity.rst @@ -58,18 +58,18 @@ be listed inside the choice field:: 'property' => 'username', )); -In this case, all ``User`` objects will be loaded from the database and rendered -as either a ``select`` tag, a set or radio buttons or a series of checkboxes -(this depends on the ``multiple`` and ``expanded`` values). -If the entity object does not have a ``__toString()`` method the ``property`` option -is needed. +In this case, all ``User`` objects will be loaded from the database and +rendered as either a ``select`` tag, a set or radio buttons or a series +of checkboxes (this depends on the ``multiple`` and ``expanded`` values). +If the entity object does not have a ``__toString()`` method the ``property`` +option is needed. Using a Custom Query for the Entities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you need to specify a custom query to use when fetching the entities (e.g. -you only want to return some entities, or need to order them), use the ``query_builder`` -option. The easiest way to use the option is as follows:: +If you need to specify a custom query to use when fetching the entities +(e.g. you only want to return some entities, or need to order them), use +the ``query_builder`` option. The easiest way to use the option is as follows:: use Doctrine\ORM\EntityRepository; // ... @@ -129,9 +129,9 @@ group_by This is a property path (e.g. ``author.name``) used to organize the available choices in groups. It only works when rendered as a select tag -and does so by adding ``optgroup`` elements around options. Choices that do not -return a value for this property path are rendered directly under the -select tag, without a surrounding optgroup. +and does so by adding ``optgroup`` elements around options. Choices that +do not return a value for this property path are rendered directly under +the select tag, without a surrounding optgroup. property ~~~~~~~~ @@ -144,12 +144,12 @@ cast into a string and so must have a ``__toString()`` method. .. note:: - The ``property`` option is the property path used to display the option. So you - can use anything supported by the + The ``property`` option is the property path used to display the option. + So you can use anything supported by the :doc:`PropertyAccessor component ` - For example, if the translations property is actually an associative array of - objects, each with a name property, then you could do this:: + For example, if the translations property is actually an associative + array of objects, each with a name property, then you could do this:: $builder->add('gender', 'entity', array( 'class' => 'MyBundle:Gender', @@ -192,7 +192,8 @@ See :ref:`reference-forms-entity-choices`. Inherited Options ----------------- -These options inherit from the :doc:`choice ` type: +These options inherit from the :doc:`choice ` +type: .. include:: /reference/forms/types/options/empty_value.rst.inc @@ -202,19 +203,21 @@ These options inherit from the :doc:`choice ` typ .. note:: - If you are working with a collection of Doctrine entities, it will be helpful - to read the documentation for the :doc:`/reference/forms/types/collection` - as well. In addition, there is a complete example in the cookbook article + If you are working with a collection of Doctrine entities, it will be + helpful to read the documentation for the + :doc:`/reference/forms/types/collection` as well. In addition, there + is a complete example in the cookbook article :doc:`/cookbook/form/form_collections`. .. include:: /reference/forms/types/options/preferred_choices.rst.inc .. note:: - This option expects an array of entity objects, unlike the ``choice`` field - that requires an array of keys. + This option expects an array of entity objects, unlike the ``choice`` + field that requires an array of keys. -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/file.rst b/reference/forms/types/file.rst index 36f6c2d06d0..b60666c3893 100644 --- a/reference/forms/types/file.rst +++ b/reference/forms/types/file.rst @@ -27,17 +27,13 @@ The ``file`` type represents a file input in your form. Basic Usage ----------- -Say you have this form definition: - -.. code-block:: php +Say you have this form definition:: $builder->add('attachment', 'file'); -When the form is submitted, the ``attachment`` field will be an instance of -:class:`Symfony\\Component\\HttpFoundation\\File\\UploadedFile`. It can be -used to move the ``attachment`` file to a permanent location: - -.. code-block:: php +When the form is submitted, the ``attachment`` field will be an instance +of :class:`Symfony\\Component\\HttpFoundation\\File\\UploadedFile`. It can +be used to move the ``attachment`` file to a permanent location:: use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -75,13 +71,14 @@ could have been manipulated by the end-user. Moreover, it can contain characters that are not allowed in file names. You should sanitize the name before using it directly. -Read the :doc:`cookbook ` for an example of -how to manage a file upload associated with a Doctrine entity. +Read the :doc:`cookbook ` for an example +of how to manage a file upload associated with a Doctrine entity. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/disabled.rst.inc diff --git a/reference/forms/types/form.rst b/reference/forms/types/form.rst index 8ea4a6ce437..ac3b96d5a0c 100644 --- a/reference/forms/types/form.rst +++ b/reference/forms/types/form.rst @@ -73,7 +73,8 @@ The actual default value of this option depends on other field options: * If ``data_class`` is set and ``required`` is ``false``, then ``null``; * If ``data_class`` is not set and ``compound`` is ``true``, then ``array()`` (empty array); -* If ``data_class`` is not set and ``compound`` is ``false``, then ``''`` (empty string). +* If ``data_class`` is not set and ``compound`` is ``false``, then ``''`` + (empty string). .. include:: /reference/forms/types/options/empty_data.rst.inc :start-after: DEFAULT_PLACEHOLDER diff --git a/reference/forms/types/hidden.rst b/reference/forms/types/hidden.rst index 18a293015b2..6e1b8500fab 100644 --- a/reference/forms/types/hidden.rst +++ b/reference/forms/types/hidden.rst @@ -42,7 +42,8 @@ Hidden fields cannot have a required attribute. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/integer.rst b/reference/forms/types/integer.rst index a2bac1f0334..e6ea1895cb5 100644 --- a/reference/forms/types/integer.rst +++ b/reference/forms/types/integer.rst @@ -10,7 +10,8 @@ like a text box, except that - if the user's browser supports HTML5 - it will have some extra front-end functionality. This field has different options on how to handle input values that aren't -integers. By default, all non-integer values (e.g. 6.78) will round down (e.g. 6). +integers. By default, all non-integer values (e.g. 6.78) will round down +(e.g. 6). +-------------+-----------------------------------------------------------------------+ | Rendered as | ``input`` ``number`` field | @@ -50,7 +51,7 @@ rounding_mode **type**: ``integer`` **default**: ``IntegerToLocalizedStringTransformer::ROUND_DOWN`` By default, if the user enters a non-integer number, it will be rounded -down. There are several other rounding methods, and each is a constant +down. There are several other rounding methods and each is a constant on the :class:`Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\IntegerToLocalizedStringTransformer`: * ``IntegerToLocalizedStringTransformer::ROUND_DOWN`` Rounding mode to @@ -68,7 +69,8 @@ on the :class:`Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\Integ Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/language.rst b/reference/forms/types/language.rst index ede6626279f..75689b88771 100644 --- a/reference/forms/types/language.rst +++ b/reference/forms/types/language.rst @@ -4,12 +4,12 @@ language Field Type =================== -The ``language`` type is a subset of the ``ChoiceType`` that allows the user -to select from a large list of languages. As an added bonus, the language names -are displayed in the language of the user. +The ``language`` type is a subset of the ``ChoiceType`` that allows the +user to select from a large list of languages. As an added bonus, the language +names are displayed in the language of the user. -The "value" for each language is the *Unicode language identifier* used in -the `International Components for Unicode`_ (e.g. ``fr`` or ``zh_Hant``). +The "value" for each language is the *Unicode language identifier* used +in the `International Components for Unicode`_ (e.g. ``fr`` or ``zh_Hant``). .. note:: @@ -65,7 +65,8 @@ The default locale is used to translate the languages names. Inherited Options ----------------- -These options inherit from the :doc:`choice ` type: +These options inherit from the :doc:`choice ` +type: .. include:: /reference/forms/types/options/empty_value.rst.inc @@ -79,7 +80,8 @@ These options inherit from the :doc:`choice ` typ .. include:: /reference/forms/types/options/preferred_choices.rst.inc -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/locale.rst b/reference/forms/types/locale.rst index e8610495901..daa14e90e41 100644 --- a/reference/forms/types/locale.rst +++ b/reference/forms/types/locale.rst @@ -67,7 +67,8 @@ specify the language. Inherited Options ----------------- -These options inherit from the :doc:`choice ` type: +These options inherit from the :doc:`choice ` +type: .. include:: /reference/forms/types/options/empty_value.rst.inc @@ -81,7 +82,8 @@ These options inherit from the :doc:`choice ` typ .. include:: /reference/forms/types/options/preferred_choices.rst.inc -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/money.rst b/reference/forms/types/money.rst index 6db6ead9c06..29d0abedd86 100644 --- a/reference/forms/types/money.rst +++ b/reference/forms/types/money.rst @@ -50,8 +50,8 @@ the currency symbol that should be shown by the text box. Depending on the currency - the currency symbol may be shown before or after the input text field. -This can be any `3 letter ISO 4217 code`_. You can also set this to false to -hide the currency symbol. +This can be any `3 letter ISO 4217 code`_. You can also set this to false +to hide the currency symbol. divisor ~~~~~~~ @@ -86,7 +86,8 @@ to ``0``). Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/number.rst b/reference/forms/types/number.rst index e476d6bf052..ec85bc52ad4 100644 --- a/reference/forms/types/number.rst +++ b/reference/forms/types/number.rst @@ -5,8 +5,8 @@ number Field Type ================= Renders an input text field and specializes in handling number input. This -type offers different options for the precision, rounding, and grouping that -you want to use for your number. +type offers different options for the precision, rounding and grouping +that you want to use for your number. +-------------+----------------------------------------------------------------------+ | Rendered as | ``input`` ``text`` field | @@ -47,36 +47,38 @@ rounding_mode If a submitted number needs to be rounded (based on the ``precision`` option), you have several configurable options for that rounding. Each -option is a constant on the :class:`Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\IntegerToLocalizedStringTransformer`: +option is a constant on the +:class:`Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\IntegerToLocalizedStringTransformer`: -* ``IntegerToLocalizedStringTransformer::ROUND_DOWN`` Rounding mode to - round towards zero. +* ``IntegerToLocalizedStringTransformer::ROUND_DOWN`` Rounding mode to + round towards zero. -* ``IntegerToLocalizedStringTransformer::ROUND_FLOOR`` Rounding mode to - round towards negative infinity. +* ``IntegerToLocalizedStringTransformer::ROUND_FLOOR`` Rounding mode to + round towards negative infinity. -* ``IntegerToLocalizedStringTransformer::ROUND_UP`` Rounding mode to round - away from zero. +* ``IntegerToLocalizedStringTransformer::ROUND_UP`` Rounding mode to round + away from zero. -* ``IntegerToLocalizedStringTransformer::ROUND_CEILING`` Rounding mode - to round towards positive infinity. +* ``IntegerToLocalizedStringTransformer::ROUND_CEILING`` Rounding mode + to round towards positive infinity. -* ``IntegerToLocalizedStringTransformer::ROUND_HALFDOWN`` Rounding mode - to round towards "nearest neighbor" unless both neighbors are equidistant, - in which case round down. +* ``IntegerToLocalizedStringTransformer::ROUND_HALFDOWN`` Rounding mode + to round towards "nearest neighbor" unless both neighbors are equidistant, + in which case round down. -* ``IntegerToLocalizedStringTransformer::ROUND_HALFEVEN`` Rounding mode - to round towards the "nearest neighbor" unless both neighbors are equidistant, - in which case, round towards the even neighbor. +* ``IntegerToLocalizedStringTransformer::ROUND_HALFEVEN`` Rounding mode + to round towards the "nearest neighbor" unless both neighbors are equidistant, + in which case, round towards the even neighbor. -* ``IntegerToLocalizedStringTransformer::ROUND_HALFUP`` Rounding mode to - round towards "nearest neighbor" unless both neighbors are equidistant, - in which case round up. +* ``IntegerToLocalizedStringTransformer::ROUND_HALFUP`` Rounding mode + to round towards "nearest neighbor" unless both neighbors are equidistant, + in which case round up. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/password.rst b/reference/forms/types/password.rst index c0946fe93c1..8382a0fc0e9 100644 --- a/reference/forms/types/password.rst +++ b/reference/forms/types/password.rst @@ -48,7 +48,8 @@ and submit the form. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/disabled.rst.inc @@ -82,6 +83,6 @@ trim **type**: ``boolean`` **default**: ``false`` If true, the whitespace of the submitted string value will be stripped -via the :phpfunction:`trim` function when the data is bound. This guarantees that -if a value is submitted with extra whitespace, it will be removed before +via the :phpfunction:`trim` function when the data is bound. This guarantees +that if a value is submitted with extra whitespace, it will be removed before the value is merged back onto the underlying object. diff --git a/reference/forms/types/percent.rst b/reference/forms/types/percent.rst index 253a43c69b5..4aea0b90481 100644 --- a/reference/forms/types/percent.rst +++ b/reference/forms/types/percent.rst @@ -70,11 +70,13 @@ object. The two "types" handle these two cases: Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc .. include:: /reference/forms/types/options/disabled.rst.inc + .. include:: /reference/forms/types/options/empty_data.rst.inc :end-before: DEFAULT_PLACEHOLDER diff --git a/reference/forms/types/radio.rst b/reference/forms/types/radio.rst index af2f813df0f..771f5b13490 100644 --- a/reference/forms/types/radio.rst +++ b/reference/forms/types/radio.rst @@ -4,9 +4,10 @@ radio Field Type ================ -Creates a single radio button. If the radio button is selected, the field will -be set to the specified value. Radio buttons cannot be unchecked - the value only -changes when another radio button with the same name gets checked. +Creates a single radio button. If the radio button is selected, the field +will be set to the specified value. Radio buttons cannot be unchecked - +the value only changes when another radio button with the same name gets +checked. The ``radio`` type isn't usually used directly. More commonly it's used internally by other types such as :doc:`choice `. @@ -15,7 +16,7 @@ If you want to have a boolean field, use :doc:`checkbox ` type: | +| Inherited | from the :doc:`checkbox ` type: | | options | | | | - `value`_ | | | | @@ -45,7 +46,8 @@ type: .. include:: /reference/forms/types/options/value.rst.inc -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/repeated.rst b/reference/forms/types/repeated.rst index 91b85bd4d3b..8a69f565100 100644 --- a/reference/forms/types/repeated.rst +++ b/reference/forms/types/repeated.rst @@ -53,9 +53,9 @@ two fields are actually rendered, the end data from the form is just the single value (usually a string) that you need. The most important option is ``type``, which can be any field type and determines -the actual type of the two underlying fields. The ``options`` option is passed -to each of those individual fields, meaning - in this example - any option -supported by the ``password`` type can be passed in this array. +the actual type of the two underlying fields. The ``options`` option is +passed to each of those individual fields, meaning - in this example - any +option supported by the ``password`` type can be passed in this array. Rendering ~~~~~~~~~ @@ -116,19 +116,19 @@ first_name **type**: ``string`` **default**: ``first`` This is the actual field name to be used for the first field. This is mostly -meaningless, however, as the actual data entered into both of the fields will -be available under the key assigned to the ``repeated`` field itself (e.g. -``password``). However, if you don't specify a label, this field name is used -to "guess" the label for you. +meaningless, however, as the actual data entered into both of the fields +will be available under the key assigned to the ``repeated`` field itself +(e.g. ``password``). However, if you don't specify a label, this field +name is used to "guess" the label for you. first_options ~~~~~~~~~~~~~ **type**: ``array`` **default**: ``array()`` -Additional options (will be merged into `options` above) that should be passed -*only* to the first field. This is especially useful for customizing the -label:: +Additional options (will be merged into `options`_ below) that should be +passed *only* to the first field. This is especially useful for customizing +the label:: $builder->add('password', 'repeated', array( 'first_options' => array('label' => 'Password'), @@ -140,11 +140,11 @@ options **type**: ``array`` **default**: ``array()`` -This options array will be passed to each of the two underlying fields. In -other words, these are the options that customize the individual field types. -For example, if the ``type`` option is set to ``password``, this array might -contain the options ``always_empty`` or ``required`` - both options that are -supported by the ``password`` field type. +This options array will be passed to each of the two underlying fields. +In other words, these are the options that customize the individual field +types. For example, if the ``type`` option is set to ``password``, this +array might contain the options ``always_empty`` or ``required`` - both +options that are supported by the ``password`` field type. second_name ~~~~~~~~~~~ @@ -158,9 +158,9 @@ second_options **type**: ``array`` **default**: ``array()`` -Additional options (will be merged into `options` above) that should be passed -*only* to the second field. This is especially useful for customizing the -label (see `first_options`_). +Additional options (will be merged into `options`_ above) that should be +passed *only* to the second field. This is especially useful for customizing +the label (see `first_options`_). type ~~~~ @@ -181,7 +181,8 @@ error_bubbling Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/search.rst b/reference/forms/types/search.rst index 955c52cadaf..88f78fcc50c 100644 --- a/reference/forms/types/search.rst +++ b/reference/forms/types/search.rst @@ -32,7 +32,8 @@ Read about the input search field at `DiveIntoHTML5.info`_ Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/disabled.rst.inc diff --git a/reference/forms/types/submit.rst b/reference/forms/types/submit.rst index 89c3632999b..9d8c015a8d8 100644 --- a/reference/forms/types/submit.rst +++ b/reference/forms/types/submit.rst @@ -25,9 +25,10 @@ A submit button. +----------------------+----------------------------------------------------------------------+ The Submit button has an additional method -:method:`Symfony\\Component\\Form\\ClickableInterface::isClicked` that lets you -check whether this button was used to submit the form. This is especially -useful when :ref:`a form has multiple submit buttons `:: +:method:`Symfony\\Component\\Form\\ClickableInterface::isClicked` that lets +you check whether this button was used to submit the form. This is especially +useful when :ref:`a form has multiple submit buttons +`:: if ($form->get('save')->isClicked()) { // ... diff --git a/reference/forms/types/text.rst b/reference/forms/types/text.rst index f9fbb152c22..68e2c18875b 100644 --- a/reference/forms/types/text.rst +++ b/reference/forms/types/text.rst @@ -31,7 +31,8 @@ The text field represents the most basic input text field. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/textarea.rst b/reference/forms/types/textarea.rst index 1352d9e2e6f..caa64a9f9c9 100644 --- a/reference/forms/types/textarea.rst +++ b/reference/forms/types/textarea.rst @@ -31,7 +31,8 @@ Renders a ``textarea`` HTML element. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/attr.rst.inc diff --git a/reference/forms/types/time.rst b/reference/forms/types/time.rst index f729f419dcc..b8765688db5 100644 --- a/reference/forms/types/time.rst +++ b/reference/forms/types/time.rst @@ -7,8 +7,8 @@ time Field Type A field to capture time input. This can be rendered as a text field, a series of text fields (e.g. hour, -minute, second) or a series of select fields. The underlying data can be stored -as a ``DateTime`` object, a string, a timestamp or an array. +minute, second) or a series of select fields. The underlying data can be +stored as a ``DateTime`` object, a string, a timestamp or an array. +----------------------+-----------------------------------------------------------------------------+ | Underlying Data Type | can be ``DateTime``, string, timestamp, or array (see the ``input`` option) | @@ -49,11 +49,9 @@ Basic Usage This field type is highly configurable, but easy to use. The most important options are ``input`` and ``widget``. -Suppose that you have a ``startTime`` field whose underlying time data is a -``DateTime`` object. The following configures the ``time`` type for that -field as two different choice fields: - -.. code-block:: php +Suppose that you have a ``startTime`` field whose underlying time data is +a ``DateTime`` object. The following configures the ``time`` type for that +field as two different choice fields:: $builder->add('startTime', 'time', array( 'input' => 'datetime', @@ -62,9 +60,7 @@ field as two different choice fields: The ``input`` option *must* be changed to match the type of the underlying date data. For example, if the ``startTime`` field's data were a unix timestamp, -you'd need to set ``input`` to ``timestamp``: - -.. code-block:: php +you'd need to set ``input`` to ``timestamp``:: $builder->add('startTime', 'time', array( 'input' => 'timestamp', @@ -86,8 +82,8 @@ input **type**: ``string`` **default**: ``datetime`` -The format of the *input* data - i.e. the format that the date is stored on -your underlying object. Valid values are: +The format of the *input* data - i.e. the format that the date is stored +on your underlying object. Valid values are: * ``string`` (e.g. ``12:17:26``) * ``datetime`` (a ``DateTime`` object) @@ -110,7 +106,8 @@ widget **type**: ``string`` **default**: ``choice`` -The basic way in which this field should be rendered. Can be one of the following: +The basic way in which this field should be rendered. Can be one of the +following: * ``choice``: renders one, two (default) or three select inputs (hour, minute, second), depending on the `with_minutes`_ and `with_seconds`_ options. @@ -118,14 +115,15 @@ The basic way in which this field should be rendered. Can be one of the followin * ``text``: renders one, two (default) or three text inputs (hour, minute, second), depending on the `with_minutes`_ and `with_seconds`_ options. -* ``single_text``: renders a single input of type ``time``. User's input will - be validated against the form ``hh:mm`` (or ``hh:mm:ss`` if using seconds). +* ``single_text``: renders a single input of type ``time``. User's input + will be validated against the form ``hh:mm`` (or ``hh:mm:ss`` if using + seconds). .. caution:: Combining the widget type ``single_text`` and the `with_minutes`_ option - set to ``false`` can cause unexpected behavior in the client as the input - type ``time`` might not support selecting an hour only. + set to ``false`` can cause unexpected behavior in the client as the + input type ``time`` might not support selecting an hour only. .. include:: /reference/forms/types/options/with_minutes.rst.inc @@ -149,7 +147,8 @@ error_bubbling Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/timezone.rst b/reference/forms/types/timezone.rst index cbf191ee683..b8c6fd65d2d 100644 --- a/reference/forms/types/timezone.rst +++ b/reference/forms/types/timezone.rst @@ -4,8 +4,8 @@ timezone Field Type =================== -The ``timezone`` type is a subset of the ``ChoiceType`` that allows the user -to select from all possible timezones. +The ``timezone`` type is a subset of the ``ChoiceType`` that allows the +user to select from all possible timezones. The "value" for each timezone is the full timezone name, such as ``America/Chicago`` or ``Europe/Istanbul``. @@ -60,7 +60,8 @@ The Timezone type defaults the choices to all timezones returned by Inherited Options ----------------- -These options inherit from the :doc:`choice ` type: +These options inherit from the :doc:`choice ` +type: .. include:: /reference/forms/types/options/empty_value.rst.inc @@ -70,7 +71,8 @@ These options inherit from the :doc:`choice ` typ .. include:: /reference/forms/types/options/preferred_choices.rst.inc -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc diff --git a/reference/forms/types/url.rst b/reference/forms/types/url.rst index 1df99a06d30..c87abaaa5ad 100644 --- a/reference/forms/types/url.rst +++ b/reference/forms/types/url.rst @@ -46,7 +46,8 @@ the data is submitted to the form. Inherited Options ----------------- -These options inherit from the :doc:`form ` type: +These options inherit from the :doc:`form ` +type: .. include:: /reference/forms/types/options/data.rst.inc From 9de20178b3d5cbcd0be9d8bd4354c10e8b2488ee Mon Sep 17 00:00:00 2001 From: seangallavan Date: Thu, 11 Dec 2014 20:45:09 -0800 Subject: [PATCH 61/61] Update data_collector.rst Simple change...would have saved me several hours of guessing. --- cookbook/profiler/data_collector.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cookbook/profiler/data_collector.rst b/cookbook/profiler/data_collector.rst index 7d9fe800710..5c2ded26d12 100644 --- a/cookbook/profiler/data_collector.rst +++ b/cookbook/profiler/data_collector.rst @@ -208,3 +208,8 @@ AcmeDebugBundle: 'id' => 'your_collector_name', )) ; + +.. caution:: + + Make sure the ``id`` attribute is the same string you used for the + ``getName()`` method.