Symfony and HTTP Fundamentals

Great news! While you're learning Symfony, you're also learning the fundamentals of the web. Symfony is closely modeled after the HTTP Request-Response flow: that fundamental paradigm that's behind almost all communication on the web.

素晴らしいニュース! Symfony を学んでいる間、Web の基礎も学んでいます。 symfony は、HTTP Request-Response フロー (Web 上のほぼすべての通信の背後にある基本的なパラダイム) に厳密に基づいてモデル化されています。

In this article, you'll walk through the HTTP fundamentals and find out how these are applied throughout Symfony.

この記事では、HTTP の基礎を一通り説明し、これらが Symfony 全体にどのように適用されるかを調べます。

Requests and Responses in HTTP

HTTP (Hypertext Transfer Protocol) is a text language that allows two machines to communicate with each other. For example, when checking for the latest xkcd comic, the following (approximate) conversation takes place:

HTTP (Hypertext Transfer Protocol) は、2 台のマシンが相互に通信できるようにするテキスト言語です。たとえば、最新の xkcd コミックをチェックする場合、次の (おおよその) 会話が行われます。

HTTP is the term used to describe this text-based language. The goal of your server is always to understand text requests and return text responses.

HTTP は、このテキストベースの言語を表すために使用される用語です。サーバーの目標は常に、テキスト リクエストを理解し、テキスト レスポンスを返すことです。

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.

symfony は、その現実に基づいてゼロから構築されています。気づいているかどうかにかかわらず、HTTP は毎日使用するものです。 Symfony を使えば、それをマスターする方法を学ぶことができます。

Step 1: 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.

Web 上のすべての会話は、要求から始まります。リクエストは、HTTP と呼ばれる特別な形式でクライアント (ブラウザ、スマートフォン アプリなど) によって作成されたテキスト メッセージです。クライアントはその要求をサーバーに送信し、応答を待ちます。

Take a look at the first part of the interaction (the request) between a browser and the xkcd web server:

ブラウザと xkcd Web サーバー間のやり取り (リクエスト) の最初の部分を見てみましょう。

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

HTTP で言えば、この HTTP リクエストは実際には次のようになります。
1
2
3
4
GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)

These few lines communicate everything necessary about exactly which resource the client is requesting. The first line of an HTTP request is the most important, because it contains two important things: the HTTP method (GET) and the URI (/).

これらの数行は、クライアントがどのリソースを要求しているかについて必要なすべてを伝えます。 HTTP リクエストの最初の行は、HTTP メソッド (GET) と URI (/) という 2 つの重要な要素が含まれているため、最も重要です。

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 the client wants to do with the resource. The HTTP methods (also known as verbs) define the few common ways that the client can act upon the resource - the most common HTTP methods are:

URI (例: /、/contact など) は、クライアントが必要とするリソースを識別する一意のアドレスまたは場所です。 HTTP メソッド (GET など) は、クライアントがリソースで何をしたいのかを定義します。 HTTP メソッド (動詞とも呼ばれます) は、クライアントがリソースに対して実行できるいくつかの一般的な方法を定義します。最も一般的な HTTP メソッドは次のとおりです。
GET
Retrieve the resource from the server (e.g. when visiting a page);
サーバーからリソースを取得します (たとえば、ページにアクセスしたとき)。
POST
Create a resource on the server (e.g. when submitting a form);
サーバー上にリソースを作成します (フォームの送信時など)。
PUT/PATCH
Update the resource on the server (used by APIs);
サーバー上のリソースを更新します (API によって使用されます)。
DELETE
Delete the resource from the server (used by APIs).
サーバーからリソースを削除します (API によって使用されます)。

With this in mind, you can imagine what an HTTP request might look like to delete a specific blog post, for example:

これを念頭に置いて、特定のブログ投稿を削除するための HTTP リクエストがどのように見えるかを想像できます。たとえば、次のようになります。
1
DELETE /blog/15 HTTP/1.1

Note

ノート

There are actually nine HTTP methods 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 XMLHttpRequest.

HTTP 仕様では、実際には 9 つの HTTP メソッドが定義されていますが、それらの多くは広く使用されていないか、サポートされていません。実際、多くの最近のブラウザーは、HTML フォームでの POST と GET のみをサポートしています。ただし、XMLHttpRequest ではその他のさまざまな機能がサポートされています。

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 host of the resource being requested (Host), the response formats the client accepts (Accept) and the application the client is using to make the request (User-Agent). Many other headers exist and can be found on Wikipedia's List of HTTP header fields article.

最初の行に加えて、HTTP 要求には常に、要求ヘッダーと呼ばれる他の行の情報が含まれています。ヘッダーは、要求されているリソースのホスト (Host)、クライアントが受け入れる応答形式 (Accept)、およびクライアントが要求を行うために使用しているアプリケーション (User-Agent) などの幅広い情報を提供できます。他にも多くのヘッダーが存在し、ウィキペディアの HTTP ヘッダー フィールドのリストの記事で見つけることができます。

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:

サーバーが要求を受信すると、クライアントが必要とするリソース (URI を介して) と、クライアントがそのリソースを使用して何をしたいのか (メソッドを介して) を正確に認識します。たとえば、GET 要求の場合、サーバーはリソースを準備し、それを HTTP 応答で返します。 xkcd Web サーバーからの応答を考えてみましょう。

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

HTTP に変換すると、ブラウザに返される応答は次のようになります。
1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
Content-Type: text/html


    

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).

HTTP 応答には、要求されたリソース (この場合は HTML コンテンツ) と、応答に関するその他の情報が含まれています。最初の行は特に重要で、HTTP 応答ステータス コード (この場合は 200) が含まれています。

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). Check out the list of HTTP status codes.

ステータス コードは、リクエストの全体的な結果をクライアントに伝えます。リクエストは成功しましたか?エラーはありましたか?成功、エラー、またはクライアントが何かを行う必要があること (別のページへのリダイレクトなど) を示すさまざまなステータス コードが存在します。 HTTP ステータス コードのリストを確認してください。

Like the request, an HTTP response contains additional pieces of information known as HTTP headers. 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 types from IANA.

リクエストと同様に、HTTP レスポンスには、HTTP ヘッダーと呼ばれる追加の情報が含まれています。同じリソースの本文は、HTML、XML、JSON などの複数の異なる形式で返される可能性があり、Content-Type ヘッダーは text/html などのインターネット メディア タイプを使用して、返される形式をクライアントに伝えます。 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.

この要求と応答の会話は、Web 上のすべてのコミュニケーションを推進する基本的なプロセスです。

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.

最も重要な事実は次のとおりです。使用する言語、作成するアプリケーションの種類 (Web、モバイル、JSON API)、または従う開発哲学に関係なく、アプリケーションの最終目標は常に各要求を理解し、適切な応答。

See also

こちらもご覧ください

To learn more about the HTTP specification, read the original HTTP 1.1 RFC or the HTTP Bis, which is an active effort to clarify the original specification.

HTTP 仕様の詳細については、オリジナルの HTTP 1.1 RFC または HTTP Bis を参照してください。これは、オリジナルの仕様を明確にするための積極的な取り組みです。

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:

では、PHP を使用する場合、どのように「リクエスト」と対話し、「レスポンス」を作成するのでしょうか?実際には、PHP はプロセス全体から少し抽象化します。
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. Similarly, instead of returning the HTTP-formatted text response, you can use the PHP header function to create response headers and 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:

奇妙に聞こえるかもしれませんが、この小さなアプリケーションは、実際には HTTP 要求から情報を取得し、それを使用して HTTP 応答を作成しています。生の HTTP 要求メッセージを解析する代わりに、PHP は要求からのすべての情報を含むスーパーグローバル変数 ($_SERVER や $_GET など) を準備します。同様に、HTTP 形式のテキスト応答を返す代わりに、PHP ヘッダー関数を使用して応答ヘッダーを作成し、応答メッセージのコンテンツ部分となる実際のコンテンツを出力できます。 PHP は真の HTTP 応答を作成し、それをクライアントに返します。
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.

Symfony は、HTTP リクエストとレスポンスをより簡単な方法で操作できるようにする 2 つのクラスを介して、生の PHP アプローチの代替手段を提供します。

Symfony Request Object

The Request class is an object-oriented representation of the HTTP request message. With it, you have all the request information at your fingertips:

Request クラスは、HTTP 要求メッセージのオブジェクト指向表現です。これにより、すべてのリクエスト情報をすぐに利用できます。
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();

// retrieves $_GET and $_POST variables respectively
$request->query->get('id');
$request->request->get('category', 'default category');

// retrieves $_SERVER variables
$request->server->get('HTTP_HOST');

// retrieves an instance of UploadedFile identified by "attachment"
$request->files->get('attachment');

// retrieves a $_COOKIE value
$request->cookies->get('PHPSESSID');

// retrieves an HTTP request header, with normalized, lowercase keys
$request->headers->get('host');
$request->headers->get('content-type');

$request->getMethod();    // e.g. GET, POST, PUT, DELETE or HEAD
$request->getLanguages(); // an array of languages the client accepts

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

おまけとして、Request クラスはバックグラウンドで多くの作業を行っているため、心配する必要はありません。たとえば、isSecure() メソッドは、ユーザーが安全な接続 (HTTPS など) を介して接続しているかどうかを示すことができる PHP の 3 つの異なる値をチェックします。

Symfony Response Object

Symfony also provides a Response class: a 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:

symfony は、HTTP 応答メッセージの PHP 表現である Responseclass も提供します。これにより、アプリケーションはオブジェクト指向インターフェースを使用して、クライアントに返す必要がある応答を作成できます。
1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\HttpFoundation\Response;

$response = new Response();

$response->setContent('<html><body><h1>Hello world!</h1></body></html>');
$response->setStatusCode(Response::HTTP_OK);

// sets a HTTP response header
$response->headers->set('Content-Type', 'text/html');

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

There are also several response sub-classes to help you return JSON, redirect, stream file downloads and more.

また、JSON、リダイレクト、ストリーム ファイルのダウンロードなどを返すのに役立ついくつかの応答サブクラスもあります。

Tip

ヒント

The Request and Response classes are part of a standalone component called symfony/http-foundation that you can use in any PHP project. This also contains classes for handling sessions, file uploads and more.

Request クラスと Response クラスは、任意の PHP プロジェクトで使用できる symfony/http-foundation と呼ばれるスタンドアロン コンポーネントの一部です。これには、セッションの処理、ファイルのアップロードなどのクラスも含まれています。

If Symfony offered nothing else, you would already have a toolkit for 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.

Symfony が他に何も提供していない場合、リクエスト情報にアクセスするためのツールキットと、レスポンスを作成するためのオブジェクト指向インターフェースを既に持っていることになります。アプリケーション ロジックに基づいて、適切な応答を要求および作成します。

The Journey from the Request to the Response

Like HTTP itself, using the Request and Response objects is pretty straightforward. 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.

HTTP 自体と同様に、Request オブジェクトと 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 help you with these problems.

アプリケーションはおそらく、電子メールの送信、フォーム送信の処理、データベースへの保存、HTML ページのレンダリング、セキュリティによるコンテンツの保護など、多くのことを行います。これらすべてを管理しながら、コードを整理して保守しやすくするにはどうすればよいでしょうか? symfony は、これらの問題を解決するために作成されました。

The Front Controller

Traditionally, applications were built so that each "page" of a site was its own physical file (e.g. index.php, contact.php, etc.).

従来、アプリケーションは、サイトの各「ページ」が独自の物理ファイル (index.php、contact.php など) になるように構築されていました。

There are several problems with this approach, including the inflexibility of the URLs (what if you wanted to change blog.php to news.php without breaking all of your links?) and the fact that each file must manually include some set of core files so that security, database connections and the "look" of the site can remain consistent.

このアプローチには、URL の柔軟性の欠如 (すべてのリンクを壊さずに blog.php を news.php に変更したい場合はどうなるでしょうか?) や、セキュリティを確保するために各ファイルにいくつかのコア ファイルのセットを手動で含める必要があるという事実など、いくつかの問題があります。 、データベース接続、およびサイトの「外観」の一貫性を保つことができます。

A much better solution is to use a front controller: a single PHP file that handles every request coming into your application. For example:

はるかに優れた解決策は、フロント コントローラーを使用することです。フロント コントローラーは、アプリケーションに着信するすべての要求を処理する単一の PHP ファイルです。例えば:
/index.php executes index.php
/index.php/contact executes index.php
/index.php/blog executes index.php

Tip

ヒント

By using rewrite rules in your web server configuration, the index.php won't be needed and you will have beautiful, clean URLs (e.g. /show).

Web サーバー構成で書き換えルールを使用することにより、index.php が不要になり、きれいでクリーンな URL (例: /show) が得られます。

Now, every request is handled exactly the same way. Instead of individual URLs executing different PHP files, the front controller is always executed, and the routing of different URLs to different parts of your application is done internally.

これで、すべてのリクエストがまったく同じ方法で処理されます。個々の URL がさまざまな PHP ファイルを実行する代わりに、フロント コントローラーが常に実行され、アプリケーションのさまざまな部分へのさまざまな URL のルーティングが内部的に行われます。

A small front controller might look like this:

小さなフロント コントローラーは次のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// index.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals();
$path = $request->getPathInfo(); // the URI path being requested

if (in_array($path, ['', '/'])) {
    $response = new Response('Welcome to the homepage.');
} elseif ('/contact' === $path) {
    $response = new Response('Contact us');
} else {
    $response = new Response('Page not found.', Response::HTTP_NOT_FOUND);
}
$response->send();

This is better, but this is still a lot of repeated work! Fortunately, Symfony can help once again.

これは良くなりましたが、これはまだ多くの繰り返し作業です!幸いなことに、Symfony は再び役に立ちます。

The Symfony Application Flow

A Symfony framework application also uses a front-controller file. But inside, Symfony is responsible for handling each incoming request and figuring out what to do:

Symfony フレームワーク アプリケーションもフロント コントローラー ファイルを使用します。しかし内部では、Symfony は各受信リクエストを処理し、何をすべきかを判断する責任があります。

Incoming requests are interpreted by the Routing component and passed to PHP functions that return Response objects.

着信要求はルーティング コンポーネントによって解釈され、Response オブジェクトを返す PHP 関数に渡されます。

This may not make sense yet, but as you keep reading, you'll learn about routes and controllers: the two fundamental parts to creating a page. But as you go along, don't forget that no matter how complex your app gets, your job is always the same: read information from the Request and use it to create a Response.

これはまだ意味をなさないかもしれませんが、読み進めるうちに、ページを作成するための 2 つの基本的な部分であるルートとコントローラーについて学ぶことができます。常に同じです: Request から情報を読み取り、それを使用して aResponse を作成します。

Summary: The Request-Response Flow

Here's what we've learned so far:

これまでに学んだことは次のとおりです。
  1. A client (e.g. a browser) sends an HTTP request;
    クライアント (ブラウザなど) が HTTP リクエストを送信します。
  2. Each request executes the same, single file (called a "front controller");
    各リクエストは、同じ単一のファイル (「フロント コントローラー」と呼ばれます) を実行します。
  3. The front controller boots Symfony and passes the request information;
    フロントコントローラーは Symfony を起動し、リクエスト情報を渡します。
  4. Internally, Symfony uses routes and controllers to create the Response for the page (we'll learn about these soon!);
    内部的には、Symfony はルートとコントローラーを使用してページのレスポンスを作成します (これらについてはすぐに学習します!)。
  5. Symfony turns your Response object into the text headers and content (i.e. the HTTP response), which are sent back to the client.
    symfony は Response オブジェクトをテキストヘッダーとコンテンツ (つまり HTTP レスポンス) に変換し、クライアントに送り返します。