根据上回的项目结构介绍,我们可以很清晰的认识到ZF项目的一切路由请求都交由index.php这个引导文件来处理,那么在这个文件中到底有哪些内容,需要我们做些什么?请先预读代码:
01.
defined(
'APPLICATION_PATH'
)
02.
|| define(
'APPLICATION_PATH'
,
realpath
(dirname(
__FILE__
) .
'/application'
));
03.
04.
defined(
'FRONTEND_PATH'
)
05.
|| define(
'FRONTEND_PATH'
, APPLICATION_PATH .
'/modules/frontend'
);
06.
07.
defined(
'BACKEND_PATH'
)
08.
|| define(
'BACKEND_PATH'
, APPLICATION_PATH .
'/modules/backend'
);
09.
10.
defined(
'APPLICATION_ENV'
)
11.
|| define(
'APPLICATION_ENV'
, (
getenv
(
'APPLICATION_ENV'
) ?
getenv
(
'APPLICATION_ENV'
) :
'production'
));
12.
13.
set_include_path(implode(PATH_SEPARATOR,
array
(
14.
realpath
(APPLICATION_PATH .
'/../library'
),
15.
realpath
(APPLICATION_PATH .
'/modules/frontend/controllers'
),
16.
realpath
(APPLICATION_PATH .
'/modules/frontend/models'
),
17.
realpath
(APPLICATION_PATH .
'/modules/backend/controllers'
),
18.
realpath
(APPLICATION_PATH .
'/modules/backend/models'
),
19.
get_include_path(),
20.
)));
21.
22.
require_once
'Zend/Loader/Autoloader.php'
;
23.
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
24.
25.
$application
=
new
Zend_Application(
26.
APPLICATION_ENV,
27.
APPLICATION_PATH .
'/configs/application.ini'
28.
);
29.
30.
try{
31.
$application
->getBootstrap()->bootstrap(
'frontController'
);
//此处只加载frontController资源
32.
$application
->getBootstrap()->bootstrap(
'router'
);
//此处加载router资源,该资源在application.ini中配置
33.
$application
->run();
34.
} catch (Exception
$e
) {
35.
echo
"捕获异常: "
. get_class(
$e
) . "
36.
";
37.
echo
"异常信息: "
.
$e
->getMessage() . "
38.
";
39.
}
代码的开头,检测并定义了项目的三个路径:APPLICATION_PATH这个常量很关键,因为之后的所有常量都是相对于它来定义的,所以它对于整个项目的结构有决定性的作用。接下来,定义的APPLICATION_ENV,是项目的环境常量,它的值会影响到整个项目的环境配置加载,通常我们会在根目录下的.htaccess文件中首先定义一个环境参数SetEnv APPLICATION_ENV development,将项目环境设置为开发,如果需要发布至生产环境,我们可以将development替换为production。关于配置文件的内容,将会在后文中详细介绍,在此暂且不提。
随后是加载项目所需包含的路径,这样以便于“类中找类”,同时也会将php.ini中的include_path变量中的内容引用进来,因此和前文中将ZF框架的路径配置于include_path相契合。
Tips:请仔细关注以下代码,ZF1.8之后两个很重要的变化。还有人记得,当年开启类自动加载时叱咤风云的那句代码吗?是的,Zend_Loader::registerAutoload(); 这句话从1.8开始已经被摒弃,并且在ZF2.0中彻底废弃。因此当你在ZF1.8中试图用此方法实现类自动加载功能时,会看到一句提示,大意是某些方法和1.8版本不兼容。其二是Zend_Application类的使用,引入了“项目资源”的概念,改变了1.8之前通过Zend_Config将配置全部加载的情况。
1.
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
2.
3.
$application
=
new
Zend_Application(
4.
APPLICATION_ENV,
5.
APPLICATION_PATH .
'/configs/application.ini'
6.
);