环境的目录结构
首先了解Yii各环境文件。前面我们讲到,每个Yii环境就是一组配置文件, 包含了入口脚本 index.php 和各类配置文件。 其实他们都放在 /path/to/digpage.com/environments 目录下面,我们看看这个目录都有哪些东西
** dev**
│ ├── backend
│ │ ├── config
│ │ │ ├── main-local.php
│ │ │ └── params-local.php
│ │ └── web
│ │ ├── index-test.php
│ │ └── index.php
│ ├── common
│ │ └── config
│ │ ├── main-local.php
│ │ └── params-local.php
│ ├── console
│ │ └── config
│ │ ├── main-local.php
│ │ └── params-local.php
│ ├── frontend
│ │ ├── config
│ │ │ ├── main-local.php
│ │ │ └── params-local.php
│ │ └── web
│ │ ├── index-test.php
│ │ └── index.php
│ └── yii
├── **prod**
│ ├── backend
│ │ ├── config
│ │ │ ├── main-local.php
│ │ │ └── params-local.php
│ │ └── web
│ │ └── index.php
│ ├── common
│ │ └── config
│ │ ├── main-local.php
│ │ └── params-local.php
│ ├── console
│ │ └── config
│ │ ├── main-local.php
│ │ └── params-local.php
│ ├── frontend
│ │ ├── config
│ │ │ ├── main-local.php
│ │ │ └── params-local.php
│ │ └── web
│ │ └── index.php
│ └── yii
└── index.php
环境目录下的 index.php 并不是通常所说的web入口脚本,它其实是个定义文件。 定义了可以使用的环境,打开这个文件看一眼:
return [
'Development' => [
'path' => 'dev',
'setWritable' => [
'backend/runtime',
'backend/web/assets',
'frontend/runtime',
'frontend/web/assets',
],
'setExecutable' => [
'yii',
],
'setCookieValidationKey' => [
'backend/config/main-local.php',
'frontend/config/main-local.php',
],
],
'Production' => [
'path' => 'prod',
'setWritable' => [
'backend/runtime',
'backend/web/assets',
'frontend/runtime',
'frontend/web/assets',
],
'setExecutable' => [
'yii',
],
'setCookieValidationKey' => [
'backend/config/main-local.php',
'frontend/config/main-local.php',
],
],
];
· path 指明了当前环境所对应的配置文件存放目录。如 Productions 环境对应的目录为 prod 。
· setWritable 指明了需要 init 脚本设定为可写模式的目录,这些目录Yii应用在运行时会写入。
· setExecutable 指明了要将哪个文件设为可执行。这个文件就是命令行应用的入口文件了。
· setCookieValidationsKey 指明了向哪个文件写入 cookieValidationKey 配置项。
对于分散于各处的 web 和 config 目录而言,它们也是有共性的。
· 凡是 web 目录,存放的都是web应用的入口脚本,一个 index.php 和一个测试版本的 index-test.php
· 凡是 config 目录,存放的,都是本地配置信息 main-local.php 和 params-local.php
**环境配置的生效规则**
上面讲到的配置文件有很多,有前台、后台、命令行和common的,有带local的、不带local的, 有params、main等,看起来好复杂的样子。那么一个环境发生作用时,这些文件是怎么个顺序呢? 这要看看 入口文件index.php 部分的内容,但总的原则是:
· **前台、后台和命令行的配置文件间,互不干扰,各管各的。没有先后顺序一说。** 因为Yii在任意时间,要么是在跑前台,要么是在跑后台。还记得么?他们是不同的应用,他们是独立的。 但是,这里有个common,通用于前台、后台等。common的内容被前台或后台的覆盖。
· local和不带local的。明显的,local的是本地配置文件,不带local的是团队间通用的配置。 因此,local的覆盖不带local的。
· params, main。这2类文件表示的配置内容并不重叠,他们逻辑上不存在谁覆盖谁的问题。 如果看看源代码,可以发现,params只是main配置的一部分。 而main的内容,是作为参数传递给应用的构造函数。 因此,这两者不存在谁覆盖谁的问题。