Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb56bf19

Browse files
committed
controller ch review, part 2
1 parent032b167 commitb56bf19

File tree

1 file changed

+108
-73
lines changed

1 file changed

+108
-73
lines changed

‎book/controller.rst‎

Lines changed: 108 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -364,42 +364,24 @@ the following guidelines in mind while you develop.
364364
pass other variables from your route to your controller arguments. See
365365
:doc:`/cookbook/routing/extra_information`.
366366

367-
.. _book-controller-request-argument:
368-
369-
The ``Request`` as a Controller Argument
370-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
371-
372-
What if you need to read query parameters, grab a request header or get access
373-
to an uploaded file? All of that information is stored in Symfony's ``Request``
374-
object. To get it in your controller, just add it as an argument and
375-
**type-hint it with the Request class**::
376-
377-
use Symfony\Component\HttpFoundation\Request;
378-
379-
public function indexAction($firstName, $lastName, Request $request)
380-
{
381-
$page = $request->query->get('page', 1);
382-
383-
// ...
384-
}
385-
386-
..seealso::
387-
388-
Want to know more about getting information from the request? See
389-
:ref:`Access Request Information<component-http-foundation-request>`.
390-
391367
..index::
392368
single: Controller; Base controller class
393369

394370
The Base Controller Class
395371
-------------------------
396372

397-
For convenience, Symfony comes with an optional base ``Controller`` class.
398-
If you extend it, you'll get access to a number of helper methods and all
399-
of your service objects via the container (see:ref:`controller-accessing-services`).
373+
For convenience, Symfony comes with an optional base
374+
:class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller` class.
375+
If you extend it, this wont change anything about how your controller
376+
works, but you'll get access to a number of **helper methods** and the
377+
**service container** (see:ref:`controller-accessing-services`): an
378+
array-like object that gives you access to every useful object in the
379+
system. These useful objects are called **services**, and Symfony ships
380+
with a service object that can render Twig templates, another that can
381+
log messages and many more.
400382

401-
Add the ``use`` statement atop the ``Controller`` class and then modify the
402-
``HelloController`` to extend it::
383+
Add the ``use`` statement atop the ``Controller`` class and then modify
384+
the``HelloController`` to extend it::
403385

404386
// src/AppBundle/Controller/HelloController.php
405387
namespace AppBundle\Controller;
@@ -411,39 +393,44 @@ Add the ``use`` statement atop the ``Controller`` class and then modify the
411393
// ...
412394
}
413395

414-
This doesn't actually change anything about how your controller works: it
415-
just gives you access to helper methods that the base controller class makes
416-
available. These are just shortcuts to using core Symfony functionality that's
417-
available to you with or without the use of the base ``Controller`` class.
418-
A great way to see the core functionality in action is to look in the
419-
`Controller class`_.
396+
Helper methods are just shortcuts to using core Symfony functionality
397+
that's available to you with or without the use of the base
398+
``Controller`` class. A great way to see the core functionality in
399+
action is to look in the
400+
:class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller` class.
420401

421402
..seealso::
422403

423-
If you're curious about how a controller would work that did *not* extend
424-
this base class, check out:doc:`Controllers as Services</cookbook/controller/service>`.
425-
This is optional, but can give you more control over the exact objects/dependencies
426-
that are injected into your controller.
404+
If you're curious about how a controller would work that did *not*
405+
extend this base ``Controller`` class, check out cookbook article
406+
:doc:`Controllers as Services</cookbook/controller/service>`.
407+
This is optional, but can give you more control over the exact
408+
objects/dependencies that are injected into your controller.
427409

428410
..index::
429411
single: Controller; Redirecting
430412

413+
Generating URLs
414+
~~~~~~~~~~~~~~~
415+
416+
The:method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::generateUrl`
417+
method is just a helper method that generates the URL for a given route.
418+
419+
.. _book-redirecting-users-browser:
420+
431421
Redirecting
432422
~~~~~~~~~~~
433423

434-
If you want to redirect the user to another page, use the
424+
To redirect the user's browser to another page **internally**, use the ``generateUrl()``
425+
method in combination with another helper method called
435426
:method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::redirect`
436-
method::
427+
which needs URL as an argument::
437428

438429
public function indexAction()
439430
{
440431
return $this->redirect($this->generateUrl('homepage'));
441432
}
442433

443-
The ``generateUrl()`` method is just a helper function that generates the URL
444-
for a given route. For more information, see the:doc:`Routing</book/routing>`
445-
chapter.
446-
447434
By default, the ``redirect()`` method performs a 302 (temporary) redirect. To
448435
perform a 301 (permanent) redirect, modify the second argument::
449436

@@ -452,6 +439,15 @@ perform a 301 (permanent) redirect, modify the second argument::
452439
return $this->redirect($this->generateUrl('homepage'), 301);
453440
}
454441

442+
To redirect **externally**, use ``redirect()`` and pass it the external URL::
443+
444+
public function indexAction()
445+
{
446+
return $this->redirect('http://symfony.com/doc');
447+
}
448+
449+
For more information, see the:doc:`Routing chapter</book/routing>`.
450+
455451
..tip::
456452

457453
The ``redirect()`` method is simply a shortcut that creates a ``Response``
@@ -469,31 +465,48 @@ perform a 301 (permanent) redirect, modify the second argument::
469465
Rendering Templates
470466
~~~~~~~~~~~~~~~~~~~
471467

472-
If you're serving HTML, you'll want to render a template. The ``render()``
473-
method renders a template **and** puts that content into a ``Response``
474-
object for you::
468+
To serve HTML, template needs to be rendered and the content put into
469+
the ``Response`` object. The shortcut method
470+
:method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::render`
471+
of ``Controller`` class does just that::
475472

476473
// renders app/Resources/views/hello/index.html.twig
477474
return $this->render('hello/index.html.twig', array('name' => $name));
478475

479-
You can also puttemplatesin deeper sub-directories. Just try to avoid creating
480-
unnecessarily deep structures::
476+
Templates canbealso put in deeper sub-directories. Just try to avoid
477+
creatingunnecessarily deep structures::
481478

482479
// renders app/Resources/views/hello/greetings/index.html.twig
483480
return $this->render('hello/greetings/index.html.twig', array(
484481
'name' => $name
485482
));
486483

484+
Templates are a generic way to render content in *any* format. And while in
485+
most cases you'll use templates to render HTML content, a template can just
486+
as easily generate JavaScript, CSS, XML or any other format you can dream of.
487+
To learn how to render different templating formats read:ref:`<template-formats>`
488+
section of the Creating and Using Templates chapter.
489+
487490
The Symfony templating engine is explained in great detail in the
488-
:doc:`Templating</book/templating>` chapter.
491+
:doc:`Creating and Using Templates chapter</book/templating>`.
492+
493+
..sidebar::Templating Naming Pattern
494+
495+
Templates for a bundle can be put in the ``src/path/to/bundle/Resources/views``
496+
directory of a bundle and reference with a special shortcut syntax called
497+
*logical name* which, for example, looks like ``AppBundle:Hello:index.html.twig`` or
498+
``AppBundle::layout.html.twig``. The pattern has three parts, each separated
499+
by a colon. Syntax used to specify a template for a specific page::
489500

490-
..sidebar::Referencing Templates that Live inside the Bundle
501+
**bundle**:**directory**:**filename**
491502

492-
You can also put templates in the ``Resources/views`` directory of a
493-
bundle and reference them with a
494-
``BundleName:DirectoryName:FileName`` syntax. For example,
495-
``AppBundle:Hello:index.html.twig`` would refer to the template located in
496-
``src/AppBundle/Resources/views/Hello/index.html.twig``. See:ref:`template-referencing-in-bundle`.
503+
Syntax used to refer to a base template that's specific to the bundle::
504+
505+
``**bundle**::**filename**``
506+
507+
For more details on the template format, read
508+
:ref:`template-referencing-in-bundle` subtitle of the Creating and
509+
Using Templates chapter.
497510

498511
..index::
499512
single: Controller; Accessing services
@@ -509,7 +522,9 @@ any other "work" you can think of. When you install a new bundle, it probably
509522
brings in even *more* services.
510523

511524
When extending the base controller class, you can access any Symfony service
512-
via the ``get()`` method. Here are several common services you might need::
525+
via the:method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::get`
526+
method of the ``Controller`` class. Here are several common services you might
527+
need::
513528

514529
$templating = $this->get('templating');
515530

@@ -518,7 +533,7 @@ via the ``get()`` method. Here are several common services you might need::
518533
$mailer = $this->get('mailer');
519534

520535
What other services exist? To list all services, use the ``container:debug``
521-
console command:
536+
console command::
522537

523538
..code-block::bash
524539
@@ -535,7 +550,7 @@ Managing Errors and 404 Pages
535550

536551
When things are not found, you should play well with the HTTP protocol and
537552
return a 404 response. To do this, you'll throw a special type of exception.
538-
If you're extending the basecontroller class, do the following::
553+
If you're extending the base``Controller`` class, do the following::
539554

540555
public function indexAction()
541556
{
@@ -548,8 +563,9 @@ If you're extending the base controller class, do the following::
548563
return $this->render(...);
549564
}
550565

551-
The ``createNotFoundException()`` method is just a shortcut to create a
552-
special:class:`Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException`
566+
The:method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::createNotFoundException`
567+
method is just a shortcut to create a special
568+
:class:`Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException`
553569
object, which ultimately triggers a 404 HTTP response inside Symfony.
554570

555571
Of course, you're free to throw any ``Exception`` class in your controller -
@@ -560,16 +576,35 @@ Symfony will automatically return a 500 HTTP response code.
560576
throw new \Exception('Something went wrong!');
561577
562578
In every case, an error page is shown to the end user and a full debug
563-
error page is shown to the developer (i.e. when you're using ``app_dev.php`` -
564-
see:ref:`page-creation-environments`).
579+
error page is shown to the developer (i.e. when you're using ``app_dev.php``
580+
front controller -see:ref:`page-creation-environments`).
565581

566-
You'll want to customize the error page your user sees. To do that, see the
567-
":doc:`/cookbook/controller/error_pages`" cookbook recipe.
582+
You'll want to customize the error page your user sees. To do that, see
583+
the cookbook article":doc:`/cookbook/controller/error_pages`" cookbook recipe.
568584

569585
..index::
570586
single: Controller; The session
571587
single: Session
572588

589+
.. _book-controller-request-argument:
590+
591+
The Request object as a Controller Argument
592+
-------------------------------------------
593+
594+
What if you need to read query parameters, grab a request header or get access
595+
to an uploaded file? All of that information is stored in Symfony's ``Request``
596+
object. To get it in your controller, just add it as an argument and
597+
**type-hint it with the ``Request`` class**::
598+
599+
use Symfony\Component\HttpFoundation\Request;
600+
601+
public function indexAction($firstName, $lastName, Request $request)
602+
{
603+
$page = $request->query->get('page', 1);
604+
605+
// ...
606+
}
607+
573608
Managing the Session
574609
--------------------
575610

@@ -578,8 +613,11 @@ about the user (be it a real person using a browser, a bot, or a web service)
578613
between requests. By default, Symfony stores the attributes in a cookie
579614
by using the native PHP sessions.
580615

581-
Storing and retrieving information from the session can be easily achieved
582-
from any controller::
616+
To retrieving the session we have to call the
617+
:method:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller::getSession`
618+
method on the ``Request`` object inside a controller. Method returns a
619+
:class:`Symfony\\Component\\HttpFoundation\\Session\\SessionInterface`
620+
with all the methods to handle a session::
583621

584622
use Symfony\Component\HttpFoundation\Request;
585623

@@ -597,8 +635,7 @@ from any controller::
597635
$filters = $session->get('filters', array());
598636
}
599637

600-
These attributes will remain in the session for the remainder of that user's
601-
session.
638+
Stored attributes remain in the session for the remainder of that user's session.
602639

603640
..index::
604641
single: Session; Flash messages
@@ -835,6 +872,4 @@ Learn more from the Cookbook
835872
----------------------------
836873

837874
*:doc:`/cookbook/controller/error_pages`
838-
*:doc:`/cookbook/controller/service`
839-
840-
.. _`Controller class`:https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php
875+
*:doc:`/cookbook/controller/service`

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp