• Название:

    Symfony book 3.0


  • Размер: 2.26 Мб
  • Формат: PDF
  • или
  • Сообщить о нарушении / Abuse

Установите безопасный браузер



  • Название: The Book

Предпросмотр документа

The Book
Version: 3.0
generated on April 28, 2016

The Book (3.0)
This work is licensed under the “Attribution-Share Alike 3.0 Unported” license (http://creativecommons.org/
licenses/by-sa/3.0/).
You are free to share (to copy, distribute and transmit the work), and to remix (to adapt the work) under the
following conditions:
• Attribution: You must attribute the work in the manner specified by the author or licensor (but
not in any way that suggests that they endorse you or your use of the work).
• Share Alike: If you alter, transform, or build upon this work, you may distribute the resulting work
only under the same, similar or a compatible license. For any reuse or distribution, you must make
clear to others the license terms of this work.
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor SensioLabs shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by
the information contained in this work.
If you find typos or errors, feel free to report them by creating a ticket on the Symfony ticketing system
(http://github.com/symfony/symfony-docs/issues). Based on tickets and users feedback, this book is
continuously updated.

Contents at a Glance
Symfony and HTTP Fundamentals ......................................................................................................4
Symfony versus Flat PHP...................................................................................................................14
Installing and Configuring Symfony...................................................................................................26
Create your First Page in Symfony .....................................................................................................33
Controller.........................................................................................................................................42
Routing ............................................................................................................................................55
Creating and Using Templates...........................................................................................................71
Configuring Symfony (and Environments) .........................................................................................90
The Bundle System ...........................................................................................................................94
Databases and Doctrine ....................................................................................................................98
Databases and Propel ...................................................................................................................... 119
Testing ........................................................................................................................................... 120
Validation....................................................................................................................................... 136
Forms ............................................................................................................................................. 149
Security .......................................................................................................................................... 175
HTTP Cache................................................................................................................................... 189
Translations.................................................................................................................................... 206
Service Container ............................................................................................................................ 218
Performance ................................................................................................................................... 231

PDF brought to you by
generated on April 28, 2016

Contents at a Glance | iii

Chapter 1

Symfony and HTTP Fundamentals
Congratulations! By learning about Symfony, you're well on your way towards being a more productive,
well-rounded and popular web developer (actually, you're on your own for the last part). Symfony is built
to get back to basics: to develop tools that let you develop faster and build more robust applications,
while staying out of your way. Symfony is built on the best ideas from many technologies: the tools and
concepts you're about to learn represent the efforts of thousands of people, over many years. In other
words, you're not just learning "Symfony", you're learning the fundamentals of the web, development
best practices and how to use many amazing new PHP libraries, inside or independently of Symfony. So,
get ready.
True to the Symfony philosophy, this chapter begins by explaining the fundamental concept common
to web development: HTTP. Regardless of your background or preferred programming language, this
chapter is a must-read for everyone.

HTTP is Simple
HTTP (Hypertext Transfer Protocol to the geeks) is a text language that allows two machines to
communicate with each other. That's it! For example, when checking for the latest xkcd1 comic, the
following (approximate) conversation takes place:

1. http://xkcd.com/

PDF brought to you by
generated on April 28, 2016

Chapter 1: Symfony and HTTP Fundamentals | 4

And while the actual language used is a bit more formal, it's still dead-simple. HTTP is the term used to
describe this simple text-based language. No matter how you develop on the web, the goal of your server
is always to understand simple text requests, and return simple text responses.
Symfony is built from the ground up around that reality. Whether you realize it or not, HTTP is
something you use every day. With Symfony, you'll learn how to master it.

Step1: The Client Sends a Request
Every conversation on the web starts with a request. The request is a text message created by a client (e.g.
a browser, a smartphone app, etc) in a special format known as HTTP. The client sends that request to a
server, and then waits for the response.
Take a look at the first part of the interaction (the request) between a browser and the xkcd web server:

In HTTP-speak, this HTTP request would actually look something like this:
Listing 1-1

1
2
3
4

GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)

This simple message communicates everything necessary about exactly which resource the client is
requesting. The first line of an HTTP request is the most important and contains two things: the URI and
the HTTP method.
The URI (e.g. /, /contact, etc) is the unique address or location that identifies the resource the client
wants. The HTTP method (e.g. GET) defines what you want to do with the resource. The HTTP methods
are the verbs of the request and define the few common ways that you can act upon the resource:
PDF brought to you by
generated on April 28, 2016

Chapter 1: Symfony and HTTP Fundamentals | 5

GET

Retrieve the resource from the server

POST

Create a resource on the server

PUT

Update the resource on the server

DELETE Delete the resource from the server
With this in mind, you can imagine what an HTTP request might look like to delete a specific blog entry,
for example:
Listing 1-2

1 DELETE /blog/15 HTTP/1.1

There are actually nine HTTP methods (also known as verbs) defined by the HTTP specification,
but many of them are not widely used or supported. In reality, many modern browsers only
support POST and GET in HTML forms. Various others are however supported in
XMLHttpRequests, as well as by Symfony's router.

In addition to the first line, an HTTP request invariably contains other lines of information called request
headers. The headers can supply a wide range of information such as the requested Host, the response
formats the client accepts (Accept) and the application the client is using to make the request (UserAgent). Many other headers exist and can be found on Wikipedia's List of HTTP header fields2 article.

Step 2: The Server Returns a Response
Once a server has received the request, it knows exactly which resource the client needs (via the URI)
and what the client wants to do with that resource (via the method). For example, in the case of a GET
request, the server prepares the resource and returns it in an HTTP response. Consider the response from
the xkcd web server:

Translated into HTTP, the response sent back to the browser will look something like this:
Listing 1-3

1
2
3
4
5
6

HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
Content-Type: text/html


2. https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

PDF brought to you by
generated on April 28, 2016

Chapter 1: Symfony and HTTP Fundamentals | 6

7

8

The HTTP response contains the requested resource (the HTML content in this case), as well as other
information about the response. The first line is especially important and contains the HTTP response
status code (200 in this case). The status code communicates the overall outcome of the request back
to the client. Was the request successful? Was there an error? Different status codes exist that indicate
success, an error, or that the client needs to do something (e.g. redirect to another page). A full list can
be found on Wikipedia's List of HTTP status codes3 article.
Like the request, an HTTP response contains additional pieces of information known as HTTP headers.
For example, one important HTTP response header is Content-Type. The body of the same resource
could be returned in multiple different formats like HTML, XML, or JSON and the Content-Type header
uses Internet Media Types like text/html to tell the client which format is being returned. You can see a
list of common media types4 from IANA.
Many other headers exist, some of which are very powerful. For example, certain headers can be used to
create a powerful caching system.

Requests, Responses and Web Development
This request-response conversation is the fundamental process that drives all communication on the web.
And as important and powerful as this process is, it's inescapably simple.
The most important fact is this: regardless of the language you use, the type of application you build
(web, mobile, JSON API) or the development philosophy you follow, the end goal of an application is
always to understand each request and create and return the appropriate response.
Symfony is architected to match this reality.
To learn more about the HTTP specification, read the original HTTP 1.1 RFC5 or the HTTP Bis6,
which is an active effort to clarify the original specification. A great tool to check both the request
and response headers while browsing is the Live HTTP Headers7 extension for Firefox.

Requests and Responses in PHP
So how do you interact with the "request" and create a "response" when using PHP? In reality, PHP
abstracts you a bit from the whole process:
Listing 1-4

1
2
3
4
5
6

$uri = $_SERVER['REQUEST_URI'];
$foo = $_GET['foo'];
header('Content-Type: text/html');
echo 'The URI requested is: '.$uri;
echo 'The value of the "foo" parameter is: '.$foo;

As strange as it sounds, this small application is in fact taking information from the HTTP request and
using it to create an HTTP response. Instead of parsing the raw HTTP request message, PHP prepares
superglobal variables such as $_SERVER and $_GET that contain all the information from the request.
3. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
4.
5.
6.
7.

https://www.iana.org/assignments/media-types/media-types.xhtml
http://www.w3.org/Protocols/rfc2616/rfc2616.html
http://datatracker.ietf.org/wg/httpbis/
https://addons.mozilla.org/en-US/firefox/addon/live-http-headers/

PDF brought to you by
generated on April 28, 2016

Chapter 1: Symfony and HTTP Fundamentals | 7

Similarly, instead of returning the HTTP-formatted text response, you can use the header() function to
create response headers and simply print out the actual content that will be the content portion of the
response message. PHP will create a true HTTP response and return it to the client:
Listing 1-5

1
2
3
4
5
6
7

HTTP/1.1 200 OK
Date: Sat, 03 Apr 2011 02:14:33 GMT
Server: Apache/2.2.17 (Unix)
Content-Type: text/html
The URI requested is: /testing?foo=symfony
The value of the "foo" parameter is: symfony

Requests and Responses in Symfony
Symfony provides an alternative to the raw PHP approach via two classes that allow you to interact
with the HTTP request and response in an easier way. The Request8 class is a simple object-oriented
representation of the HTTP request message. With it, you have all the request information at your
fingertips:
Listing 1-6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();

// the URI being requested (e.g. /about) minus any query parameters
$request->getPathInfo();
// retrieve GET and POST variables respectively
$request->query->get('foo');
$request->request->get('bar', 'default value if bar does not exist');
// retrieve SERVER variables
$request->server->get('HTTP_HOST');
// retrieves an instance of UploadedFile identified by foo
$request->files->get('foo');
// retrieve a COOKIE value
$request->cookies->get('PHPSESSID');
// retrieve an HTTP request header, with normalized, lowercase keys
$request->headers->get('host');
$request->headers->get('content_type');
$request->getMethod();
// GET, POST, PUT, DELETE, HEAD
$request->getLanguages(); // an array of languages the client accepts

As a bonus, the Request class does a lot of work in the background that you'll never need to worry about.
For example, the isSecure() method checks the three different values in PHP that can indicate whether
or not the user is connecting via a secured connection (i.e. HTTPS).

8. http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/Request.html

PDF brought to you by
generated on April 28, 2016

Chapter 1: Symfony and HTTP Fundamentals | 8

ParameterBags and Request Attributes
As seen above, the $_GET and $_POST variables are accessible via the public query and request
properties respectively. Each of these objects is a ParameterBag9 object, which has methods like
get()10, has()11, all()12 and more. In fact, every public property used in the previous example is
some instance of the ParameterBag.
The Request class also has a public attributes property, which holds special data related to how
the application works internally. For the Symfony Framework, the attributes holds the values
returned by the matched route, like _controller, id (if you have an {id} wildcard), and even the
name of the matched route (_route). The attributes property exists entirely to be a place where
you can prepare and store context-specific information about the request.

Symfony also provides a Response class: a simple PHP representation of an HTTP response message.
This allows your application to use an object-oriented interface to construct the response that needs to
be returned to the client:
Listing 1-7

1
2
3
4
5
6
7
8
9
10

use Symfony\Component\HttpFoundation\Response;
$response = new Response();
$response->setContent('

Hello world!

');
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'text/html');

// prints the HTTP headers followed by the content
$response->send();

If Symfony offered nothing else, you would already have a toolkit for easily accessing request information
and an object-oriented interface for creating the response. Even as you learn the many powerful features
in Symfony, keep in mind that the goal of your application is always to interpret a request and create the
appropriate response based on your application logic.
The Request and Response classes are part of a standalone component included with Symfony
called HttpFoundation. This component can be used entirely independently of Symfony and also
provides classes for handling sessions and file uploads.

The Journey from the Request to the Response
Like HTTP itself, the Request and Response objects are pretty simple. The hard part of building an
application is writing what comes in between. In other words, the real work comes in writing the code
that interprets the request information and creates the response.
Your application probably does many things, like sending emails, handling form submissions, saving
things to a database, rendering HTML pages and protecting content with security. How can you manage
all of this and still keep your code organized and maintainable?
Symfony was created to solve these problems so that you don't have to.

9.
10.
11.
12.

http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/ParameterBag.html
http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/ParameterBag.html#method_get
http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/ParameterBag.html#method_has
http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/ParameterBag.html#method_all

PDF brought to you by
generated on April 28, 2016

Chapter 1: Symfony and HTTP Fundamentals | 9

The Front Controller
Traditionally, applications were built so that each "page" of a site was its own physical file:
Listing 1-8

1 index.php
2 contact.php