先列一下zendframework 2中一会要讲到的配置相关的典型的目录结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
config
/
autoload
/
global
.
php
local
.
php
application
.
config
.
php
module
/
Application
/
config
/
module
.
config
.
php
Blog
/
config
/
module
.
config
.
php
public
/
index
.
php
|
先来看ZendSkeletonApplication(Skeleton是骨架,搭架子的意思)生成的入口文件public/index.php的默认代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
/**
* This makes our life easier when dealing with paths. Everything is relative
* to the application root now.
*/
chdir
(
dirname
(
__DIR__
)
)
;
// Decline static file requests back to the PHP built-in webserver
if
(
php_sapi_name
(
)
===
'cli-server'
&&
is_file
(
__DIR__
.
parse_url
(
$_SERVER
[
'REQUEST_URI'
]
,
PHP_URL_PATH
)
)
)
{
return
false
;
}
// Setup autoloading
require
'init_autoloader.php'
;
// Run the application!
Zend
\
Mvc
\
Application::
init
(
require
'config/application.config.php'
)
->
run
(
)
;
|
直接看最后一行:
1
|
Zend
\
Mvc
\
Application::
init
(
require
'config/application.config.php'
)
->
run
(
)
;
|
该行表明入口文件加载了我们开头列出的config/application.config.php文件,并以此文件的配置信息来启动应用。接下来我们再来看看config/application.config.php的代码,为了简化,这里删除了默认被注释掉的部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?php
return
array
(
'modules'
=
>
array
(
'Application'
,
'Blog'
//这是新加的配置值,表明载入Blog模块
)
,
'module_listener_options'
=
>
array
(
'module_paths'
=
>
array
(
'./module'
,
'./vendor'
,
)
,
'config_glob_paths'
=
>
array
(
//全局配置文件及本机配置文件的位置
'config/autoload/{,*.}{global,local}.php'
,
)
,
)
,
)
;
|
这段代码注意两个地方,第一是在‘module’部分添加了一个Blog模块,因为后面要分析该模块的配置文件与Application模块的关系;第二是全局配置及本机配置路径,全局配置(config/autoload/global.php)一般用来存放一些全局的配置,如新浪微博登录的appkey,本机配置(config/autoload/local.php)用来存放与本机相关的配置,如数据库的用户名,端口等信息,涉及敏感信息的请不要把该文件上传到公用的git、svn等源码库中。
接下来是要重点讲的各模块的配置文件,他们位于各module之下,一般命名为module.config.php,里面包含路由,服务管理,多语言,控制器,视图管理等部分,这里以module/Application/module.config.php为例,介绍下常用的多语言,控制器和视图管理部分,路由是用得最多的,网上也很多相关资料,这里暂不解释。
多语言很简单,locale项配置当前语言,zh_CN表明使用简体中文,translation_file_patterns项配置了语言文件所在的位置:
1
2
3
4
5
6
7
8
9
10
|
'translator'
=
>
array
(
'locale'
=
>
'zh_CN'
,
//简体中文
'translation_file_patterns'
=
>
array
(
array
(
'type'
=
>
'gettext'
,
'base_dir'
=
>
__DIR__
.
'/../language'
,
'pattern'
=
>
'%s.mo'
,
)
,
)
,
)
,
|
控制器项配置了Service至实际Controller的映射,Service在路由配置及serviceLocator->get()中使用,为了好记,一般key和value只差Controller几个字符而已。。。
1
2
3
4
5
6
|
'controllers'
=
>
array
(
'invokables'
=
>
array
(
'Application\Controller\Index'
=
>
'Application\Controller\IndexController'
,
'Application\Controller\Test'
=
>
'Application\Controller\TestController'
)
,
)
,
|
最后来看视图配置,直接在代码中的注释看吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
'view_manager'
=
>
array
(
//出现404时是否显示页面找不到的原因,比如没有配置路由,没有对应的Controller等
'display_not_found_reason'
=
>
true
,
//抛出异常时是否显示错误详细信息
'display_exceptions'
=
>
true
,
//指定输入页面HTML Doctype
'doctype'
=
>
'HTML5'
,
//指定404页面模板的key,需要与下面的template_map配合
'not_found_template'
=
>
'error/404'
,
//指定错误页模板,需要与下面的template_map配合
'exception_template'
=
>
'error/index'
,
//模板map
'template_map'
=
>
array
(
'layout/layout'
=
>
__DIR__
.
'/../view/layout/layout.phtml'
,
'application/index/index'
=
>
__DIR__
.
'/../view/application/index/index.phtml'
,
'error/404'
=
>
__DIR__
.
'/../view/error/404.phtml'
,
'error/index'
=
>
__DIR__
.
'/../view/error/index.phtml'
,
)
,
//Controller中查找模板的路径集合
'template_path_stack'
=
>
array
(
__DIR__
.
'/../view'
,
)
,
)
,
|
对于view_manager的配置值得一提的有几点:
1、doctype配置后,需要在layout模板开头加上以下代码才能起作用:
1
|
<?php
echo
$this
->
doctype
(
)
;
?>
|
2、如果几个模块的module.config.php都配置了template_map项,不同的key会merge,相同的key会相互覆盖,以最后一个加载的为准,加载的顺序与config/application.config.php中“modules”的配置一致。比如这个例子中,module/Blog/config/module.config.php中的template_map如果也配置如下值:
1
|
'layout/layout'
=
>
__DIR__
.
'/../view/layout/layout.phtml'
|
那么Application与Blog模块的布局就都会变成由Blog模块下的布局文件决定。这一点对于新手可能不好理解,我猜想官方这样做,意思是application.config.php对应一个子系统,该文件加载的module是该子系统的模块,一个子系统所对应的布局模板应该是一致的。如果需要实现不同子系统,可以用另一种方式来实现,可参考《Zend Framework 2多域名多模块部署》。
3、template_path_stack项配置了模板路径库,在Controller中View->setTemplate($path)调用时,$path将会在该配置下的所有路径下寻找,直到找到为止,都找不到就会报错。不同模块的该配置值会merge,先加载的模块的路径会在前面。