原文:the symfony Reference Book, http://www.symfony-project.org/reference/1_2/en/03-Configuration-Files-Principles
翻译:ELEME Dev Team
symfony 所有的的配置文件都基于一套共同的原则,并使用一些公共属性。本节将详细地介绍这些原则和属性,并且可为后面几个关于YAML配置文件的章节提供参考。
缓存
symfony 的配置处理类会将所有的配置文件缓存为 PHP 文件。当 is_debug 属性设置为 false 时 (例如在 prod 环境中,即生产环境),symfony 仅会在首次请求中对配置文件进行缓存处理,而在这之后的所有请求都将访问相应的 PHP 缓存文件。对 YAML 文件的解析是一个较“重”的处理过程,缓存机制使得这个过程只执行一次。
在
dev环境(即开发环境)下,is_debug属性默认设置为true,symfony 将在每一次配置变化后重新分析处理缓存(symfony 会检查文件的修改时间)。
可以通过 config_handler.yml 文件来配置解析和处理配置文件所需的配置处理类(configuration handler class)。
在以下各节中,我们称 symfony 将 YAML 文件转化为 PHP 文件并存储在缓存中的这一过程为“编译”。
要强制清空配置缓存可以使用
cache:clear命令:$ php symfony cache:clear --type=config
常量
配置文件 : core_compile.yml , factories.yml , generator.yml , databases.yml , filters.yml , view.yml , autoload.yml
一些配置文件允许使用预先定义的常量。symfony 通过占位符来使用常量,即在大写的常量名两侧加上“%”符号,类似于“%XXX%”。当配置文件被编译时,symfony 会用常量的实值去替换掉所有相应的占位符。
使用配置文件中的常量
settings.yml 中定义的任何设置都可以作为常量来使用。其占位符为大写的设置名称并在开头加上 SF_:
logging: %SF_LOGGING_ENABLED%
当 symfony 编译配置文件时,它会从 settings.yml 文件中读取常量的值并替换掉占位符。在上面的例子中,symfony 会在 settings.yml 中查找 logging_enabled 这一设置,并用其值来替换占位符 SF_LOGGING_ENABLED。
使用应用程序设置文件中的常量
与使用 settings.yml 文件中的常量类似,可以通过添加 APP_ 的前缀来使用 app.yml 中的设置。
特殊常量
默认情况下, symfony 根据当前的前端控制器定义了四个常量:
| 常量 | 描述 | 配置方法 |
|---|---|---|
SF_APP |
当前应用程序名称 | getApplication() |
SF_ENVIRONMENT |
当前环境名称 | getEnvironment() |
SF_DEBUG |
是否启用调试 | isDebug() |
SF_SYMFONY_LIB_DIR |
symfony 库目录 | getSymfonyLibDir() |
文件和目录
当你需要引用一个文件或目录地址时,使用常量而不是硬编码是个很不错的主意。symfony 已经为一些公共目录定义了对应的常量。
SF_ROOT_DIR 对应于 symfony 目录树中的根目录,其余所有目录变量都通过这一变量产生。
项目目录结构的常量定义如下:
| 常量 | 默认值 |
|---|---|
SF_APPS_DIR |
SF_ROOT_DIR/apps |
SF_CONFIG_DIR |
SF_ROOT_DIR/config |
SF_CACHE_DIR |
SF_ROOT_DIR/cache |
SF_DATA_DIR |
SF_ROOT_DIR/data |
SF_DOC_DIR |
SF_ROOT_DIR/doc |
SF_LIB_DIR |
SF_ROOT_DIR/lib |
SF_LOG_DIR |
SF_ROOT_DIR/log |
SF_PLUGINS_DIR |
SF_ROOT_DIR/plugins |
SF_TEST_DIR |
SF_ROOT_DIR/test |
SF_WEB_DIR |
SF_ROOT_DIR/web |
SF_UPLOAD_DIR |
SF_WEB_DIR/uploads |
应用程序目录结构是根据 SF_APPS_DIR/APP_NAME 所定义的:
| 常量 | 默认值 |
|---|---|
SF_APP_CONFIG_DIR |
SF_APP_DIR/config |
SF_APP_LIB_DIR |
SF_APP_DIR/lib |
SF_APP_MODULE_DIR |
SF_APP_DIR/modules |
SF_APP_TEMPLATE_DIR |
SF_APP_DIR/templates |
SF_APP_I18N_DIR |
SF_APP_DIR/i18n |
最后,应用程序的缓存目录结构定义如下:
| 常量 | 默认值 |
|---|---|
SF_APP_BASE_CACHE_DIR |
SF_CACHE_DIR/APP_NAME |
SF_APP_CACHE_DIR |
SF_CACHE_DIR/APP_NAME/ENV_NAME |
SF_TEMPLATE_CACHE_DIR |
SF_APP_CACHE_DIR/template |
SF_I18N_CACHE_DIR |
SF_APP_CACHE_DIR/i18n |
SF_CONFIG_CACHE_DIR |
SF_APP_CACHE_DIR/config |
SF_TEST_CACHE_DIR |
SF_APP_CACHE_DIR/test |
SF_MODULE_CACHE_DIR |
SF_APP_CACHE_DIR/modules |
环境
配置文件 : settings.yml , factories.yml , databases.yml , app.yml
某些配置文件与 symfony 的当前环境有关。这些文件通过划分不同的区段,为每个环境设置不同的配置。当创建一个新的应用时,symfony 会创建三个默认的环境:prod(生产环境),test(测试环境),和 dev(开发环境):
prod: # `prod` 环境的配置 test: # `test` 环境的配置 dev: # `dev` 环境的配置 all: # 所有环境公用的默认配置
all 区段为所有的环境提供默认设置。当 symfony 从配置文件中读取一个设置时,它会优先使用相应环境区段中的配置,若当前环境区段中没有提供该设置,则 symfony 会在 all 区段去寻找它。
配置的级联
配置文件 : core_compile.yml , autoload.yml , settings.yml , factories.yml , databases.yml , security.yml , cache.yml , app.yml , filters.yml , view.yml
有时候,同一个配置文件可以在几个不同的 config 目录多次出现,symfony 会按照目录结构合并它们。
symfony 在编译配置文件的时候,会根据以下顺序先后合并多个文件中的配置信息:
- 模块配置(
PROJECT_ROOT_DIR/apps/APP_NAME/modules/MODULE_NAME/config/XXX.yml) - 应用程序配置(
PROJECT_ROOT_DIR/apps/APP_NAME/config/XXX.yml) - 项目配置(
PROJECT_ROOT_DIR/config/XXX.yml) - 插件配置(
PROJECT_ROOT_DIR/plugins/*/config/XXX.yml) - symfony 库配置(
SF_LIB_DIR/config/XXX.yml)
例如,在一个应用程序目录中定义的 settings.yml 将默认继承这个应用程序所在项目的 config 目录中 settings.yml 的配置信息,而项目的 settings.yml 又是继承自 symfony 框架的默认 settings.yml 配置文件中的配置信息(lib/config/config/settings.yml)。
当一个配置文件与环境相关,并在多个目录中,那么则按照下面给出的优先级来合并配置:
- 模块
- 应用程序
- 项目
- 特定环境
- 所有环境
- 默认值