ZendChina资讯:ZF学习中,最让新人头痛的事就是入口文件的设定
<?php // 全局处理,主要包括报错级别,时区 error_reporting(E_ALL|E_STRICT); //调试时可以设置为E_ALL date_default_timezone_set('Etc/GMT-8'); //php5需要设置时区,注意GMT后面的-8符合与真实的是相反的 //php_ini的全局引用路径等的设置,这里最重要的是将我们建立的./library/目录加入到了全局引用路径中,这样才能访问Zend框架提供的功能 set_include_path('.'.PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./application/models/'.PATH_SEPARATOR.get_include_path()); //引用ZF的类加载类,用于通过ZF更加简洁地引用需要的ZF其它类文件,当然这个文件就需要通过传统方式引用了 include "Zend/Loader.php"; // 加载ZF应用中常用的ZF类 Zend_Loader::loadClass('Zend_Controller_Front'); //必须引用,控制器类 Zend_Loader::loadClass('Zend_Config_Ini'); //用于读取ini类型的配置文件 Zend_Loader::loadClass('Zend_Registry'); //用于注册对象供整个应用空间使用,如数据库链接对象 Zend_Loader::loadClass('Zend_Db'); //数据库类 Zend_Loader::loadClass('Zend_Db_Table'); //数据库扩展类,用于与表相关的操作 // 加载配置。主要是数据库相关的配置,可以分多个组,便于更改,建议使用,也可以直接在这里配置 $config = new Zend_Config_Ini('./application/configs/config.ini', 'general'); $registry = Zend_Registry::getInstance(); $registry->set('config', $config); //初始化数据库对象,并注册到整个应用空间 $db = Zend_Db::factory($config->db->adapter,$config->db->config->toArray()); $db->query('SET NAMES gbk'); Zend_Db_Table::setDefaultAdapter($db); $registry->set('db',$db); // 加载控制器,建立前端控制器对象,并设置控制器类路径 $frontController = Zend_Controller_Front::getInstance(); $frontController->throwExceptions(true); $frontController->setBaseUrl('/guestbook'); //主要在应用不在根目录的时候使用 $frontController->setControllerDirectory('./application/controllers'); // 运行,这里进行了错误处理,当ZF找不到想要的控制器时输出ZF的错误信息,你也可以进行自定义的处理 try{ $frontController->dispatch(); }catch(Zend_Controller_Dispatcher_Exception $e){ echo $e->getMessage();die; } ?>
[general] db.adapter = PDO_MYSQL db.config.host = localhost db.config.username = root db.config.password = db.config.dbname = zend
/**
* 本例演示仅用zend 实现完整的MVC
*/
$startTime=microtime(true);
define('ROOT',$_SERVER['DOCUMENT_ROOT']);
$libraryPath=ROOT."/library";
$zendPath=$libraryPath."/Zend";
$zendControllerPath=$libraryPath."/Zend/Controller";
set_include_path(
PATH_SEPARATOR . $libraryPath .
PATH_SEPARATOR . $zendPath .
PATH_SEPARATOR . $zendControllerPath
);
//echo get_include_path();
/**
* 引入所需要的类库文件
*/
require_once './library/Zend/Controller/Front.php';
require_once './library/Zend/Db.php';
require_once './library/Zend/Db/Table.php';
require_once './library/Zend/Config/Ini.php';
require_once './library/Zend/Acl.php';
require_once './library/Zend/Acl/Role.php';
require_once './library/Zend/Acl/Resource.php';
//也可以用下面的方法来加载
//Zend_Loader::loadClass('Zend_Config_Ini');
/**
* 用单例模式创建一个前端控制器
*/
$front=Zend_Controller_Front::getInstance();
$front->setControllerDirectory('./application/zendmvc/controllers','zendmvc');
//$front->setControllerDirectory('./application/app2/controllers','app2');
/**
* 正确的使用setControllerDirectory
* 用数组存储每个模块的路径及模块名,此模块名前是url与控制器类的名称的组成部份
*/
$apps=array(
'default'=>'./application/index/controllers',
'zendmvc'=>'./application/zendmvc/controllers'
);
$ACL=array('admin'=>'news','admin'=>'app1','user'=>'app2');
/**
* 我们可以按以上方式设定'app11'=>'./application/app1/controllers',但对应的控制器中的类名也必需设定为app11_indexController
* 目录可以不修改
*/
//$front->setControllerDirectory($apps);
/**
* 或是使用addControllerDirectory来添加模块
*/
$front->addControllerDirectory('./application/index/controllers','default');
$front->addControllerDirectory('./application/zendmvc/controllers','zendmvc');
$front->addControllerDirectory('./application/zendacl/controllers','zendacl');
// *www.xxx.com/模块名/控制器名/动作名/参数列表
//$front->addControllerDirectory('./application/index/controllers','index');
/**
* 或是采用更方便的方式来进行,直接进行模块所在目录的设定
* 采用这种方法,您只需要在application(或是别的你所设定的应用所在的目录)下建立您的
* 每个模块所属的子文件夹后,addModuleDirectory会自动遍历该目录,并调用addControllerDirectory
* 来设定每个控制器的目录,使大的工程文件在设定操作上更为方便
*/
//$front->addModuleDirectory('./application');
/**
* 设定抛出异常,在调试期间最好打开
* 另要注意,如果打开,则默认的errorController不起作用
*/
$front->throwExceptions(true);
/**
* 开始分发
*/
$front->dispatch();
//require_once('application/app1/controller/userController.php');
/**
* 访问方法
*www.xxx.com/模块名/控制器名/动作名/参数列表
* 模块名必须要在index文件中通过setControllerDirectory或是addControllerDirectory定义
* 控制器文件名必须按 控制器名+Controller.php来命名
* 控制器类名必须按 模块名+Controller来命名
* 动作函数名必须按 动作名+Action来命名
* 对应的view层下的scripts中,每一个控制器对应一个同名的文件夹
* 每一个动作有一个对应的 按动作名+.phtml命名的页面文件
*/
$endTime=microtime(true);
echo "<br>";
echo ($endTime-$startTime)*1000;
?>
另一种方法:
Zend_Controller是Zend Framework的MVC体系的核心部份。MVC指Model-View-Controller,是一个用于分离应用逻辑和表现逻辑的设计模式。Zend_Controller_Front实现了Front Controller设计模式,所有的请求都通过front controller(前端控制器)并分发(dispatch)到不同的控制器来处理,分发的过程基于请求的URL。
Zend_Controller体系具有可扩展性,可以通过继承已有的类或者自己写个新的类来实现各种接口和抽象类,也可以编写插件或者助手类(helper)来增强系统的功能。
在讨论控制器之前,你应该先理解Zend Framework是如何处理HTTP请求的。默认情况下,URL的第一个部份会映射到一个控制器,第二个部份则映射到控制器类中的Action(即控制器类内部的一个方法)。例如:URLhttp://framework.zend.com/roadmap/components,其服务器路径为/roadmap/components,则会映射到roadmap控制器和components Action。如果不存在action,则会调用index这个action。如果控制器不存在,则会自动调用index控制器。(按照Apache的命名惯例,自动映射到DirectoryIndex文件)
接下来,Zend_Controller的dispatcher会根据控制器的名称找到具体的控制器类。通常它会把控制器名称加上Controller。因此,上例中roadmap控制器与类RoadmapController相对应。
类似地,action会映射到控制器类中的一个类方法。默认情下,会被转成小写字母,然后加上Action字符串。因此,上例中components这个action与 componentsAction相对应。最终我们访问URL调用的是RoadmapController->componentsAction()。