为了简单和易用,symfony给出了一些满足常规应用大多数普通需求的约定而无需修改代码。使用这些简单但强大的配置文件几乎能够定制任何需求,使用这些文件,你能够为你的应用添加特殊参数。
接下来将说明配置系统是如何干活的^_^ :
l Symfony配置写作YAML格式,当然你也可以选择其他格式(INI,XML)
l 配置可以在项目层、应用层以及模块层定义
l 可以定义几组配置,在symfony中成为环境(environment)
l 定义的值对于项目中的PHP代码可用(available)
l 另外,symfony允许在YAML文件中使用PHP代码,这使得配置系统更加灵活
YAML语法与symfony约定
Symfony配置默认使用YAML(呀迈偶)格式。YAML通过缩进来反映结构而且书写很快。但一定要记住,不要使用tab缩进,用空格代替。
如果参数是字符串或者是以空格开始或结束,那么就用单引号(’)括起来。
如果字符串参数包含了特殊字符也要用单引号括起来
错误提示1: This field is compulsory 错误提示2: ' This field is compulsory ' 错误提示3: 'Don''t leave this field blank' # Single quotes must be doubled |
可以使用>和|加上缩进在多行定义一个长字符串
# 折叠风格,介绍 > # 每一换行将变为一个空格 # 增加可读性 accomplishment: > Mark set a major league home run record in 1998.
# 书面格式,介绍 | # 缩进将不在结果中显示 stats: | 65 Home Runs 0.278 Batting Average |
如果定义的值是数组则需要用方括号包起来或者使用-扩展
# 短语法格式 players: [ Mark McGwire, Sammy Sosa, Ken Griffey ]
# 扩展语法格式 players: - Mark McGwire - Sammy Sosa - Ken Griffey |
键值对数组使用大括号包起来,每一对格式 key: value,记得在:后加上一个以上的空格,扩展格式需要缩进
# 错误格式,冒号后没有空格 mail: {webmaster:webmaster@example.com,contact:contact@example.com}
# 格式正确 mail: { webmaster: webmaster@example.com, contact: contact@example.com }
# 扩展格式 mail: webmaster: webmaster@example.com contact: contact@example.com |
布尔类型可以是 on, 1, true; off, 0, false
添加注释以及增加空格控制格式是一种好的书写方式
Symfony有时会将一组参数定义到目录(category),所有目录下的设置都依据分类头进行缩进。目录头只是一个标识,以.(点)开头
all: .general: tax: 19.6
mail: webmaster: webmaster@example.com |
目录头只是标识,可以忽略 |
all: tax: 19.6
mail: webmaster: webmaster@example.com |
几种常见YAML错误
key1:value1 # 冒号后缺少空格 |
all: key1: value1 key2: value2 # 同层次键值对的缩进不一样,多了一个空格 key3: value3 |
message: tell him: go way # 冒号、中括号以及大括号是YAML的保留字符 message: 'tell him: go way' # 这个可以 |
# key: value # 被注释掉了,不会有效 |
key1: value1 key2: value2 key1: value3 # 相同的键多次定义,只有最后定义的有效 |
income: 12,345 # 除非你使用转换,否则值将被当作字符串对待 |
配置文件一览
配置文件分布在不同层,一些会被另外的给覆盖掉,一些只能在特定层被定义。
项目层
在myproject/config目录下能发现如下的配置文件:
l Config.php:这个文件是最先被请求和命令执行的文件。他包含对框架文件的指向,可以修改这些内容以适用不同的安装方式。在这个文件的最后增加define语句将使定义的常量在项目的任何地方都能访问
l Database.yml:在这里定义了访问和链接数据库的信息
l Properties.ini:这个文件包含了一些命令行工具需要的参数,如项目名和远程服务器链接设置等
l Rsync_exclude.txt:文件中定义了不同服务器之间同步时排除的目录
l Schema.yml和propel.ini:他们是propel(symfony的ORM层)使用的数据访问配置文件。他们的作用是使propel库与symfony类和项目数据很好的工作。Schema.yml包含了项目关系数据墨香的表示。Propel.ini是自动生成的,一般无需修改(但数据库引擎定义需要手动更改)
这些文件经常被外部组件和命令行使用,他们需要比任何的YAML校验程序早启动,所以这些文件中的大多不使用YAML格式。
应用层
配置的主要部分就在这里。
前端控制器配置
文件位置:web/index.php
<?php
define('SF_ROOT_DIR', realpath(dirname(__FILE__).'/..')); //项目根目录 define('SF_APP', 'myapp'); //项目中的应用名称 define('SF_ENVIRONMENT', 'prod'); //环境定义(pord、dev或者其他),决定了使用何种配置 define('SF_DEBUG', false); //是否激活调试模式
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
sfContext::getInstance()->getController()->dispatch(); |
定义过应用名(SF_APP: myapp)、环境名(SF_ENVIRONMENT: prod)后,通用配置文件(config.php)被调用,而后分发器工作。
根目录可以在任何位置 |
只有WEB目录下的文件能够被外部访问,前端控制脚本、图片、样式表和JS文件是公开的,除此以外的文件都应该在WEB目录以外——而且可以在任何的地方 项目的非公开文件通过SF_ROOT_DIR来访问,一般地,根目录是WEB目录的上一级。但可以在任何位置,不一定是默认级别。 |
看下面的结构: symfony/ # 非公开区 apps/ batch/ cache/ ... www/ # 公开去 images/ css/ js/ index.php
此时根目录为symfony/目录,因此index.php前端控制只需简单的修改SF_ROOT_DIR的值即可:
define('SF_ROOT_DIR', dirname(__FILE__).'/../symfony'); |
主应用配置
位置:myproject/apps/myapp/config/目录
l App.yml:文件包含了应用特有配置;也就是说,全局变量定义了应用的业务或者应用逻辑细节——那些不存储在数据库中的,比如:税率、邮件地址经常的保存在这里,默认是空的
l Config.php:包含了应用启动需要的极其基础的初始化设置。可以在这个文件中定制目录结构或者添加应用细节的常量
l Factories.yml:symfony定义了他自己的类去操纵视图、请求、响应、Session等等。如果向使用自己的类代替symfony的类,可以在这个文件中修改。
l Filter.yml:过滤器是每个请求执行的以部分,在此文件中可以定义那个过滤器被使用,可以被每个模块的配置信息覆盖。
l Logging.yml:定义了日志记录的级别,帮助管理和调试应用。
l Routing.yml:路由规则转换难读和不可标记的URL至“优雅”和清晰的形式,对于新的应用会有默认的规则存在。
l Settings.yml:symfony应用的主要设置就在这里。应用的国际化、默认语言、请求超时以及是否打开缓存等都可以在这里指定。一行的设置即可终止应用,因此你可以非常容易的进行应用的维护以及组件的升级等
l View.yml:默认试图的设置(布局名称、标题和元标签;引入的默认样式和JS文件;默认的Content-type等等)都在这个文件中。
国际化设置
国际化可以使页面以多种语言显示,这需要特殊的配置。需要在两个地方可以配置国际化:
l 应用的config/i18n.yml文件定义了一般的转换设置,比转换的默认文化,转换来自文件还是数据库以及他们的格式。
l 应用的i18n目录下的转换文件:存在基本的字典,翻译应用模板中的每一个短语(字段 phrases)才能在用户更换语言的时候将文本转换过去。
注意:需要在setting.yml文件中激活i18n特性。
其他应用配置
还有一组配置文件放在symfony的安装目录下($sf_symfony_data_dir/config/)。这些设置都是些默认的或者很少需要修改的或者是所有项目的全局部分。当然,你可以想修改他们,只要在myproject/apps/myapp/config/目录下创建与symfony安装目录下想要修改的文件同名的文件,然后覆盖想要修改的设置。在应用中定义的设置的优先级高于框架中的设置。下面是symfony安装目录config文件夹下的配置文件:
l Autoload.yml:包含自动加载特性的设置信息。此特性可以使得你无需在代码文件中引入需要类的明确定义路径。
l Constants.php:文件包含了默认应用文件结构,要覆盖这个文件的设置使用应用的config.php文件。
l Core_copile.yml和bootstrap_compile.yml:包含了一个启动应用(在bootstrap_compile.yml文件中)和处理请求(在core_compile.yml文件中)需要包含的类列表。这些类被连结至一个不含注释且优化过的PHP文件中,这将在减少文件访问操作方面提升执行效率。在没有PHP加速的情况下会很有用。
l Config_handlers.yml:在这里你可以添加或修改用来处理每个配置文件的句柄(handlers)
l Php.yml:这个文件检查php.ini文件中的参数是否正确设置,并可以在这个文件中覆盖php.ini中的参数设置。
模块层
默认情况下模块没有对应的配置,不过,如果需要你可以在特定模块覆盖应用层的设置。例如,你,可以改变模块中所有动作的HTML描述,或者引入一个特定的JS文件,你还可以选择给特定模块添加新的受限参数来保护封装。
你可能猜到了,module配置文件必定在myproject/apps/myapp/moduels/mymodule/config/文件夹下。猜对了:
l Generator.yml:很重要的一个文件,对于脚手架以及管理模块,此文件几乎可以配置任何东西。
l Module.yml:包含了模块的定制信息(相当于app.yml,只是层次和级别不同)和动作配置。
l Security.yml:设置动作的访问限制,在这里你可以设置一个页面是只能被注册用户或者具有特定权限的注册用户浏览。
l View.yml:包含试图的配置,覆盖应用的view.yml
l 验证文件:在validate文件夹而不是config文件夹,被用来控制表单的数据输入。
环境
在应用开发过程中,你可能需要并行的设置一些配置信息。比如,你可能需要配置开发过程中连接到测试数据库的信息同时你还要配置产品级运行时连接数据库时的信息。为了解决这个问题,symfony提供了不同的环境。
什么是环境
一个应用可以运行在多种环境下,不同的环境共享PHP代码但却具有完全不同的配置信息。对于每一个应用,symfony提供了三种默认环境:production(prod)、test(test)、development(dev)。你可以根据需要添加其他环境。
Test环境记录警告和错误日志而prod环境仅仅记录错误日志。缓存在dev环境是禁用的但在test和prod环境却不是。Dev和test环境可能需要测试数据,在数据库中以不同于production环境的配置存储,所以两者的数据库配置信息是不一样的。
配置级联
相同设置可以在不同的地方多次定义,例如,为所有应用设置页面mine-type为text/html,除了rss模块使用text/xml。你首先要在myapp/config/view.yml中配置,然后再在myapp/modules/rss/config/views.yml中配置,配置系统明白模块配置要覆盖应用配置。
不同层配置的优先级(由高到低):
模块 à 应用 à 项目 à 特定环境 à 所有环境(默认环境: all) à 框架默认
从代码中访问配置参数
所有的配置最终要转换为PHP格式,配置包含的许多设定会自动被框架使用而无需进一步的intervention。但有时你需要从代码(动作、模版、个性化类等等)中访问其中的一些设定信息,你需要sfConfig类。
sfConfig类
通过sfConfig类可以在应用中访问设定信息。配置参数被注册为简单的getter方法,你可以在代码的任何地方访问。
<?php // 获取设定 parameter = sfConfig::get('param_name', $default_value); // 定义或覆盖设定 sfConfig::set('param_name', $value); |
参数名称被分成几个部分,用_连接起来,前缀不同表达的意义也不同:
Sf_(setting.yml)、app_(app.yml)、mod_(module.yml)、sf_i18n_(i18n)、sf_logging_(logging.yml)
比如:
app.yml内容
all: version: 1.5 .general: tax: 19.6 default_user: name: John Doe mail: webmaster: webmaster@example.com contact: contact@example.com dev: mail: webmaster: dummy@example.com contact: dummy@example.com |
访问app.yml中的参数
echo sfConfig::get('app_version'); => '1.5' echo sfConfig::get('app_tax'); // Remember that category headers are ignored => '19.6' echo sfConfig::get('app_default_user_name'); => 'John Doe' echo sfConfig::get('app_mail_webmaster'); => 'dummy@example.com' echo sfConfig::get('app_mail_contact'); => 'dummy@example.com' |
Simony配置设定除了具有PHP常量的优点外,还能更改设定的值。
小技巧
在YAML配置文件中使用常量,即在YAML文件中调用其它配置文件中定义的参数,使用%将被调用参数名称包围起来。必须保证被调用参数所在的文件先于调用的YAML文件被校验。
autoload: symfony: name: symfony path: %SF_SYMFONY_LIB_DIR% recursive: on exclude: [vendor] |
配置中包含脚本,同样地,要保证被调用这先于调用者被校验。
all: translation: format: <?php echo (sfConfig::get('sf_i18n') == true ? 'xliff' : 'none')."/n" ?> |
使用sfYaml类
# test.yml house: family: name: Doe parents: [John, Jane] children: [Paul, Mark, Simone] address: number: 34 street: Main Street city: Nowheretown zipcode: 12345
|
// 载入yml $test = sfYaml::load('/path/to/test.yml'); print_r($test); |
结果如下:
[house] => Array( [family] => Array( [name] => Doe [parents] => Array( [0] => John [1] => Jane ) [children] => Array( [0] => Paul [1] => Mark [2] => Simone ) ) [address] => Array( [number] => 34 [street] => Main Street [city] => Nowheretown [zipcode] => 12345 ) ) ) |