如何覆盖 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 应用程序),则此修改可能很有意义。