发新话题
打印

[强推] Zend Framework 留言本实战 -- 创建应用的入口文件./index.php

本主题由 tomsou 于 2008-4-7 17:36 设置高亮

[强推] Zend Framework 留言本实战 -- 创建应用的入口文件./index.php

三、创建应用的入口文件./index.php

      实际上,这个文件不一定须要命名为index.php,关键看你在url重写的时候把访问请求定向到了哪个文件,但是由于index.php是apache默认的欢迎页面,建议采用index.php命名。通过URL重写,应用所有的访问请求将定向到”./index.php“,在这个文件中,将初始化一个ZF的前端控制器,这个控制器将负责对所有的请求进行分配,即分配到指定的控制器,下面我们来看一下一个假设请求的访问流程(假设我们的请求是:http://localhost/register/form):

http://localhost/register/form---->[文件]./index.php---->[ZF类]Zend_Controller_Front实例---->[文件夹]./application/controllers---->[ZF控制器类]registerController---->[控制器类中定义的处理函数]formAction---->[视图层文件]./application/views/script/register/form.phtml---->返回结果

以下是ZF官方手册中对控制器的解释

      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()。



=DIV========================================

下面通过代码来解释index.php的创建:
<?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/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;
}
?>

[ 本帖最后由 tomsou 于 2008-4-7 17:28 编辑 ]

TOP

感觉cpu占用好大啊~~

[ 本帖最后由 liumei001 于 2008-4-25 18:03 编辑 ]

TOP

发新话题