跳到内容

如何覆盖 Symfony 的默认目录结构

编辑此页

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

覆盖环境 (.Env) 文件目录

默认情况下,.env 配置文件位于项目的根目录。如果将其存储在不同的位置,请在 composer.json 文件中定义 runtime.dotenv_path 选项

1
2
3
4
5
6
7
8
9
{
    "...": "...",
    "extra": {
        "...": "...",
        "runtime": {
            "dotenv_path": "my/custom/path/to/.env"
        }
    }
}

然后,更新你的 Composer 文件(例如,运行 composer dump-autoload),以便使用新的 .env 路径重新生成 vendor/autoload_runtime.php 文件。

你还可以为你的控制台和 Web 服务器调用设置不同的 .env 路径。编辑 public/index.php 和/或 bin/console 文件以定义新的文件路径。

控制台脚本

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 前端控制器

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';
// ...

覆盖配置目录

配置目录是 Symfony 应用程序中唯一无法覆盖的目录。它的位置被硬编码为项目根目录下的 config/ 目录。

覆盖缓存目录

可以通过覆盖应用程序的 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';
    }
}

在此代码中,$this->environment 是当前环境(即 dev)。在本例中,你已将缓存目录的位置更改为 var/{environment}/cache/

你还可以通过定义一个名为 APP_CACHE_DIR 的环境变量来更改缓存目录,该变量的值是缓存文件夹的完整路径。

警告

你应该为每个环境保持不同的缓存目录,否则可能会发生一些意外行为。每个环境都会生成自己的缓存配置文件,因此每个环境都需要自己的目录来存储这些缓存文件。

覆盖日志目录

覆盖 var/log/ 目录与覆盖 var/cache/ 目录几乎相同。

你可以通过覆盖应用程序的 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';
    }
}

在这里,你已将目录的位置更改为 var/{environment}/log/

你还可以通过定义一个名为 APP_LOG_DIR 的环境变量来更改日志目录,该变量的值是日志文件夹的完整路径。

覆盖模板目录

如果你的模板未存储在默认的 templates/ 目录中,请使用 twig.default_path 配置选项来定义你自己的模板目录(对于多个目录,请使用 twig.paths

1
2
3
4
# config/packages/twig.yaml
twig:
    # ...
    default_path: "%kernel.project_dir%/resources/views"

覆盖翻译目录

如果你的翻译文件未存储在默认的 translations/ 目录中,请使用 framework.translator.default_path 配置选项来定义你自己的翻译目录(对于多个目录,请使用 framework.translator.paths

1
2
3
4
5
# config/packages/translation.yaml
framework:
    translator:
        # ...
        default_path: "%kernel.project_dir%/i18n"

覆盖 Public 目录

如果你需要重命名或移动你的 public/ 目录,你需要保证的唯一事情是 vendor/ 目录的路径在你的 index.php 前端控制器中仍然正确。如果你重命名了目录,那就没问题。但是,如果你以某种方式移动了它,你可能需要修改这些文件中的路径

1
require_once __DIR__.'/../path/to/vendor/autoload_runtime.php';

你还需要更改 composer.json 文件中的 extra.public-dir 选项

1
2
3
4
5
6
7
{
    "...": "...",
    "extra": {
        "...": "...",
        "public-dir": "my_new_public_dir"
    }
}

提示

一些共享主机具有 public_html/ Web 目录根目录。将你的 Web 目录从 public/ 重命名为 public_html/ 是使你的 Symfony 项目在共享主机上工作的一种方法。另一种方法是将你的应用程序部署到 Web 根目录之外的目录,删除你的 public_html/ 目录,然后将其替换为指向你的项目中的 public/ 目录的符号链接。

覆盖 Vendor 目录

要覆盖 vendor/ 目录,你需要在你的 composer.json 文件中定义 vendor-dir 选项,如下所示

1
2
3
4
5
6
{
    "config": {
        "bin-dir": "bin",
        "vendor-dir": "/some/dir/vendor"
    }
}

提示

如果你在虚拟环境中工作并且无法使用 NFS(例如,如果你在 guest 操作系统中使用 Vagrant/VirtualBox 运行 Symfony 应用程序),则此修改可能很有意义。

这项工作,包括代码示例,已获得 Creative Commons BY-SA 3.0 许可协议的许可。
目录
    版本