How to Override Symfony's default Directory Structure

Symfony applications have the following default directory structure, but you can override it to create your own structure:

Symfony アプリケーションには次のデフォルトのディレクトリ構造がありますが、それをオーバーライドして独自の構造を作成できます:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
your-project/
├─ assets/
├─ bin/
│  └─ console
├─ config/
├─ public/
│  └─ index.php
├─ src/
│  └─ ...
├─ templates/
├─ tests/
├─ translations/
├─ var/
│  ├─ cache/
│  ├─ log/
│  └─ ...
├─ vendor/
└─ .env

Override the Environment (DotEnv) Files Directory

By default, the .env configuration file is located at the root directory of the project. If you store it in a different location, define the runtime.dotenv_path option in the composer.json file:

デフォルトでは、.env 構成ファイルはプロジェクトのルート ディレクトリにあります。別の場所に保存する場合は、composer.json ファイルで runtime.dotenv_path オプションを定義します。
1
2
3
4
5
6
7
8
9
{
    "...": "...",
    "extra": {
        "...": "...",
        "runtime": {
            "dotenv_path": "my/custom/path/to/.env"
        }
    }
}

Then, update your Composer files (running composer dump-autoload, for instance), so that the vendor/autoload_runtime.php files gets regenerated with the new .env path.

次に、Composer ファイルを更新して (たとえば、composer dump-autoload を実行して)、vendor/autoload_runtime.php ファイルが new.env パスで再生成されるようにします。

You can also set up different .env paths for your console and web server calls. Edit the public/index.php and/or bin/console files to define the new file path.

コンソールと Web サーバーの呼び出しに異なる .env パスを設定することもできます。 public/index.php および/または bin/console ファイルを編集して、新しいファイル パスを定義します。

Console script:

コンソール スクリプト:
1
2
3
4
5
6
7
// bin/console

// ...
$_SERVER['APP_RUNTIME_OPTIONS']['dotenv_path'] = 'some/custom/path/to/.env';

require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
// ...

Web front-controller:

Web フロントコントローラー:
1
2
3
4
5
6
7
// public/index.php

// ...
$_SERVER['APP_RUNTIME_OPTIONS']['dotenv_path'] = 'another/custom/path/to/.env';

require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
// ...

Override the Configuration Directory

The configuration directory is the only one which cannot be overridden in a Symfony application. Its location is hardcoded as the config/ directory at your project root directory.

構成ディレクトリは、Symfony アプリケーションでオーバーライドできない唯一のディレクトリです。その場所は、プロジェクトのルート ディレクトリの config/ ディレクトリとしてハードコーディングされています。

Override the Cache Directory

Changing the cache directory can be achieved by overriding the getCacheDir() method in the Kernel class of your application:

キャッシュ ディレクトリを変更するには、アプリケーションの Kernel クラスで getCacheDir() メソッドをオーバーライドします。
1
2
3
4
5
6
7
8
9
10
11
12
// src/Kernel.php

// ...
class Kernel extends BaseKernel
{
    // ...

    public function getCacheDir(): string
    {
        return dirname(__DIR__).'/var/'.$this->environment.'/cache';
    }
}

In this code, $this->environment is the current environment (i.e. dev). In this case you have changed the location of the cache directory to var/{environment}/cache/.

このコードでは、$this->environment が現在の環境 (つまり dev) です。この場合、キャッシュ ディレクトリの場所を var/{environment}/cache/ に変更しました。

You can also change the cache directory defining an environment variable named APP_CACHE_DIR whose value is the full path of the cache folder.

値がキャッシュ フォルダーのフル パスである APP_CACHE_DIR という名前の環境変数を定義するキャッシュ ディレクトリを変更することもできます。

Caution

注意

You should keep the cache directory different for each environment, otherwise some unexpected behavior may happen. Each environment generates its own cached configuration files, and so each needs its own directory to store those cache files.

環境ごとに異なるキャッシュ ディレクトリを保持する必要があります。そうしないと、予期しない動作が発生する可能性があります。各環境は独自のキャッシュ構成ファイルを生成するため、これらのキャッシュ ファイルを格納するために独自のディレクトリが必要です。

Override the Log Directory

Overriding the var/log/ directory is almost the same as overriding the var/cache/ directory.

var/log/ ディレクトリを上書きすることは、var/cache/ ディレクトリを上書きすることとほとんど同じです。

You can do it overriding the getLogDir() method in the Kernel class of your application:

アプリケーションの Kernel クラスの getLogDir() メソッドをオーバーライドして実行できます。
1
2
3
4
5
6
7
8
9
10
11
12
// src/Kernel.php

// ...
class Kernel extends BaseKernel
{
    // ...

    public function getLogDir(): string
    {
        return dirname(__DIR__).'/var/'.$this->environment.'/log';
    }
}

Here you have changed the location of the directory to var/{environment}/log/.

ここで、ディレクトリの場所を var/{environment}/log/ に変更しました。

You can also change the log directory defining an environment variable named APP_LOG_DIR whose value is the full path of the log folder.

値がログ フォルダーのフル パスである APP_LOG_DIR という名前の環境変数を定義するログ ディレクトリを変更することもできます。

Override the Templates Directory

If your templates are not stored in the default templates/ directory, use the twig.default_path configuration option to define your own templates directory (use twig.paths for multiple directories):

テンプレートがデフォルトの templates/ ディレクトリに保存されていない場合は、twig.default_path 構成オプションを使用して、独自のテンプレート ディレクトリを定義します (複数のディレクトリには twig.paths を使用します)。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
# config/packages/twig.yaml
twig:
    # ...
    default_path: "%kernel.project_dir%/resources/views"

Override the Translations Directory

If your translation files are not stored in the default translations/ directory, use the framework.translator.default_path configuration option to define your own translations directory (use framework.translator.paths for multiple directories):

翻訳ファイルがデフォルトの翻訳/ディレクトリに保存されていない場合は、framework.translator.default_path 構成オプションを使用して、独自の翻訳ディレクトリを定義します (複数のディレクトリにはframework.translator.paths を使用します)。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
# config/packages/translation.yaml
framework:
    translator:
        # ...
        default_path: "%kernel.project_dir%/i18n"

Override the Public Directory

If you need to rename or move your public/ directory, the only thing you need to guarantee is that the path to the vendor/ directory is still correct in your index.php front controller. If you renamed the directory, you're fine. But if you moved it in some way, you may need to modify these paths inside those files:

public/ ディレクトリの名前を変更または移動する必要がある場合、保証する必要があるのは、index.php フロント コントローラーで vendor/ ディレクトリへのパスが正しいことだけです。ディレクトリの名前を変更した場合は問題ありませんが、何らかの方法で移動した場合は、これらのファイル内のパスを変更する必要がある場合があります。
1
require_once __DIR__.'/../path/to/vendor/autoload.php';

You also need to change the extra.public-dir option in the composer.json file:

composer.json ファイルの extra.public-dir オプションも変更する必要があります。
1
2
3
4
5
6
7
{
    "...": "...",
    "extra": {
        "...": "...",
        "public-dir": "my_new_public_dir"
    }
}

Tip

ヒント

Some shared hosts have a public_html/ web directory root. Renaming your web directory from public/ to public_html/ is one way to make your Symfony project work on your shared host. Another way is to deploy your application to a directory outside of your web root, delete your public_html/ directory, and then replace it with a symbolic link to the public/ dir in your project.

一部の共有ホストには public_html/ web ディレクトリ ルートがあります。 Web ディレクトリの名前を public/ から public_html/ に変更することは、共有ホストで Symfony プロジェクトを機能させる 1 つの方法です。もう 1 つの方法は、Web ルート以外のディレクトリにアプリケーションをデプロイし、public_html/ ディレクトリを削除してから、プロジェクトの public/ ディレクトリへのシンボリック リンクに置き換えることです。

Override the Vendor Directory

To override the vendor/ directory, you need to define the vendor-dir option in your composer.json file like this:

vendor/ ディレクトリをオーバーライドするには、次のように composer.json ファイルで vendor-diroption を定義する必要があります。
1
2
3
4
5
6
{
    "config": {
        "bin-dir": "bin",
        "vendor-dir": "/some/dir/vendor"
    }
}

Tip

ヒント

This modification can be of interest if you are working in a virtual environment and cannot use NFS - for example, if you're running a Symfony application using Vagrant/VirtualBox in a guest operating system.

この変更は、仮想環境で作業していて NFS を使用できない場合に役立ちます。たとえば、ゲスト オペレーティング システムで Vagrant/VirtualBox を使用して Symfony アプリケーションを実行している場合などです。