Skip to content

Commit 044a6bd

Browse files
committed
Merge remote-tracking branch 'upstream/3.3' into 3.3
2 parents 7660376 + 77d7f7f commit 044a6bd

File tree

72 files changed

+634
-300
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+634
-300
lines changed
-19.1 KB
Loading
14.2 KB
Loading

best_practices/controllers.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ for the homepage of our app:
9595
9696
namespace AppBundle\Controller;
9797
98+
use AppBundle\Entity\Post;
9899
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
99100
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
100101
@@ -106,7 +107,7 @@ for the homepage of our app:
106107
public function indexAction()
107108
{
108109
$posts = $this->getDoctrine()
109-
->getRepository('AppBundle:Post')
110+
->getRepository(Post::class)
110111
->findLatest();
111112
112113
return $this->render('default/index.html.twig', array(
@@ -186,7 +187,7 @@ manually. In our application, we have this situation in ``CommentController``:
186187
public function newAction(Request $request, $postSlug)
187188
{
188189
$post = $this->getDoctrine()
189-
->getRepository('AppBundle:Post')
190+
->getRepository(Post::class)
190191
->findOneBy(array('slug' => $postSlug));
191192
192193
if (!$post) {

best_practices/forms.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ and a ``createAction()`` that *only* processes the form submit. Both those
204204
actions will be almost identical. So it's much simpler to let ``newAction()``
205205
handle everything.
206206

207-
Second, we recommend using ``$form->isSubmitted()`` in the ``if`` statement
208-
for clarity. This isn't technically needed, since ``isValid()`` first calls
209-
``isSubmitted()``. But without this, the flow doesn't read well as it *looks*
210-
like the form is *always* processed (even on the GET request).
207+
Second, is it required to call ``$form->isSubmitted()`` in the ``if`` statement
208+
before calling ``isValid()``. Calling ``isValid()`` with an unsubmitted form
209+
is deprecated since version 3.2 and will throw an exception in 4.0.

best_practices/security.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ more advanced use-case, you can always do the same security check in PHP:
227227
public function editAction($id)
228228
{
229229
$post = $this->getDoctrine()
230-
->getRepository('AppBundle:Post')
230+
->getRepository(Post::class)
231231
->find($id);
232232
233233
if (!$post) {

best_practices/templates.rst

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,20 @@ Template Locations
3030
Store all your application's templates in ``app/Resources/views/`` directory.
3131

3232
Traditionally, Symfony developers stored the application templates in the
33-
``Resources/views/`` directory of each bundle. Then they used the logical name
34-
to refer to them (e.g. ``AcmeDemoBundle:Default:index.html.twig``).
33+
``Resources/views/`` directory of each bundle. Then they used the Twig namespaced
34+
path to refer to them (e.g. ``@AcmeDemo/Default/index.html.twig``).
3535

3636
But for the templates used in your application, it's much more convenient
3737
to store them in the ``app/Resources/views/`` directory. For starters, this
3838
drastically simplifies their logical names:
3939

40-
================================================= ==================================
41-
Templates Stored inside Bundles Templates Stored in ``app/``
42-
================================================= ==================================
43-
``AcmeDemoBundle:Default:index.html.twig`` ``default/index.html.twig``
44-
``::layout.html.twig`` ``layout.html.twig``
45-
``AcmeDemoBundle::index.html.twig`` ``index.html.twig``
46-
``AcmeDemoBundle:Default:subdir/index.html.twig`` ``default/subdir/index.html.twig``
47-
``AcmeDemoBundle:Default/subdir:index.html.twig`` ``default/subdir/index.html.twig``
48-
================================================= ==================================
40+
============================================ ==================================
41+
Templates Stored inside Bundles Templates Stored in ``app/``
42+
============================================ ==================================
43+
``@AcmeDemo/index.html.twig`` ``index.html.twig``
44+
``@AcmeDemo/Default/index.html.twig`` ``default/index.html.twig``
45+
``@AcmeDemo/Default/subdir/index.html.twig`` ``default/subdir/index.html.twig``
46+
============================================ ==================================
4947

5048
Another advantage is that centralizing your templates simplifies the work
5149
of your designers. They don't need to look for templates in lots of directories
@@ -121,7 +119,7 @@ class in the constructor of the Twig extension:
121119
new \Twig_SimpleFilter(
122120
'md2html',
123121
array($this, 'markdownToHtml'),
124-
array('is_safe' => array('html'))
122+
array('is_safe' => array('html'), 'pre_escape' => 'html')
125123
),
126124
);
127125
}

bundles/best_practices.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,21 @@ The ``composer.json`` file should include at least the following metadata:
429429
In order to make it easier for developers to find your bundle, register it on
430430
`Packagist`_, the official repository for Composer packages.
431431

432+
Resources
433+
---------
434+
435+
If the bundle references any resources (config files, translation files, etc.),
436+
don't use physical paths (e.g. ``__DIR__/config/services.xml``) but logical
437+
paths (e.g. ``@AppBundle/Resources/config/services.xml``).
438+
439+
The logical paths are required because of the bundle overriding mechanism that
440+
lets you override any resource/file of any bundle. See :ref:`http-kernel-resource-locator`
441+
for more details about transforming physical paths into logical paths.
442+
443+
Beware that templates use a simplified version of the logical path shown above.
444+
For example, an ``index.html.twig`` template located in the ``Resources/views/Default/``
445+
directory of the AppBundle, is referenced as ``@App/Default/index.html.twig``.
446+
432447
Learn more
433448
----------
434449

bundles/override.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ How to Override any Part of a Bundle
77
This document is a quick reference for how to override different parts of
88
third-party bundles.
99

10+
.. tip::
11+
12+
The bundle overriding mechanism means that you cannot use physical paths to
13+
refer to bundle's resources (e.g. ``__DIR__/config/services.xml``). Always
14+
use logical paths in your bundles (e.g. ``@AppBundle/Resources/config/services.xml``)
15+
and call the :ref:`locateResource() method <http-kernel-resource-locator>`
16+
to turn them into physical paths when needed.
17+
1018
Templates
1119
---------
1220

components/console/helpers/questionhelper.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,15 @@ convenient for passwords::
212212
On Windows systems, this ``stty`` command may generate gibberish output and
213213
mangle the input text. If that's your case, disable it with this command::
214214

215+
use Symfony\Component\Console\Helper\QuestionHelper;
215216
use Symfony\Component\Console\Question\ChoiceQuestion;
216217

217218
// ...
218219
public function execute(InputInterface $input, OutputInterface $output)
219220
{
220221
// ...
221222
$helper = $this->getHelper('question');
222-
$helper->disableStty();
223+
QuestionHelper::disableStty();
223224

224225
// ...
225226
}

components/dom_crawler.rst

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,19 @@ given text. This method is especially useful because you can use it to return
396396
a :class:`Symfony\\Component\\DomCrawler\\Form` object that represents the
397397
form that the button lives in::
398398

399-
$form = $crawler->selectButton('validate')->form();
399+
// button example: <button id="my-super-button" type="submit">My super button</button>
400+
401+
// you can get button by its label
402+
$form = $crawler->selectButton('My super button')->form();
403+
404+
// or by button id (#my-super-button) if the button doesn't have a label
405+
$form = $crawler->selectButton('my-super-button')->form();
406+
407+
// or you can filter the whole form, for example a form has a class attribute: <form class="form-vertical" method="POST">
408+
$crawler->filter('.form-vertical')->form();
400409

401410
// or "fill" the form fields with data
402-
$form = $crawler->selectButton('validate')->form(array(
411+
$form = $crawler->selectButton('my-super-button')->form(array(
403412
'name' => 'Ryan',
404413
));
405414

0 commit comments

Comments
 (0)