Skip to content

Commit 8c9f50d

Browse files
committed
Merge branch '2.7' into 2.8
* 2.7: Updated HttpKernel component diagrams Change value for opcache.memory_consumption Improved a routing example to show annotations Clearer wording of allow_delete template behavior
2 parents 5ea29a5 + 993c71e commit 8c9f50d

20 files changed

+40
-37
lines changed
-123 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

_images/components/http_kernel/http-workflow-exception.svg

Lines changed: 1 addition & 0 deletions
Loading

_images/components/http_kernel/http-workflow-subrequest.svg

Lines changed: 1 addition & 0 deletions
Loading

_images/components/http_kernel/http-workflow.svg

Lines changed: 1 addition & 0 deletions
Loading
Binary file not shown.
-125 KB
Binary file not shown.
3.7 KB
Binary file not shown.

components/http_kernel.rst

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ The Workflow of a Request
2727
Every HTTP web interaction begins with a request and ends with a response.
2828
Your job as a developer is to create PHP code that reads the request information
2929
(e.g. the URL) and creates and returns a response (e.g. an HTML page or JSON string).
30+
This is a simplified overview of the request workflow in Symfony applications:
3031

31-
.. image:: /_images/components/http_kernel/request-response-flow.png
32-
:align: center
32+
#. The **user** asks for a **resource** in a **browser**;
33+
#. The **browser** sends a **request** to the **server**;
34+
#. **Symfony** gives the **application** a **Request** object;
35+
#. The **application** generates a **Response** object using the data of the **Request** object;
36+
#. The **server** sends back the **response** to the **browser**;
37+
#. The **browser** displays the **resource** to the **user**.
3338

3439
Typically, some sort of framework or system is built to handle all the repetitive
3540
tasks (e.g. routing, security, etc) so that a developer can easily build
@@ -62,8 +67,9 @@ the concrete implementation of :method:`HttpKernelInterface::handle() <Symfony\\
6267
defines a workflow that starts with a :class:`Symfony\\Component\\HttpFoundation\\Request`
6368
and ends with a :class:`Symfony\\Component\\HttpFoundation\\Response`.
6469

65-
.. image:: /_images/components/http_kernel/01-workflow.png
66-
:align: center
70+
.. raw:: html
71+
72+
<object data="../_images/components/http_kernel/http-workflow.svg" type="image/svg+xml"></object>
6773

6874
The exact details of this workflow are the key to understanding how the kernel
6975
(and the Symfony Framework or any other library that uses the kernel) works.
@@ -138,9 +144,6 @@ layer that denies access).
138144
The first event that is dispatched inside :method:`HttpKernel::handle <Symfony\\Component\\HttpKernel\\HttpKernel::handle>`
139145
is ``kernel.request``, which may have a variety of different listeners.
140146

141-
.. image:: /_images/components/http_kernel/02-kernel-request.png
142-
:align: center
143-
144147
Listeners of this event can be quite varied. Some listeners - such as a security
145148
listener - might have enough information to create a ``Response`` object immediately.
146149
For example, if a security listener determined that a user doesn't have access,
@@ -150,9 +153,6 @@ to the login page or a 403 Access Denied response.
150153
If a ``Response`` is returned at this stage, the process skips directly to
151154
the :ref:`kernel.response <component-http-kernel-kernel-response>` event.
152155

153-
.. image:: /_images/components/http_kernel/03-kernel-request-response.png
154-
:align: center
155-
156156
Other listeners simply initialize things or add more information to the request.
157157
For example, a listener might determine and set the locale on the ``Request``
158158
object.
@@ -205,9 +205,6 @@ to your application. This is the job of the "controller resolver" - a class
205205
that implements :class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface`
206206
and is one of the constructor arguments to ``HttpKernel``.
207207

208-
.. image:: /_images/components/http_kernel/04-resolve-controller.png
209-
:align: center
210-
211208
Your job is to create a class that implements the interface and fill in its
212209
two methods: ``getController()`` and ``getArguments()``. In fact, one default
213210
implementation already exists, which you can use directly or learn from:
@@ -280,9 +277,6 @@ some part of the system that needs to be initialized after certain things
280277
have been determined (e.g. the controller, routing information) but before
281278
the controller is executed. For some examples, see the Symfony section below.
282279

283-
.. image:: /_images/components/http_kernel/06-kernel-controller.png
284-
:align: center
285-
286280
Listeners to this event can also change the controller callable completely
287281
by calling :method:`FilterControllerEvent::setController <Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent::setController>`
288282
on the event object that's passed to listeners on this event.
@@ -314,9 +308,6 @@ should be passed to that controller. Exactly how this is done is completely
314308
up to your design, though the built-in :class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver`
315309
is a good example.
316310

317-
.. image:: /_images/components/http_kernel/07-controller-arguments.png
318-
:align: center
319-
320311
At this point the kernel has a PHP callable (the controller) and an array
321312
of arguments that should be passed when executing that callable.
322313

@@ -345,9 +336,6 @@ of arguments that should be passed when executing that callable.
345336

346337
The next step is simple! ``HttpKernel::handle()`` executes the controller.
347338

348-
.. image:: /_images/components/http_kernel/08-call-controller.png
349-
:align: center
350-
351339
The job of the controller is to build the response for the given resource.
352340
This could be an HTML page, a JSON string or anything else. Unlike every
353341
other part of the process so far, this step is implemented by the "end-developer",
@@ -357,9 +345,6 @@ Usually, the controller will return a ``Response`` object. If this is true,
357345
then the work of the kernel is just about done! In this case, the next step
358346
is the :ref:`kernel.response <component-http-kernel-kernel-response>` event.
359347

360-
.. image:: /_images/components/http_kernel/09-controller-returns-response.png
361-
:align: center
362-
363348
But if the controller returns anything besides a ``Response``, then the kernel
364349
has a little bit more work to do - :ref:`kernel.view <component-http-kernel-kernel-view>`
365350
(since the end goal is *always* to generate a ``Response`` object).
@@ -384,9 +369,6 @@ another event - ``kernel.view``. The job of a listener to this event is to
384369
use the return value of the controller (e.g. an array of data or an object)
385370
to create a ``Response``.
386371

387-
.. image:: /_images/components/http_kernel/10-kernel-view.png
388-
:align: center
389-
390372
This can be useful if you want to use a "view" layer: instead of returning
391373
a ``Response`` from the controller, you return data that represents the page.
392374
A listener to this event could then use this data to create a ``Response`` that
@@ -515,8 +497,9 @@ function is wrapped in a try-catch block. When any exception is thrown, the
515497
``kernel.exception`` event is dispatched so that your system can somehow respond
516498
to the exception.
517499

518-
.. image:: /_images/components/http_kernel/11-kernel-exception.png
519-
:align: center
500+
.. raw:: html
501+
502+
<object data="../_images/components/http_kernel/http-workflow-exception.svg" type="image/svg+xml"></object>
520503

521504
Each listener to this event is passed a :class:`Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent`
522505
object, which you can use to access the original exception via the
@@ -661,8 +644,9 @@ a page instead of a full page. You'll most commonly make sub-requests from
661644
your controller (or perhaps from inside a template, that's being rendered by
662645
your controller).
663646

664-
.. image:: /_images/components/http_kernel/sub-request.png
665-
:align: center
647+
.. raw:: html
648+
649+
<object data="../_images/components/http_kernel/http-workflow-subrequest.svg" type="image/svg+xml"></object>
666650

667651
To execute a sub request, use ``HttpKernel::handle()``, but change the second
668652
argument as follows::

form/form_collections.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,9 +616,11 @@ Now, you need to put some code into the ``removeTag()`` method of ``Task``::
616616
Template Modifications
617617
~~~~~~~~~~~~~~~~~~~~~~
618618

619-
The ``allow_delete`` option has one consequence: if an item of a collection
619+
The ``allow_delete`` option means that if an item of a collection
620620
isn't sent on submission, the related data is removed from the collection
621-
on the server. The solution is to remove the form element from the DOM.
621+
on the server. In order for this to work in an HTML form, you must remove
622+
the DOM element for the collection item to be removed, before submitting
623+
the form.
622624

623625
First, add a "delete this tag" link to each tag form:
624626

performance.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ it's recommended to change these settings as follows:
130130
131131
; php.ini
132132
; maximum memory that OPcache can use to store compiled PHP files
133-
opcache.memory_consumption=256M
133+
opcache.memory_consumption=256
134134
135135
; maximum number of files that can be stored in the cache
136136
opcache.max_accelerated_files=20000

routing/external_resources.rst

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,29 @@ This can be done by importing routing resources from the main routing file:
8585
When importing resources from YAML, the key (e.g. ``app_file``) is meaningless.
8686
Just be sure that it's unique so no other lines override it.
8787

88-
Prefixing Imported Routes
89-
~~~~~~~~~~~~~~~~~~~~~~~~~
88+
.. _prefixing-imported-routes:
89+
90+
Prefixing the URLs of Imported Routes
91+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9092

9193
You can also choose to provide a "prefix" for the imported routes. For example,
9294
suppose you want to prefix all routes in the AppBundle with ``/site`` (e.g.
9395
``/site/blog/{slug}`` instead of ``/blog/{slug}``):
9496

9597
.. configuration-block::
9698

99+
.. code-block:: php-annotations
100+
101+
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
102+
103+
/**
104+
* @Route("/site")
105+
*/
106+
class DefaultController
107+
{
108+
// ...
109+
}
110+
97111
.. code-block:: yaml
98112
99113
# app/config/routing.yml

0 commit comments

Comments
 (0)