Configuring Symfony

Configuration Files

Symfony applications are configured with the files stored in the config/ directory, which has this default structure:

Symfony アプリケーションは config/directory に保存されたファイルで設定されます。このデフォルト構造は次のとおりです。
1
2
3
4
5
6
7
your-project/
├─ config/
│  ├─ packages/
│  ├─ bundles.php
│  ├─ routes.yaml
│  └─ services.yaml
├─ ...

The routes.yaml file defines the routing configuration; the services.yaml file configures the services of the service container; the bundles.php file enables/ disables packages in your application.

routes.yaml ファイルはルーティング構成を定義し、services.yaml ファイルはサービス コンテナーのサービスを構成します。 bundles.php ファイルは、アプリケーション内のパッケージを有効/無効にします。

You'll be working mostly in the config/packages/ directory. This directory stores the configuration of every package installed in your application. Packages (also called "bundles" in Symfony and "plugins/modules" in other projects) add ready-to-use features to your projects.

主に config/packages/ ディレクトリで作業します。このディレクトリには、アプリケーションにインストールされたすべてのパッケージの構成が保存されます。パッケージ (Symfony では「バンドル」、他のプロジェクトでは「プラグイン/モジュール」とも呼ばれます) は、すぐに使用できる機能をプロジェクトに追加します。

When using Symfony Flex, which is enabled by default in Symfony applications, packages update the bundles.php file and create new files in config/packages/ automatically during their installation. For example, this is the default file created by the "API Platform" package:

Symfony アプリケーションでデフォルトで有効になっている Symfony Flex を使用する場合、パッケージは bundles.php ファイルを更新し、インストール中に config/packages/ に新しいファイルを自動的に作成します。たとえば、これは「API Platform」パッケージによって作成されるデフォルトのファイルです。
1
2
3
4
# config/packages/api_platform.yaml
api_platform:
    mapping:
        paths: ['%kernel.project_dir%/src/Entity']

Splitting the configuration into lots of small files is intimidating for some Symfony newcomers. However, you'll get used to them quickly and you rarely need to change these files after package installation

構成を多数の小さなファイルに分割することは、一部の Symfony 初心者にとっては威圧的です。ただし、すぐに慣れるので、パッケージのインストール後にこれらのファイルを変更する必要はほとんどありません。

Tip

ヒント

To learn about all the available configuration options, check out the Symfony Configuration Reference or run the config:dump-reference command.

利用可能なすべての設定オプションについて学ぶには、Symfony 設定リファレンスを確認するか、config:dump-reference コマンドを実行してください。

Configuration Formats

Unlike other frameworks, Symfony doesn't impose a specific format on you to configure your applications. Symfony lets you choose between YAML, XML and PHP and throughout the Symfony documentation, all configuration examples will be shown in these three formats.

他のフレームワークとは異なり、Symfony はアプリケーションを構成するために特定のフォーマットを課しません。 Symfony では、YAML、XML、および PHP のいずれかを選択できます。Symfony のドキュメントでは、すべての構成例がこれら 3 つの形式で示されています。

There isn't any practical difference between formats. In fact, Symfony transforms and caches all of them into PHP before running the application, so there's not even any performance difference between them.

フォーマット間に実質的な違いはありません。実際、Symfony はアプリケーションを実行する前にそれらすべてを変換して PHP にキャッシュするため、それらの間にパフォーマンスの違いさえありません。

YAML is used by default when installing packages because it's concise and very readable. These are the main advantages and disadvantages of each format:

YAML は簡潔で非常に読みやすいため、パッケージのインストール時にデフォルトで使用されます。各形式の主な長所と短所は次のとおりです。
  • YAML: simple, clean and readable, but not all IDEs support autocompletion and validation for it. Learn the YAML syntax;
    YAML: シンプルでクリーンで読みやすいですが、すべての IDE が自動補完と検証をサポートしているわけではありません。 YAML 構文を学びます。
  • XML: autocompleted/validated by most IDEs and is parsed natively by PHP, but sometimes it generates configuration considered too verbose. Learn the XML syntax;
    XML: ほとんどの IDE でオートコンプリート/検証され、PHP によってネイティブに解析されますが、冗長すぎると見なされる構成が生成されることがあります。 XML 構文を学びます。
  • PHP: very powerful and it allows you to create dynamic configuration with arrays or a ConfigBuilder.
    PHP: 非常に強力で、配列または ConfigBuilder を使用して動的構成を作成できます。

Note

ノート

By default Symfony loads the configuration files defined in YAML and PHP formats. If you define configuration in XML format, update the src/Kernel.php file to add support for the .xml file extension.

デフォルトでは、Symfony は YAML および PHP 形式で定義された構成ファイルをロードします。 XML 形式で構成を定義する場合は、src/Kernel.php ファイルを更新して、.xml ファイル拡張子のサポートを追加します。

6.1

6.1

The automatic loading of PHP configuration files was introduced in Symfony 6.1.

PHP 構成ファイルの自動ロードは、Symfony 6.1 で導入されました。

Importing Configuration Files

Symfony loads configuration files using the Config component, which provides advanced features such as importing other configuration files, even if they use a different format:

symfony は Config コンポーネントを使用して設定ファイルをロードします。これは、他の設定ファイルをインポートするなどの高度な機能を提供します (異なる形式を使用している場合でも)。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
# config/services.yaml
imports:
    - { resource: 'legacy_config.php' }

    # glob expressions are also supported to load multiple files
    - { resource: '/etc/myapp/*.yaml' }

    # ignore_errors: not_found silently discards errors if the loaded file doesn't exist
    - { resource: 'my_config_file.xml', ignore_errors: not_found }
    # ignore_errors: true silently discards all errors (including invalid code and not found)
    - { resource: 'my_other_config_file.xml', ignore_errors: true }

# ...

Configuration Parameters

Sometimes the same configuration value is used in several configuration files. Instead of repeating it, you can define it as a "parameter", which is like a reusable configuration value. By convention, parameters are defined under the parameters key in the config/services.yaml file:

同じ設定値が複数の設定ファイルで使用されている場合があります。それを繰り返す代わりに、再利用可能な設定値のような「パラメータ」として定義できます。慣例により、パラメーターは config/services.yaml ファイルの parameters キーの下に定義されます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# config/services.yaml
parameters:
    # the parameter name is an arbitrary string (the 'app.' prefix is recommended
    # to better differentiate your parameters from Symfony parameters).
    app.admin_email: 'something@example.com'

    # boolean parameters
    app.enable_v2_protocol: true

    # array/collection parameters
    app.supported_locales: ['en', 'es', 'fr']

    # binary content parameters (encode the contents with base64_encode())
    app.some_parameter: !!binary VGhpcyBpcyBhIEJlbGwgY2hhciAH

    # PHP constants as parameter values
    app.some_constant: !php/const GLOBAL_CONSTANT
    app.another_constant: !php/const App\Entity\BlogPost::MAX_ITEMS

# ...

Caution

注意

When using XML configuration, the values between <parameter> tags are not trimmed. This means that the value of the following parameter will be '\n something@example.com\n':

XML 構成を使用する場合、タグ間の値はトリミングされません。これは、次のパラメータの値が「\nsomething@example.com\n」になることを意味します:
1
2
3
<parameter key="app.admin_email">
    something@example.com
</parameter>

Once defined, you can reference this parameter value from any other configuration file using a special syntax: wrap the parameter name in two % (e.g. %app.admin_email%):

定義したら、特別な構文を使用して他の構成ファイルからこのパラメーター値を参照できます。パラメーター名を 2 つの % で囲みます (例: %app.admin_email%):
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
# config/packages/some_package.yaml
some_package:
    # any string surrounded by two % is replaced by that parameter value
    email_address: '%app.admin_email%'

    # ...

Note

ノート

If some parameter value includes the % character, you need to escape it by adding another % so Symfony doesn't consider it a reference to a parameter name:

一部のパラメーター値に % 文字が含まれている場合は、別の % を追加してエスケープする必要があるため、Symfony はそれをパラメーター名への参照と見なしません。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
# config/services.yaml
parameters:
    # Parsed as 'https://symfony.com/?foo=%s&amp;bar=%d'
    url_pattern: 'https://symfony.com/?foo=%%s&amp;bar=%%d'

Note

ノート

Due to the way in which parameters are resolved, you cannot use them to build paths in imports dynamically. This means that something like the following doesn't work:

パラメータが解決される方法が原因で、それらを使用してインポートでパスを動的に構築することはできません。これは、次のようなものが機能しないことを意味します。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
# config/services.yaml
imports:
    - { resource: '%kernel.project_dir%/somefile.yaml' }

Configuration parameters are very common in Symfony applications. Some packages even define their own parameters (e.g. when installing the translation package, a new locale parameter is added to the config/services.yaml file).

構成パラメーターは、Symfony アプリケーションでは非常に一般的です。一部のパッケージは、独自のパラメーターを定義しています (たとえば、翻訳パッケージをインストールすると、新しいロケール パラメーターが config/services.yaml ファイルに追加されます)。

See also

こちらもご覧ください

Later in this article you can read how to get configuration parameters in controllers and services.

この記事の後半で、コントローラーとサービスの構成パラメーターを取得する方法を読むことができます。

Configuration Environments

You have only one application, but whether you realize it or not, you need it to behave differently at different times:

アプリケーションは 1 つしかありませんが、それを認識しているかどうかにかかわらず、さまざまなタイミングで異なる動作をさせる必要があります。
  • While developing, you want to log everything and expose nice debugging tools;
    開発中は、すべてをログに記録し、優れたデバッグ ツールを公開する必要があります。
  • After deploying to production, you want that same application to be optimized for speed and only log errors.
    本番環境にデプロイした後、同じアプリケーションを速度のために最適化し、エラーのみをログに記録したいと考えています。

The files stored in config/packages/ are used by Symfony to configure the application services. In other words, you can change the application behavior by changing which configuration files are loaded. That's the idea of Symfony's configuration environments.

config/packages/ に保存されているファイルは、アプリケーション サービスを設定するために Symfony によって使用されます。つまり、どの設定ファイルをロードするかを変更することで、アプリケーションの動作を変更できます。これが Symfony の設定環境の考え方です。

A typical Symfony application begins with three environments: dev (for local development), prod (for production servers) and test (for automated tests). When running the application, Symfony loads the configuration files in this order (the last files can override the values set in the previous ones):

典型的な Symfony アプリケーションは、dev (ローカル開発用)、prod (本番サーバー用)、および test (自動テスト用) の 3 つの環境から始まります。アプリケーションを実行するとき、Symfony は設定ファイルを次の順序でロードします (最後のファイルは前のファイルで設定された値を上書きできます):
  1. config/packages/*.yaml (and *.xml and *.php files too);
    config/packages/*.yaml (および *.xml および *.php ファイルも);
  2. config/packages/<environment-name>/*.yaml (and *.xml and *.php files too);
    config/packages//*.yaml (および *.xml および *.php ファイルも);
  3. config/services.yaml (and services.xml and services.php files too);
    config/services.yaml (および services.xml と services.php ファイルも);
  4. config/services_<environment-name>.yaml (and services_<environment-name>.xml and services_<environment-name>.php files too).
    config/services_.yaml (および services_.xml および services_.php ファイルも)。

Take the framework package, installed by default, as an example:

例として、デフォルトでインストールされるフレームワーク パッケージを取り上げます。
  • First, config/packages/framework.yaml is loaded in all environments and it configures the framework with some options;
    まず、config/packages/framework.yaml がすべての環境にロードされ、いくつかのオプションでフレームワークが構成されます。
  • In the prod environment, nothing extra will be set as there is no config/packages/prod/framework.yaml file;
    prod 環境では、config/packages/prod/framework.yaml ファイルがないため、追加の設定はありません。
  • In the dev environment, there is no file either ( config/packages/dev/framework.yaml does not exist).
    開発環境では、ファイルもありません (config/packages/dev/framework.yaml は存在しません)。
  • In the test environment, the config/packages/test/framework.yaml file is loaded to override some of the settings previously configured in config/packages/framework.yaml.
    テスト環境では、config/packages/test/framework.yaml ファイルがロードされ、config/packages/framework.yaml で以前に構成された設定の一部が上書きされます。

In reality, each environment differs only somewhat from others. This means that all environments share a large base of common configuration, which is put in files directly in the config/packages/ directory.

実際には、各環境は他の環境とわずかに異なるだけです。これは、すべての環境が共通の構成の大規模なベースを共有し、config/packages/ ディレクトリに infiles を直接配置することを意味します。

Tip

ヒント

You can also define options for different environments in a single configuration file using the special when keyword:

特別な when キーワードを使用して、単一の構成ファイルでさまざまな環境のオプションを定義することもできます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# config/packages/webpack_encore.yaml
webpack_encore:
    # ...
    output_path: '%kernel.project_dir%/public/build'
    strict_mode: true
    cache: false

# cache is enabled only in the "prod" environment
when@prod:
    webpack_encore:
        cache: true

# disable strict mode only in the "test" environment
when@test:
    webpack_encore:
        strict_mode: false

# YAML syntax allows to reuse contents using "anchors" (&some_name) and "aliases" (*some_name).
# In this example, 'test' configuration uses the exact same configuration as in 'prod'
when@prod: &webpack_prod
    webpack_encore:
        # ...
when@test: *webpack_prod

See also

こちらもご覧ください

See the configureContainer() method of the Kernel class to learn everything about the loading order of configuration files.

構成ファイルのロード順序については、Kernel クラスの configureContainer() メソッドを参照してください。

Selecting the Active Environment

Symfony applications come with a file called .env located at the project root directory. This file is used to define the value of environment variables and it's explained in detail later in this article.

Symfony アプリケーションには、projectroot ディレクトリにある .env というファイルが付属しています。このファイルは、環境変数の値を定義するために使用され、この記事の後半で詳しく説明します。

Open the .env file (or better, the .env.local file if you created one) and edit the value of the APP_ENV variable to change the environment in which the application runs. For example, to run the application in production:

.env ファイル (作成した場合は .env.local ファイル) を開き、APP_ENV 変数の値を編集して、アプリケーションが実行される環境を変更します。たとえば、本番環境でアプリケーションを実行するには:
1
2
# .env (or .env.local)
APP_ENV=prod

This value is used both for the web and for the console commands. However, you can override it for commands by setting the APP_ENV value before running them:

この値は、Web コマンドとコンソール コマンドの両方で使用されます。ただし、コマンドを実行する前に APP_ENV 値を設定することで、コマンドをオーバーライドできます。
1
2
3
4
5
# Use the environment defined in the .env file
$ php bin/console command_name

# Ignore the .env file and run this command in production
$ APP_ENV=prod php bin/console command_name

Creating a New Environment

The default three environments provided by Symfony are enough for most projects, but you can define your own environments too. For example, this is how you can define a staging environment where the client can test the project before going to production:

ほとんどのプロジェクトでは、Symfony が提供するデフォルトの 3 つの環境で十分ですが、独自の環境を定義することもできます。たとえば、次のようにして、クライアントが本番環境に移行する前にプロジェクトをテストできるステージング環境を定義できます。
  1. Create a configuration directory with the same name as the environment (in this case, config/packages/staging/);
    環境と同じ名前 (この場合は config/packages/staging/) で構成ディレクトリを作成します。
  2. Add the needed configuration files in config/packages/staging/ to define the behavior of the new environment. Symfony loads the config/packages/*.yaml files first, so you only need to configure the differences to those files;
    config/packages/staging/ に必要な構成ファイルを追加して、新しい環境の動作を定義します。 symfony は config/packages/*.yaml ファイルを最初にロードするので、それらのファイルとの違いを設定するだけで済みます。
  3. Select the staging environment using the APP_ENV env var as explained in the previous section.
    前のセクションで説明したように、APP_ENV 環境変数を使用してステージング環境を選択します。

Tip

ヒント

It's common for environments to be similar to each other, so you can use symbolic links between config/packages/<environment-name>/ directories to reuse the same configuration.

環境が互いに似ていることはよくあることなので、config/packages//directories 間のシンボリック リンクを使用して、同じ構成を再利用できます。

Instead of creating new environments, you can use environment variables as explained in the following section. This way you can use the same application and environment (e.g. prod) but change its behavior thanks to the configuration based on environment variables (e.g. to run the application in different scenarios: staging, quality assurance, client review, etc.)

新しい環境を作成する代わりに、次のセクションで説明するように環境変数を使用できます。この方法では、同じアプリケーションと環境 (例: prod) を使用できますが、環境変数に基づいた構成のおかげでその動作を変更できます (例: さまざまなシナリオでアプリケーションを実行する: ステージング、品質保証、クライアント レビューなど)。

Configuration Based on Environment Variables

Using environment variables (or "env vars" for short) is a common practice to configure options that depend on where the application is run (e.g. the database credentials are usually different in production versus your local machine). If the values are sensitive, you can even encrypt them as secrets.

環境変数 (または略して「env vars」) を使用して、アプリケーションが実行される場所に依存するオプションを構成する一般的な方法です (たとえば、データベースの資格情報は通常、運用環境とローカル マシンで異なります)。機密性の高い値の場合は、シークレットとして暗号化することもできます。

Use the special syntax %env(ENV_VAR_NAME)% to reference environment variables. The values of these options are resolved at runtime (only once per request, to not impact performance) so you can change the application behavior without having to clear the cache.

特殊な構文 %env(ENV_VAR_NAME)% を使用して環境変数を参照します。これらのオプションの値は実行時に解決されるため (パフォーマンスに影響を与えず、要求ごとに 1 回のみ)、キャッシュをクリアすることなくアプリケーションの動作を変更できます。

This example shows how you could configure the database connection using an env var:

この例は、環境変数を使用してデータベース接続を構成する方法を示しています。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
# config/packages/doctrine.yaml
doctrine:
    dbal:
        # by convention the env var names are always uppercase
        url: '%env(resolve:DATABASE_URL)%'
    # ...

See also

こちらもご覧ください

The values of env vars can only be strings, but Symfony includes some env var processors to transform their contents (e.g. to turn a string value into an integer).

env var の値は文字列のみですが、Symfony には env var プロセッサがいくつか含まれており、その内容を変換します (たとえば、文字列値を整数に変換します)。

To define the value of an env var, you have several options:

環境変数の値を定義するには、いくつかのオプションがあります。
  • Add the value to a .env file;
    値を .env ファイルに追加します。
  • Encrypt the value as a secret;
    値をシークレットとして暗号化します。
  • Set the value as a real environment variable in your shell or your web server.
    シェルまたは Web サーバーで実際の環境変数として値を設定します。

Tip

ヒント

Some hosts - like SymfonyCloud - offer easy utilities to manage env vars in production.

一部のホスト (SymfonyCloud など) は、本番環境の環境変数を管理するための簡単なユーティリティを提供します。

Note

ノート

Some configuration features are not compatible with env vars. For example, defining some container parameters conditionally based on the existence of another configuration option. When using an env var, the configuration option always exists, because its value will be null when the related env var is not defined.

一部の構成機能は、環境変数と互換性がありません。たとえば、別の構成オプションの存在に基づいて、いくつかのコンテナー パラメーターを条件付きで定義します。環境変数を使用する場合、関連する環境変数が定義されていない場合、その値は null になるため、構成はオプションとして存在します。

Caution

注意

Beware that dumping the contents of the $_SERVER and $_ENV variables or outputting the phpinfo() contents will display the values of the environment variables, exposing sensitive information such as the database credentials.

$_SERVER および $_ENV 変数の内容をダンプしたり、phpinfo() の内容を出力したりすると、環境変数の値が表示され、データベース資格情報などの機密情報が公開されることに注意してください。

The values of the env vars are also exposed in the web interface of the Symfony profiler. In practice this shouldn't be a problem because the web profiler must never be enabled in production.

環境変数の値は、Symfony プロファイラーの Web インターフェースでも公開されます。 Web プロファイラーは本番環境で有効にしてはならないため、実際にはこれが問題になることはありません。

Configuring Environment Variables in .env Files

Instead of defining env vars in your shell or your web server, Symfony provides a convenient way to define them inside a .env (with a leading dot) file located at the root of your project.

シェルまたは Web サーバーで環境変数を定義する代わりに、Symfony は、プロジェクトのルートにある .env (先頭にドットがある) ファイル内で環境変数を定義する便利な方法を提供します。

The .env file is read and parsed on every request and its env vars are added to the $_ENV & $_SERVER PHP variables. Any existing env vars are never overwritten by the values defined in .env, so you can combine both.

.env ファイルはリクエストごとに読み取られて解析され、その環境変数が $_ENV および $_SERVER PHP 変数に追加されます。既存の環境変数は、.env で定義された値によって上書きされることはないため、両方を組み合わせることができます。

For example, to define the DATABASE_URL env var shown earlier in this article, you can add:

たとえば、この記事で前に示した DATABASE_URL 環境変数を定義するには、次を追加できます。
1
2
# .env
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"

This file should be committed to your repository and (due to that fact) should only contain "default" values that are good for local development. This file should not contain production values.

このファイルはリポジトリにコミットする必要があり、(そのため) ローカル開発に適した「デフォルト」値のみを含める必要があります。このファイルには製品値を含めないでください。

In addition to your own env vars, this .env file also contains the env vars defined by the third-party packages installed in your application (they are added automatically by Symfony Flex when installing packages).

独自の環境変数に加えて、この .env ファイルには、アプリケーションにインストールされたサードパーティ パッケージによって定義された環境変数も含まれています (これらは、パッケージのインストール時に Symfony Flex によって自動的に追加されます)。

Tip

ヒント

Since the .env file is read and parsed on every request, you don't need to clear the Symfony cache or restart the PHP container if you're using Docker.

.env ファイルはリクエストごとに読み取られて解析されるため、Docker を使用している場合は、Symfony キャッシュをクリアしたり、PHP コンテナーを再起動したりする必要はありません。

.env File Syntax

Add comments by prefixing them with #:

先頭に # を付けてコメントを追加します。
1
2
3
# database credentials
DB_USER=root
DB_PASS=pass # this is the secret password

Use environment variables in values by prefixing variables with $:

変数の前に $ を付けて、値に環境変数を使用します。
1
2
DB_USER=root
DB_PASS=${DB_USER}pass # include the user as a password prefix

Caution

注意

The order is important when some env var depends on the value of other env vars. In the above example, DB_PASS must be defined after DB_USER. Moreover, if you define multiple .env files and put DB_PASS first, its value will depend on the DB_USER value defined in other files instead of the value defined in this file.

一部の環境変数が他の環境変数の値に依存する場合、順序は重要です。上記の例では、DB_USER の後に DB_PASS を定義する必要があります。さらに、複数の .env ファイルを定義して DB_PASS を最初に配置すると、その値は、このファイルで定義された値ではなく、他のファイルで定義された DB_USER の値に依存します。

Define a default value in case the environment variable is not set:

環境変数が設定されていない場合のデフォルト値を定義します。
1
2
DB_USER=
DB_PASS=${DB_USER:-root}pass # results in DB_PASS=rootpass

Embed commands via $() (not supported on Windows):

$() 経由でコマンドを埋め込む (Windows ではサポートされていません):
1
START_TIME=$(date)

Caution

注意

Using $() might not work depending on your shell.

$() の使用は、シェルによっては機能しない場合があります。

Tip

ヒント

As a .env file is a regular shell script, you can source it in your own shell scripts:

.env ファイルは通常のシェル スクリプトであるため、独自のシェル スクリプトでソースとして使用できます。
1
$ source .env

Overriding Environment Values via .env.local

If you need to override an environment value (e.g. to a different value on your local machine), you can do that in a .env.local file:

環境値をオーバーライドする必要がある場合 (たとえば、ローカル マシンの別の値に)、.env.local ファイルでそれを行うことができます。
1
2
# .env.local
DATABASE_URL="mysql://root:@127.0.0.1:3306/my_database_name"

This file should be ignored by git and should not be committed to your repository. Several other .env files are available to set environment variables in just the right situation:

このファイルは git によって無視されるべきであり、リポジトリにコミットされるべきではありません。適切な状況で環境変数を設定するために、いくつかの他の .env ファイルが利用可能です:
  • .env: defines the default values of the env vars needed by the application;
    .env: アプリケーションが必要とする環境変数のデフォルト値を定義します。
  • .env.local: overrides the default values for all environments but only on the machine which contains the file. This file should not be committed to the repository and it's ignored in the test environment (because tests should produce the same results for everyone);
    .env.local: すべての環境のデフォルト値をオーバーライドしますが、ファイルが含まれるマシンでのみオーバーライドします。このファイルはリポジトリにコミットするべきではなく、テスト環境では無視されます (テストは全員に対して同じ結果を生成する必要があるため)。
  • .env.<environment> (e.g. .env.test): overrides env vars only for one environment but for all machines (these files are committed);
    .env。 (例: .env.test): 1 つの環境に対してのみ、すべてのマシンに対して環境変数をオーバーライドします (これらのファイルはコミットされます)。
  • .env.<environment>.local (e.g. .env.test.local): defines machine-specific env var overrides only for one environment. It's similar to .env.local, but the overrides only apply to one environment.
    .env..local (例: .env.test.local): 1 つの環境に対してのみ、マシン固有の環境変数オーバーライドを定義します。 .env.local に似ていますが、オーバーライドは 1 つの環境にのみ適用されます。

Real environment variables always win over env vars created by any of the .env files.

実際の環境変数は、.env ファイルによって作成された環境変数よりも優先されます。

The .env and .env.<environment> files should be committed to the repository because they are the same for all developers and machines. However, the env files ending in .local (.env.local and .env.<environment>.local) should not be committed because only you will use them. In fact, the .gitignore file that comes with Symfony prevents them from being committed.

.env と .env.ファイルはすべての開発者とマシンで同じであるため、リポジトリにコミットする必要があります。ただし、.local で終わる env ファイル (.env.local および .env..local) はコミットしないでください。使用するのは自分だけです。実際、Symfony に付属の .gitignore ファイルは、それらがコミットされるのを防ぎます。

Configuring Environment Variables in Production

In production, the .env files are also parsed and loaded on each request. So the easiest way to define env vars is by creating a .env.local file on your production server(s) with your production values.

本番環境では、リクエストごとに .env ファイルも解析およびロードされます。したがって、env 変数を定義する最も簡単な方法は、運用サーバー上に運用値を使用して .env.local ファイルを作成することです。

To improve performance, you can optionally run the dump-env command (available in Symfony Flex 1.2 or later):

パフォーマンスを向上させるために、必要に応じて dump-env コマンドを実行できます (Symfony Flex 1.2 以降で利用可能):
1
2
# parses ALL .env files and dumps their final values to .env.local.php
$ composer dump-env prod

After running this command, Symfony will load the .env.local.php file to get the environment variables and will not spend time parsing the .env files.

このコマンドを実行した後、Symfony は .env.local.php ファイルをロードして環境変数を取得し、.env ファイルの解析に時間を費やすことはありません。

Tip

ヒント

Update your deployment tools/workflow to run the dump-env command after each deploy to improve the application performance.

展開ツール/ワークフローを更新して、展開のたびに dump-env コマンドを実行し、アプリケーションのパフォーマンスを向上させます。

Encrypting Environment Variables (Secrets)

Instead of defining a real environment variable or adding it to a .env file, if the value of a variable is sensitive (e.g. an API key or a database password), you can encrypt the value using the secrets management system.

実際の環境変数を定義したり、.env ファイルに追加したりする代わりに、変数の値が機密情報 (API キーやデータベース パスワードなど) である場合は、シークレット管理システムを使用して値を暗号化できます。

Listing Environment Variables

Use the debug:dotenv command to understand how Symfony parses the different .env files to set the value of each environment variable:

debug:dotenv コマンドを使用して、Symfony が異なる .env ファイルを解析して各環境変数の値を設定する方法を理解します。
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
$ php bin/console debug:dotenv

Dotenv Variables & Files
========================

Scanned Files (in descending priority)
--------------------------------------

* ⨯ .env.local.php
* ⨯ .env.dev.local
* ✓ .env.dev
* ⨯ .env.local
* ✓ .env

Variables
---------

---------- ------- ---------- ------
 Variable   Value   .env.dev   .env
---------- ------- ---------- ------
 FOO        BAR     n/a        BAR
 ALICE      BOB     BOB        bob
---------- ------- ---------- ------

# look for a specific variable passing its full or partial name as an argument
$ php bin/console debug:dotenv foo

6.2

6.2

The option to pass variable names to debug:dotenv was introduced in Symfony 6.2.

変数名を debug:dotenv に渡すオプションは、Symfony 6.2 で導入されました。

Additionally, and regardless of how you set environment variables, you can see all environment variables, with their values, referenced in Symfony's container configuration:

さらに、環境変数の設定方法に関係なく、Symfony のコンテナー構成で参照されているすべての環境変数とその値を確認できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ php bin/console debug:container --env-vars

---------------- ----------------- ---------------------------------------------
 Name             Default value     Real value
---------------- ----------------- ---------------------------------------------
 APP_SECRET       n/a               "471a62e2d601a8952deb186e44186cb3"
 FOO              "[1, "2.5", 3]"   n/a
 BAR              null              n/a
---------------- ----------------- ---------------------------------------------

# you can also filter the list of env vars by name:
$ php bin/console debug:container --env-vars foo

# run this command to show all the details for a specific env var:
$ php bin/console debug:container --env-var=FOO

Accessing Configuration Parameters

Controllers and services can access all the configuration parameters. This includes both the parameters defined by yourself and the parameters created by packages/bundles. Run the following command to see all the parameters that exist in your application:

コントローラーとサービスは、すべての構成パラメーターにアクセスできます。これには、自分で定義したパラメーターと、パッケージ/バンドルによって作成されたパラメーターの両方が含まれます。次のコマンドを実行して、アプリケーションに存在するすべてのパラメーターを表示します。
1
$ php bin/console debug:container --parameters

In controllers extending from the AbstractController, use the getParameter() helper:

AbstractController から拡張されたコントローラーでは、getParameter() ヘルパーを使用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Controller/UserController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class UserController extends AbstractController
{
    // ...

    public function index(): Response
    {
        $projectDir = $this->getParameter('kernel.project_dir');
        $adminEmail = $this->getParameter('app.admin_email');

        // ...
    }
}

In services and controllers not extending from AbstractController, inject the parameters as arguments of their constructors. You must inject them explicitly because service autowiring doesn't work for parameters:

AbstractController から拡張されていないサービスとコントローラーでは、コンストラクターの引数としてパラメーターを挿入します。サービスの自動配線はパラメーターに対して機能しないため、明示的に注入する必要があります。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
# config/services.yaml
parameters:
    app.contents_dir: '...'

services:
    App\Service\MessageGenerator:
        arguments:
            $contentsDir: '%app.contents_dir%'

If you inject the same parameters over and over again, use the services._defaults.bind option instead. The arguments defined in that option are injected automatically whenever a service constructor or controller action defines an argument with that exact name. For example, to inject the value of the kernel.project_dir parameter whenever a service/controller defines a $projectDir argument, use this:

同じパラメーターを何度も挿入する場合は、代わりに services._defaults.bind オプションを使用してください。そのオプションで定義された引数は、サービス コンストラクターまたはコントローラー アクションがその正確な名前で引数を定義するたびに自動的に注入されます。たとえば、サービス/コントローラーが $projectDir 引数を定義するたびに、kernel.project_dir パラメーターの値を挿入するには、次のようにします。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
# config/services.yaml
services:
    _defaults:
        bind:
            # pass this value to any $projectDir argument for any service
            # that's created in this file (including controller arguments)
            $projectDir: '%kernel.project_dir%'

    # ...

See also

こちらもご覧ください

Read the article about binding arguments by name and/or type to learn more about this powerful feature.

この強力な機能の詳細については、名前や型による引数のバインドに関する記事をお読みください。

Finally, if some service needs access to lots of parameters, instead of injecting each of them individually, you can inject all the application parameters at once by type-hinting any of its constructor arguments with the ContainerBagInterface:

最後に、一部のサービスが多数のパラメーターにアクセスする必要がある場合、それぞれを個別に注入するのではなく、ContainerBagInterface でコンストラクター引数のいずれかを型ヒントすることで、すべてのアプリケーション パラメーターを一度に注入できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// src/Service/MessageGenerator.php
namespace App\Service;

// ...

use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ContainerBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        // get any container parameter from $this->params, which stores all of them
        $sender = $this->params->get('mailer_sender');
        // ...
    }
}

Using PHP ConfigBuilders

Writing PHP config is sometimes difficult because you end up with large nested arrays and you have no autocompletion help from your favorite IDE. A way to address this is to use "ConfigBuilders". They are objects that will help you build these arrays.

入れ子になった配列が大きくなり、お気に入りの IDE からオートコンプリートのヘルプが得られないため、PHP 構成を記述するのが難しい場合があります。これに対処する方法は、「ConfigBuilders」を使用することです。これらは、これらの配列を構築するのに役立つオブジェクトです。

Symfony generates the ConfigBuilder classes automatically in the kernel build directory for all the bundles installed in your application. By convention they all live in the namespace Symfony\Config:

symfony は、アプリケーションにインストールされているすべてのバンドルのカーネル ビルド ディレクトリに ConfigBuilder クラスを自動的に生成します。慣例により、それらはすべて名前空間 Symfony\Config に存在します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// config/packages/security.php
use Symfony\Config\SecurityConfig;

return static function (SecurityConfig $security) {
    $security->firewall('main')
        ->pattern('^/*')
        ->lazy(true)
        ->anonymous();

    $security
        ->roleHierarchy('ROLE_ADMIN', ['ROLE_USER'])
        ->roleHierarchy('ROLE_SUPER_ADMIN', ['ROLE_ADMIN', 'ROLE_ALLOWED_TO_SWITCH'])
        ->accessControl()
            ->path('^/user')
            ->role('ROLE_USER');

    $security->accessControl(['path' => '^/admin', 'roles' => 'ROLE_ADMIN']);
};

Note

ノート

Only root classes in the namespace Symfony\Config are ConfigBuilders. Nested configs (e.g. \Symfony\Config\Framework\CacheConfig) are regular PHP objects which aren't autowired when using them as an argument type.

名前空間 Symfony\Config のルート クラスのみが ConfigBuilders です。ネストされた構成 (例: \Symfony\Config\Framework\CacheConfig) は、引数の型として使用するときに自動配線されない通常の PHP オブジェクトです。

Keep Going!

Congratulations! You've tackled the basics of Symfony. Next, learn about each part of Symfony individually by following the guides. Check out:

おめでとう! Symfony の基本に取り組みました。次に、ガイドに従って、Symfony の各部分について個別に学習します。チェックアウト:

And all the other topics related to configuration:

構成に関連する他のすべてのトピック: