The HttpFoundation Component

The HttpFoundation component defines an object-oriented layer for the HTTP specification.

HttpFoundation コンポーネントは、HTTP 仕様のオブジェクト指向レイヤーを定義します。

In PHP, the request is represented by some global variables ($_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, ...) and the response is generated by some functions (echo, header(), setcookie(), ...).

PHP では、リクエストはいくつかのグローバル変数 ($_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、...) によって表され、応答はいくつかの関数 (echo、header()、setcookie()、. ..)。

The Symfony HttpFoundation component replaces these default PHP global variables and functions by an object-oriented layer.

Symfony HttpFoundation コンポーネントは、これらのデフォルトの PHP グローバル変数と関数をオブジェクト指向レイヤーに置き換えます。

Installation

1
$ composer require symfony/http-foundation

Note

ノート

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

このコンポーネントを Symfony アプリケーションの外部にインストールする場合は、Composer が提供するクラス自動ロード メカニズムを有効にするために、コード内に vendor/autoload.php ファイルを必要とする必要があります。詳細については、この記事をお読みください。

See also

こちらもご覧ください

This article explains how to use the HttpFoundation features as an independent component in any PHP application. In Symfony applications everything is already configured and ready to use. Read the Controller article to learn about how to use these features when creating controllers.

この記事では、HttpFoundation 機能を任意の PHP アプリケーションで独立したコンポーネントとして使用する方法について説明します。 Symfony アプリケーションでは、すべてがすでに構成されており、すぐに使用できます。コントローラーの作成時にこれらの機能を使用する方法については、コントローラーの記事をお読みください。

Request

The most common way to create a request is to base it on the current PHP global variables with createFromGlobals():

リクエストを作成する最も一般的な方法は、createFromGlobals() を使用して現在の PHP グローバル変数に基づいてリクエストを作成することです。
1
2
3
use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals();

which is almost equivalent to the more verbose, but also more flexible, __construct() call:

これは、より冗長ですが、より柔軟な __construct() 呼び出しとほぼ同等です。
1
2
3
4
5
6
7
8
$request = new Request(
    $_GET,
    $_POST,
    [],
    $_COOKIE,
    $_FILES,
    $_SERVER
);

Accessing Request Data

A Request object holds information about the client request. This information can be accessed via several public properties:

Request オブジェクトは、クライアント要求に関する情報を保持します。この情報には、いくつかのパブリック プロパティを介してアクセスできます。
  • request: equivalent of $_POST;
    request: $_POST と同等。
  • query: equivalent of $_GET ($request->query->get('name'));
    クエリ: $_GET ($request->query->get('name')); と同等
  • cookies: equivalent of $_COOKIE;
    クッキー: $_COOKIE と同等。
  • attributes: no equivalent - used by your app to store other data (see below);
    attributes: 同等のものはありません - アプリで他のデータを保存するために使用されます (以下を参照)。
  • files: equivalent of $_FILES;
    ファイル: $_FILES と同等。
  • server: equivalent of $_SERVER;
    サーバー: $_SERVER と同等。
  • headers: mostly equivalent to a subset of $_SERVER ($request->headers->get('User-Agent')).
    headers: ほとんど $_SERVER($request->headers->get('User-Agent')) のサブセットと同等です。

Each property is a ParameterBag instance (or a subclass of), which is a data holder class:

各プロパティは、データ ホルダー クラスである ParameterBaginstance (またはそのサブクラス) です。
  • request: ParameterBag or InputBag if the data is coming from $_POST parameters;
    request: データが $_POST パラメーターから来ている場合は ParameterBag または InputBag。
  • query: InputBag;
    クエリ: 入力バッグ;
  • cookies: InputBag;
    クッキー: 入力バッグ;
  • attributes: ParameterBag;
    属性: ParameterBag;
  • files: FileBag;
    ファイル: FileBag;
  • server: ServerBag;
    サーバー: ServerBag;
  • headers: HeaderBag.
    ヘッダー: ヘッダーバッグ。

All ParameterBag instances have methods to retrieve and update their data:

すべての ParameterBag インスタンスには、データを取得および更新するためのメソッドがあります。
all()
Returns the parameters.
パラメータを返します。
keys()
Returns the parameter keys.
パラメータ キーを返します。
replace()
Replaces the current parameters by a new set.
現在のパラメータを新しいセットに置き換えます。
add()
Adds parameters.
パラメータを追加します。
get()
Returns a parameter by name.
パラメータを名前で返します。
set()
Sets a parameter by name.
パラメータを名前で設定します。
has()
Returns true if the parameter is defined.
パラメータが定義されている場合は true を返します。
remove()
Removes a parameter.
パラメータを削除します。

The ParameterBag instance also has some methods to filter the input values:

ParameterBag インスタンスには、入力値をフィルタリングするメソッドもいくつかあります。
getAlpha()
Returns the alphabetic characters of the parameter value;
パラメータ値の英字を返します。
getAlnum()
Returns the alphabetic characters and digits of the parameter value;
パラメータ値の英字と数字を返します。
getBoolean()
Returns the parameter value converted to boolean;
ブール値に変換されたパラメーター値を返します。
getDigits()
Returns the digits of the parameter value;
パラメータ値の桁を返します。
getInt()
Returns the parameter value converted to integer;
整数に変換されたパラメーター値を返します。
filter()
Filters the parameter by using the PHP filter_var function.
PHP の filter_var 関数を使用してパラメーターをフィルター処理します。

All getters take up to two arguments: the first one is the parameter name and the second one is the default value to return if the parameter does not exist:

すべてのゲッターは最大 2 つの引数を取ります。最初の引数はパラメーター名で、2 番目の引数はパラメーターが存在しない場合に返されるデフォルト値です。
1
2
3
4
5
6
7
8
9
10
// the query string is '?foo=bar'

$request->query->get('foo');
// returns 'bar'

$request->query->get('bar');
// returns null

$request->query->get('bar', 'baz');
// returns 'baz'

When PHP imports the request query, it handles request parameters like foo[bar]=baz in a special way as it creates an array. The get() method doesn't support returning arrays, so you need to use the following code:

PHP がリクエスト クエリをインポートすると、配列を作成する際に特殊な方法で foo[bar]=baz などのリクエスト パラメータを処理します。 get() メソッドは配列を返すことをサポートしていないため、次のコードを使用する必要があります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// the query string is '?foo[bar]=baz'

// don't use $request->query->get('foo'); use the following instead:
$request->query->all('foo');
// returns ['bar' => 'baz']

// if the requested parameter does not exist, an empty array is returned:
$request->query->all('qux');
// returns []

$request->query->get('foo[bar]');
// returns null

$request->query->all()['foo']['bar'];
// returns 'baz'

Thanks to the public attributes property, you can store additional data in the request, which is also an instance of ParameterBag. This is mostly used to attach information that belongs to the Request and that needs to be accessed from many different points in your application.

public attributes プロパティのおかげで、ParameterBag のインスタンスでもあるリクエストに追加データを格納できます。これは主に、リクエストに属し、アプリケーションのさまざまなポイントからアクセスする必要がある情報を添付するために使用されます。

Finally, the raw data sent with the request body can be accessed using getContent():

最後に、リクエスト本文で送信された生データには、getContent() を使用してアクセスできます。
1
$content = $request->getContent();

For instance, this may be useful to process an XML string sent to the application by a remote service using the HTTP POST method.

たとえば、これは、HTTP POST メソッドを使用してリモート サービスによってアプリケーションに送信された XML 文字列を処理するのに役立つ場合があります。

If the request body is a JSON string, it can be accessed using toArray():

リクエストの本文が JSON 文字列の場合は、toArray() を使用してアクセスできます。
1
$data = $request->toArray();

Identifying a Request

In your application, you need a way to identify a request; most of the time, this is done via the "path info" of the request, which can be accessed via the getPathInfo() method:

アプリケーションでは、リクエストを識別する方法が必要です。ほとんどの場合、これはリクエストの「パス情報」を介して行われ、getPathInfo() メソッドを介してアクセスできます。
1
2
3
// for a request to http://example.com/blog/index.php/post/hello-world
// the path info is "/post/hello-world"
$request->getPathInfo();

Simulating a Request

Instead of creating a request based on the PHP globals, you can also simulate a request:

PHP グローバルに基づいてリクエストを作成する代わりに、リクエストをシミュレートすることもできます。
1
2
3
4
5
$request = Request::create(
    '/hello-world',
    'GET',
    ['name' => 'Fabien']
);

The create() method creates a request based on a URI, a method and some parameters (the query parameters or the request ones depending on the HTTP method); and of course, you can also override all other variables as well (by default, Symfony creates sensible defaults for all the PHP global variables).

create() メソッドは、URI、メソッド、およびいくつかのパラメーター (HTTP メソッドに応じて、クエリ パラメーターまたは要求パラメーター) に基づいて要求を作成します。もちろん、他のすべての変数もオーバーライドできます (デフォルトでは、Symfony はすべての PHP グローバル変数に対して適切なデフォルトを作成します)。

Based on such a request, you can override the PHP global variables via overrideGlobals():

このようなリクエストに基づいて、overrideGlobals() を介して PHP グローバル変数をオーバーライドできます。
1
$request->overrideGlobals();

Tip

ヒント

You can also duplicate an existing request via duplicate() or change a bunch of parameters with a single call to initialize().

また、duplicate() を介して既存のリクエストを複製したり、initialize() への 1 回の呼び出しで一連のパラメーターを変更したりすることもできます。

Accessing the Session

If you have a session attached to the request, you can access it via the getSession() method of the Request or RequestStack class; the hasPreviousSession() method tells you if the request contains a session which was started in one of the previous requests.

リクエストにアタッチされたセッションがある場合は、Requestor RequestStack クラスの getSession() メソッドを介してアクセスできます。hasPreviousSession() メソッドは、以前のリクエストのいずれかで開始されたセッションがリクエストに含まれているかどうかを示します。

Processing HTTP Headers

Processing HTTP headers is not a trivial task because of the escaping and white space handling of their contents. Symfony provides a HeaderUtils class that abstracts this complexity and defines some methods for the most common tasks:

HTTP ヘッダーの処理は、コンテンツのエスケープと空白処理のために簡単な作業ではありません。 Symfony は、この複雑さを抽象化し、最も一般的なタスクのいくつかのメソッドを定義する HeaderUtils クラスを提供します。
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
use Symfony\Component\HttpFoundation\HeaderUtils;

// Splits an HTTP header by one or more separators
HeaderUtils::split('da, en-gb;q=0.8', ',;');
// => [['da'], ['en-gb','q=0.8']]

// Combines an array of arrays into one associative array
HeaderUtils::combine([['foo', 'abc'], ['bar']]);
// => ['foo' => 'abc', 'bar' => true]

// Joins an associative array into a string for use in an HTTP header
HeaderUtils::toString(['foo' => 'abc', 'bar' => true, 'baz' => 'a b c'], ',');
// => 'foo=abc, bar, baz="a b c"'

// Encodes a string as a quoted string, if necessary
HeaderUtils::quote('foo "bar"');
// => '"foo \"bar\""'

// Decodes a quoted string
HeaderUtils::unquote('"foo \"bar\""');
// => 'foo "bar"'

// Parses a query string but maintains dots (PHP parse_str() replaces '.' by '_')
HeaderUtils::parseQuery('foo[bar.baz]=qux');
// => ['foo' => ['bar.baz' => 'qux']]

Accessing Accept-* Headers Data

You can access basic data extracted from Accept-* headers by using the following methods:

次のメソッドを使用して、Accept-* ヘッダーから抽出された基本データにアクセスできます。
getAcceptableContentTypes()
Returns the list of accepted content types ordered by descending quality.
受け入れられたコンテンツ タイプのリストを、品質の降順で並べ替えて返します。
getLanguages()
Returns the list of accepted languages ordered by descending quality.
品質の降順で並べられた受け入れられた言語のリストを返します。
getCharsets()
Returns the list of accepted charsets ordered by descending quality.
品質の降順で並べられた、受け入れられた文字セットのリストを返します。
getEncodings()
Returns the list of accepted encodings ordered by descending quality.
品質の降順で並べられた受け入れられたエンコーディングのリストを返します。

If you need to get full access to parsed data from Accept, Accept-Language, Accept-Charset or Accept-Encoding, you can use AcceptHeader utility class:

Accept、Accept-Language、Accept-Charset、または Accept-Encoding から解析済みデータに完全にアクセスする必要がある場合は、AcceptHeader ユーティリティ クラスを使用できます。
1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\HttpFoundation\AcceptHeader;

$acceptHeader = AcceptHeader::fromString($request->headers->get('Accept'));
if ($acceptHeader->has('text/html')) {
    $item = $acceptHeader->get('text/html');
    $charset = $item->getAttribute('charset', 'utf-8');
    $quality = $item->getQuality();
}

// Accept header items are sorted by descending quality
$acceptHeaders = AcceptHeader::fromString($request->headers->get('Accept'))
    ->all();

The default values that can be optionally included in the Accept-* headers are also supported:

オプションで Accept-* ヘッダーに含めることができるデフォルト値もサポートされています。
1
2
3
4
5
$acceptHeader = 'text/plain;q=0.5, text/html, text/*;q=0.8, */*;q=0.3';
$accept = AcceptHeader::fromString($acceptHeader);

$quality = $accept->get('text/xml')->getQuality(); // $quality = 0.8
$quality = $accept->get('application/xml')->getQuality(); // $quality = 0.3

Anonymizing IP Addresses

An increasingly common need for applications to comply with user protection regulations is to anonymize IP addresses before logging and storing them for analysis purposes. Use the anonymize() method from the IpUtils to do that:

アプリケーションがユーザー保護規制に準拠する必要性がますます一般的になっているのは、分析目的で IP アドレスをログに記録して保存する前に、IP アドレスを匿名化することです。これを行うには、theIpUtils の anonymize() メソッドを使用します。
1
2
3
4
5
6
7
8
9
use Symfony\Component\HttpFoundation\IpUtils;

$ipv4 = '123.234.235.236';
$anonymousIpv4 = IpUtils::anonymize($ipv4);
// $anonymousIpv4 = '123.234.235.0'

$ipv6 = '2a01:198:603:10:396e:4789:8e99:890f';
$anonymousIpv6 = IpUtils::anonymize($ipv6);
// $anonymousIpv6 = '2a01:198:603:10::'

Accessing other Data

The Request class has many other methods that you can use to access the request information. Have a look at the Request API for more information about them.

Request クラスには、リクエスト情報にアクセスするために使用できる他の多くのメソッドがあります。それらの詳細については、リクエスト API を参照してください。

Overriding the Request

The Request class should not be overridden as it is a data object that represents an HTTP message. But when moving from a legacy system, adding methods or changing some default behavior might help. In that case, register a PHP callable that is able to create an instance of your Request class:

Request クラスは、HTTP メッセージを表すデータ オブジェクトであるため、オーバーライドしないでください。ただし、レガシー システムから移行する場合は、メソッドを追加したり、デフォルトの動作を変更したりすると役立つ場合があります。その場合、Request クラスのインスタンスを作成できる PHP 呼び出し可能オブジェクトを登録します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use App\Http\SpecialRequest;
use Symfony\Component\HttpFoundation\Request;

Request::setFactory(function (
    array $query = [],
    array $request = [],
    array $attributes = [],
    array $cookies = [],
    array $files = [],
    array $server = [],
    $content = null
) {
    return new SpecialRequest(
        $query,
        $request,
        $attributes,
        $cookies,
        $files,
        $server,
        $content
    );
});

$request = Request::createFromGlobals();

Response

A Response object holds all the information that needs to be sent back to the client from a given request. The constructor takes up to three arguments: the response content, the status code, and an array of HTTP headers:

Response オブジェクトは、特定の要求からクライアントに送り返す必要があるすべての情報を保持します。コンストラクターは、最大 3 つの引数を取ります: 応答コンテンツ、ステータスコード、および HTTP ヘッダーの配列です。
1
2
3
4
5
6
7
use Symfony\Component\HttpFoundation\Response;

$response = new Response(
    'Content',
    Response::HTTP_OK,
    ['content-type' => 'text/html']
);

This information can also be manipulated after the Response object creation:

この情報は、Response オブジェクトの作成後に操作することもできます。
1
2
3
4
5
6
$response->setContent('Hello World');

// the headers public attribute is a ResponseHeaderBag
$response->headers->set('Content-Type', 'text/plain');

$response->setStatusCode(Response::HTTP_NOT_FOUND);

When setting the Content-Type of the Response, you can set the charset, but it is better to set it via the setCharset() method:

Response の Content-Type を設定する場合、文字セットを設定できますが、setCharset() メソッドを使用して設定することをお勧めします。
1
$response->setCharset('ISO-8859-1');

Note that by default, Symfony assumes that your Responses are encoded in UTF-8.

デフォルトでは、Symfony はレスポンスが UTF-8 でエンコードされていると想定していることに注意してください。

Sending the Response

Before sending the Response, you can optionally call the prepare() method to fix any incompatibility with the HTTP specification (e.g. a wrong Content-Type header):

応答を送信する前に、必要に応じて、prepare() メソッドを呼び出して、HTTP 仕様との非互換性 (たとえば、間違った Content-Type ヘッダー) を修正できます。
1
$response->prepare($request);

Sending the response to the client is done by calling the method send():

クライアントへの応答の送信は、メソッドend() を呼び出すことによって行われます。
1
$response->send();

Setting Cookies

The response cookies can be manipulated through the headers public attribute:

応答 Cookie は、ヘッダー publicattribute を介して操作できます。
1
2
3
use Symfony\Component\HttpFoundation\Cookie;

$response->headers->setCookie(Cookie::create('foo', 'bar'));

The setCookie() method takes an instance of Cookie as an argument.

SettCookie() メソッドは、Cookie のインスタンスを引数として取ります。

You can clear a cookie via the clearCookie() method.

clearCookie() メソッドを使用して Cookie をクリアできます。

In addition to the Cookie::create() method, you can create a Cookie object from a raw header value using fromString() method. You can also use the with*() methods to change some Cookie property (or to build the entire Cookie using a fluent interface). Each with*() method returns a new object with the modified property:

Cookie::create() メソッドに加えて、fromString() メソッドを使用して生のヘッダー値から Cookie オブジェクトを作成できます。 with*() メソッドを使用して、一部の Cookie プロパティを変更することもできます (または流暢なインターフェースを使用して Cookie 全体を構築することもできます)。各 with*() メソッドは、変更されたプロパティを持つ新しいオブジェクトを返します。
1
2
3
4
5
$cookie = Cookie::create('foo')
    ->withValue('bar')
    ->withExpires(strtotime('Fri, 20-May-2011 15:25:52 GMT'))
    ->withDomain('.example.com')
    ->withSecure(true);

Managing the HTTP Cache

The Response class has a rich set of methods to manipulate the HTTP headers related to the cache:

Response クラスには、キャッシュに関連する HTTP ヘッダーを操作するための豊富なメソッド セットがあります。

Note

ノート

The methods setExpires(), setLastModified() and setDate() accept any object that implements \DateTimeInterface, including immutable date objects.

メソッド setExpires()、setLastModified() および setDate() は、不変の日付オブジェクトを含む、\DateTimeInterface を実装する任意のオブジェクトを受け入れます。

The setCache() method can be used to set the most commonly used cache information in one method call:

setCache() メソッドを使用すると、最も一般的に使用されるキャッシュ情報を 1 回のメソッド呼び出しで設定できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$response->setCache([
    'must_revalidate'  => false,
    'no_cache'         => false,
    'no_store'         => false,
    'no_transform'     => false,
    'public'           => true,
    'private'          => false,
    'proxy_revalidate' => false,
    'max_age'          => 600,
    's_maxage'         => 600,
    'stale_if_error'   => 86400,
    'stale_while_revalidate' => 60,
    'immutable'        => true,
    'last_modified'    => new \DateTime(),
    'etag'             => 'abcdef',
]);

6.1

6.1

The stale_if_error and stale_while_revalidate options were introduced in Symfony 6.1.

stale_if_error および stale_while_revalidate オプションは Symfony 6.1 で導入されました。

To check if the Response validators (ETag, Last-Modified) match a conditional value specified in the client Request, use the isNotModified() method:

応答バリデーター (ETag、Last-Modified) がクライアント要求で指定された条件値と一致するかどうかを確認するには、isNotModified() メソッドを使用します。
1
2
3
if ($response->isNotModified($request)) {
    $response->send();
}

If the Response is not modified, it sets the status code to 304 and removes the actual response content.

応答が変更されていない場合、ステータス コードが 304 に設定され、実際の応答コンテンツが削除されます。

Redirecting the User

To redirect the client to another URL, you can use the RedirectResponse class:

クライアントを別の URL にリダイレクトするには、RedirectResponse クラスを使用できます。
1
2
3
use Symfony\Component\HttpFoundation\RedirectResponse;

$response = new RedirectResponse('http://example.com/');

Streaming a Response

The StreamedResponse class allows you to stream the Response back to the client. The response content is represented by a PHP callable instead of a string:

StreamedResponse クラスを使用すると、Response をクライアントにストリーミングして返すことができます。応答の内容は、文字列ではなく PHP 呼び出し可能オブジェクトによって表されます。
1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\HttpFoundation\StreamedResponse;

$response = new StreamedResponse();
$response->setCallback(function () {
    var_dump('Hello World');
    flush();
    sleep(2);
    var_dump('Hello World');
    flush();
});
$response->send();

Note

ノート

The flush() function does not flush buffering. If ob_start() has been called before or the output_buffering php.ini option is enabled, you must call ob_flush() before flush().

flush() 関数はバッファリングをフラッシュしません。 ob_start() が以前に呼び出された場合、または output_buffering php.ini オプションが有効になっている場合は、flush() の前に ob_flush() を呼び出す必要があります。

Additionally, PHP isn't the only layer that can buffer output. Your web server might also buffer based on its configuration. Some servers, such as nginx, let you disable buffering at the config level or by adding a special HTTP header in the response:

さらに、出力をバッファリングできるレイヤーは PHP だけではありません。 Web サーバーは、その構成に基づいてバッファリングすることもできます。 nginx などの一部のサーバーでは、構成レベルで、または応答に特別な HTTPheader を追加することで、バッファリングを無効にできます。
1
2
// disables FastCGI buffering in nginx only for this response
$response->headers->set('X-Accel-Buffering', 'no');

Serving Files

When sending a file, you must add a Content-Disposition header to your response. While creating this header for basic file downloads is straightforward, using non-ASCII filenames is more involved. The makeDisposition() abstracts the hard work behind a simple API:

ファイルを送信するときは、応答に Content-Disposition ヘッダーを追加する必要があります。基本的なファイルのダウンロード用にこのヘッダーを作成するのは簡単ですが、ASCII 以外のファイル名を使用するのはより複雑です。 makeDisposition() は、単純な API の背後にあるハードワークを抽象化します。
1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\HttpFoundation\HeaderUtils;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

$fileContent = ...; // the generated file content
$response = new Response($fileContent);

$disposition = HeaderUtils::makeDisposition(
    HeaderUtils::DISPOSITION_ATTACHMENT,
    'foo.pdf'
);

$response->headers->set('Content-Disposition', $disposition);

Alternatively, if you are serving a static file, you can use a BinaryFileResponse:

あるいは、静的ファイルを提供している場合は、aBinaryFileResponse を使用できます。
1
2
3
4
use Symfony\Component\HttpFoundation\BinaryFileResponse;

$file = 'path/to/file.txt';
$response = new BinaryFileResponse($file);

The BinaryFileResponse will automatically handle Range and If-Range headers from the request. It also supports X-Sendfile (see for nginx and Apache). To make use of it, you need to determine whether or not the X-Sendfile-Type header should be trusted and call trustXSendfileTypeHeader() if it should:

BinaryFileResponse は、リクエストの Range ヘッダーと If-Range ヘッダーを自動的に処理します。また、X-Sendfile もサポートしています (nginx と Apache については を参照してください)。これを利用するには、X-Sendfile-Type ヘッダーを信頼する必要があるかどうかを判断し、信頼できる場合は trustXSendfileTypeHeader() を呼び出す必要があります。
1
BinaryFileResponse::trustXSendfileTypeHeader();

Note

ノート

The BinaryFileResponse will only handle X-Sendfile if the particular header is present. For Apache, this is not the default case.

BinaryFileResponse は、特定のヘッダーが存在する場合にのみ X-Sendfile を処理します。Apache の場合、これはデフォルトのケースではありません。

To add the header use the mod_headers Apache module and add the following to the Apache configuration:

ヘッダーを追加するには、mod_headers Apache モジュールを使用し、次を Apache 構成に追加します。
1
2
3
4
5
6
7
8
9
10
<IfModule mod_xsendfile.c>
  # This is already present somewhere...
  XSendFile on
  XSendFilePath ...some path...

  # This needs to be added:
  <IfModule mod_headers.c>
    RequestHeader set X-Sendfile-Type X-Sendfile
  </IfModule>
</IfModule>

With the BinaryFileResponse, you can still set the Content-Type of the sent file, or change its Content-Disposition:

BinaryFileResponse を使用すると、送信されたファイルの Content-Type を設定したり、Content-Disposition を変更したりできます。
1
2
3
4
5
6
// ...
$response->headers->set('Content-Type', 'text/plain');
$response->setContentDisposition(
    ResponseHeaderBag::DISPOSITION_ATTACHMENT,
    'filename.txt'
);

It is possible to delete the file after the response is sent with the deleteFileAfterSend() method. Please note that this will not work when the X-Sendfile header is set.

deleteFileAfterSend() メソッドを使用して、応答が送信された後にファイルを削除することができます。これは、X-Sendfile ヘッダーが設定されている場合は機能しないことに注意してください。

If the size of the served file is unknown (e.g. because it's being generated on the fly, or because a PHP stream filter is registered on it, etc.), you can pass a Stream instance to BinaryFileResponse. This will disable Range and Content-Length handling, switching to chunked encoding instead:

提供されたファイルのサイズが不明な場合 (たとえば、オンザフライで生成されているため、または PHP ストリーム フィルターが登録されているためなど)、Streaminstance を BinaryFileResponse に渡すことができます。これにより、Range と Content-Lengthhandling が無効になり、代わりにチャンク エンコーディングに切り替わります。
1
2
3
4
5
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\Stream;

$stream = new Stream('path/to/stream');
$response = new BinaryFileResponse($stream);

Note

ノート

If you just created the file during this same request, the file may be sent without any content. This may be due to cached file stats that return zero for the size of the file. To fix this issue, call clearstatcache(true, $file) with the path to the binary file.

この同じ要求でファイルを作成したばかりの場合、ファイルはコンテンツなしで送信される可能性があります。これは、ファイルのサイズに対してゼロを返すキャッシュされたファイル統計が原因である可能性があります。この問題を解決するには、バイナリ ファイルへのパスを指定して clearstatcache(true, $file) を呼び出します。

Creating a JSON Response

Any type of response can be created via the Response class by setting the right content and headers. A JSON response might look like this:

適切なコンテンツとヘッダーを設定することにより、Response クラスを介して任意のタイプの応答を作成できます。 JSON 応答は次のようになります。
1
2
3
4
5
6
7
use Symfony\Component\HttpFoundation\Response;

$response = new Response();
$response->setContent(json_encode([
    'data' => 123,
]));
$response->headers->set('Content-Type', 'application/json');

There is also a helpful JsonResponse class, which can make this even easier:

これをさらに簡単にする便利な JsonResponseclass もあります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Symfony\Component\HttpFoundation\JsonResponse;

// if you know the data to send when creating the response
$response = new JsonResponse(['data' => 123]);

// if you don't know the data to send or if you want to customize the encoding options
$response = new JsonResponse();
// ...
// configure any custom encoding options (if needed, it must be called before "setData()")
//$response->setEncodingOptions(JsonResponse::DEFAULT_ENCODING_OPTIONS | \JSON_PRESERVE_ZERO_FRACTION);
$response->setData(['data' => 123]);

// if the data to send is already encoded in JSON
$response = JsonResponse::fromJsonString('{ "data": 123 }');

The JsonResponse class sets the Content-Type header to application/json and encodes your data to JSON when needed.

JsonResponse クラスは Content-Type ヘッダーを application/json に設定し、必要に応じてデータを JSON にエンコードします。

Caution

注意

To avoid XSSI JSON Hijacking, you should pass an associative array as the outermost array to JsonResponse and not an indexed array so that the final result is an object (e.g. {"object": "not inside an array"}) instead of an array (e.g. [{"object": "inside an array"}]). Read the OWASP guidelines for more information.

XSSI JSON ハイジャックを回避するには、最終結果が配列 (例: [{"オブジェクト": "配列内"}])。詳細については、OWASP ガイドラインをお読みください。

Only methods that respond to GET requests are vulnerable to XSSI 'JSON Hijacking'. Methods responding to POST requests only remain unaffected.

GET 要求に応答するメソッドのみが、XSSI の「JSON ハイジャック」に対して脆弱です。POST 要求に応答するメソッドのみが影響を受けません。

JSONP Callback

If you're using JSONP, you can set the callback function that the data should be passed to:

JSONP を使用している場合は、データが渡されるコールバック関数を設定できます。
1
$response->setCallback('handleResponse');

In this case, the Content-Type header will be text/javascript and the response content will look like this:

この場合、Content-Type ヘッダーは text/javascript になり、応答コンテンツは次のようになります。
1
handleResponse({'data': 123});

Session

The session information is in its own document: Session Management.

セッション情報は、独自のドキュメント: セッション管理にあります。

Safe Content Preference

Some web sites have a "safe" mode to assist those who don't want to be exposed to content to which they might object. The RFC 8674 specification defines a way for user agents to ask for safe content to a server.

一部の Web サイトには、反対する可能性のあるコンテンツにさらされたくないユーザーを支援するための「セーフ」モードがあります。 RFC 8674 仕様では、ユーザー エージェントが安全なコンテンツをサーバーに要求することを定義しています。

The specification does not define what content might be considered objectionable, so the concept of "safe" is not precisely defined. Rather, the term is interpreted by the server and within the scope of each web site that chooses to act upon this information.

仕様では、どのコンテンツが好ましくないと見なされるかを定義していないため、「安全」の概念は正確に定義されていません。むしろ、この用語はサーバーによって解釈され、この情報に基づいて行動することを選択した各 Web サイトの範囲内で解釈されます。

Symfony offers two methods to interact with this preference:

Symfony は、この設定を操作する 2 つの方法を提供します。

The following example shows how to detect if the user agent prefers "safe" content:

次の例は、ユーザー エージェントが「安全な」コンテンツを好むかどうかを検出する方法を示しています。
1
2
3
4
5
6
if ($request->preferSafeContent()) {
    $response = new Response($alternativeContent);
    // this informs the user we respected their preferences
    $response->setContentSafe();

    return $response;

Generating Relative and Absolute URLs

Generating absolute and relative URLs for a given path is a common need in some applications. In Twig templates you can use the absolute_url() and relative_path() functions to do that.

特定のパスの絶対 URL と相対 URL を生成することは、一部のアプリケーションで一般的に必要とされます。 Twig テンプレートでは、absolute_url() およびrelative_path() 関数を使用してそれを行うことができます。

The UrlHelper class provides the same functionality for PHP code via the getAbsoluteUrl() and getRelativePath() methods. You can inject this as a service anywhere in your application:

UrlHelper クラスは、getAbsoluteUrl() および getRelativePath() メソッドを介して PHP コードに同じ機能を提供します。これをサービスとしてアプリケーションの任意の場所に挿入できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// src/Normalizer/UserApiNormalizer.php
namespace App\Normalizer;

use Symfony\Component\HttpFoundation\UrlHelper;

class UserApiNormalizer
{
    private UrlHelper $urlHelper;

    public function __construct(UrlHelper $urlHelper)
    {
        $this->urlHelper = $urlHelper;
    }

    public function normalize($user)
    {
        return [
            'avatar' => $this->urlHelper->getAbsoluteUrl($user->avatar()->path()),
        ];
    }
}

Learn More