`
lovefly_zero
  • 浏览: 390122 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

走进Zend Framework框架编程(四):Zend_Controller和引导文件

    博客分类:
  • PHP
阅读更多
上一节的基本示例已经运行成功,说明ZF已经开始工作了。这一部分我首先引入Zend_Controller的概念,再对引导文件index.php做一个详细的解释。
    1,理解Zend_Controller
    Zend_Controller是ZF的MVC体系的核心部份。
    Front Controller(前端控制器)设计模式具体是由Zend_Controller_Front静态类实现的,所有的请求都必须通过前端控制器,并基于请求的URL被分发(dispatch)到不同的控制器去来处理。
    Zend_Controller体系具有可扩展性,可以通过继承已有的类,或者通过实现各种接口和继承抽象类来写自己的扩展类,也可以编写插件或者助手类(helper)来增强系统的功能。
    Zend_Controller_Front类的声明和所有初始化工作,以及执行dispatch()方法等都是在Bootstrap文件即入口程序中完成的,在ZF中,通常就是指index.php文件。因为用户的所有请求都是从index.php进入的,所以需要配置Web服务器,把所有请求导向到index.php文件中,这些我们在前边已经完成了,而这里我们已经对其原因有了更深入的理解。
    2,理解ZF是如何处理HTTP请求的:
    例如有一个URL请求地址http://host_name/controller_name/action_name
    其中host_name一般是一个域名,例如www.why100000.com。默认情况下,该URL的第一个部份controller_name会映射到一个控制器,第二个部份action_name则映射到控制器类中的Action(控制器类内部的一个方法)。在本例中,其服务器路径为/controller_name/action_name,则会映射到controller_name控制器和action_name这个Action。如果不存在该action,则会默认调用index这个action。如果控制器不存在,则会默认自动调用index控制器(按照Apache的命名惯例,将自动映射到DirectoryIndex文件)。
    接下来,Zend_Controller的dispatcher会根据控制器的名称找到具体的控制器类。通常它会把控制器名称加上Controller。因此,上例中controller_name控制器与controller_name Controller类相对应。
    类似地,action会映射到控制器类中的一个方法。默认情况下,会被转成小写字母,然后加上“Action”字符串。因此,上例中action_name这个action与 action_name Action相对应。于是最终我们访问URL调用的是
    controller_name Controller-> action_name Action()
    方法。
    控制器类保存为controller文件夹下的一个php文件中,文件名前缀约定与controller类的名字相同。例如Controller_nameController.php。
    现在我们根据以上约定创建一个控制器和Action方法:
    <?php
    class Controller_nameController extends Zend_Controller_Action
    {
      function action_nameAction()
      {
    ……
    }
    }
    ?>
    以上代码需要以文件名Controller_nameController.php保存,并存放到controllers文件夹下。
    ZF有一个约定,就是当url中不指定控制器名时,默认为index控制器;当不指定action名时,默认为index action。于是,当控制器名和action都不指定时,就执行index控制器类的indexAction方法,这时类文件形如:
    <?php
    class IndexController extends Zend_Controller_Action
    {
      function indexAction()
      {
    ……
    }
    }
    ?>
    该代码保存为IndexController.php文件名。
    一般的控制器类都有一个indexAction函数,作为控制器的默认方法。
    注意在url中,控制器名和action可以同时省略:即形如http://host_name/
    也可以省略action名,执行indexAction方法,形如http://host_name/controller_name/
    但不能省略控制器名而指定action名,即
    http://host_name//action_name
    是不正确的。
    形如http://host_name/xxx的地址,xxx被认为是控制器名。
    对于我们上一节的示例,当用浏览器打开地址http://phpchica1.com:8080,其实执行的是IndexController控制器类的indexAction方法,执行了语句
    echo "Hello PHPChina1.com!";
    而我们在IndexController控制器类中再建立一个成员函数:
      function otherAction()
      {
        echo "this is other Action.";
      }
    在浏览器地址栏输入http://phpchica1.com:8080/index/other,将会输出字符串“this is other Action.”。
    3,对引导(bootstrap)文件index.php的解释
    error_reporting(E_ALL|E_STRICT);语句打开了错误输出开关,用于代码调试,正式发布的代码应该屏蔽错误信息。
    date_default_timezone_set('Asia/Shanghai');设定时区,该语句不能省略。
    set_include_path(……);很关键的语句。用于设定类库的包含路径,ZF的系统类库就是在这里指定的。注意如果php.ini文件里的include_path包含了ZF类库的路径,这里就可以不用包含../library路径。但是在自己的代码里指定ZF类库路径更方便一些,一般推荐这么做。../App_phpchina.com/models/路径下包含我们自己开发的自定义类文件。没有自定义类文件,可以不用包含该路径。get_include_path再取得php.ini的其他包含路径,一同指定我们的应用程序使用。
    include "Zend/Loader.php";语句装载ZF的类加载器。Zend/Loader.php正是从../library路径下取得的。
    Zend_Loader::registerAutoload();自动加载类。该语句可以分别用以下两段代码代替,效果相同:
    第一段代码:
      function __autoload($class)
      {  Zend_Loader::loadClass($class);  }
    第二段代码:
      Zend_Loader::loadClass('Zend_Controller_Front');
    $fc = Zend_Controller_Front::getInstance();取得Zend_Controller_Front类实例。
    $fc->setControllerDirectory(……);指定一组控制器文件路径,参数是数组。让前端控制器知道从哪里去找我们的控制器类。如果仅有一个控制器文件夹,也可以写成:
    $fc->setControllerDirectory('../App_www.mydomain.com/controllers');
    $fc->throwExceptions(true);设置抛出错误信息。
    $fc->setParam('xxx', true);格式的语句用于设置一些参数。
    其中$fc->setParam('noViewRenderer', true);指明不使用视图,false 是默认值。
    $fc->dispatch();语句开始执行分发,导向到请求的控制器执行后续代码。
    这是一个功能较少的、典型的bootstrap引导文件,每个ZF应用中,该文件大同小异,只是个别参数设置不同。这个文件可以作为一个模板,拷贝到其他ZF应用中使用。这个文件与ZF应用的文件夹结构有直接关系,配置时一定要仔细。调整一些参数后可以使ZF有一些其他的额外功能。这点我们以后还会接触到。
    4,ZF中请求URL的格式
    Zend Framework的控制器 Zend_Controller使网站支持“干净的URL”。它把对控制器、方法的请求和参数的传递变形为对文件夹的访问形式。URL的完整格式为:
    http://host_name/controller_name/action_name/param1/ value1/param2/ value2…
    除过前边的host_name外,controller_name和action_name为控制器和方法名,后边的残出和值必须一一对应。
    传递的参数,在action方法中以 $this->_getParam("参数名");的方法来取得其值。
    因为有严格的对应关系,一般在有参数传递的情况下,控制器和action的名字都不能省略,否则会出现歧义。
    我们现在在
    C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\app_phpchina1.com
    \controllers
    文件夹下建立一个NewsController.php文件,内容为:
    <?php
      class NewsController extends Zend_Controller_Action
      {
        function indexAction()
        {
          echo "Welcome to News!";
        }
        function pageAction()
        {
          $id = $this->_getParam("id");
          echo "ID: ".$id."<BR>";
          $type = $this->_getParam("type");
          echo "TYPE: ".$type."<BR>";
        }
      }
    ?>
    然后我们以http://phpchina1.com:8080/news/page/id/001/type/typename地址访问该文件,会得到以下显示结果,可以看到已经正确的获得了传递的参数:
    ID: 001
    TYPE: typename
    我们看到,ZF访问框架内的控制器方法,不是通过从url中访问控制器类php文件来实现的,而是在index.php中前端控制器的控制下对对应的控制器及其方法进行访问,一切过程和细节都被ZF框架屏蔽了,我们只要写出正确的url就能访问到对应的程序逻辑。
    我们可以试着访问http://phpchina1.com:8080/index.php地址,实际上执行的还是IndexController控制器的indexAction方法,输出字符串“Hello PHPChina1.com!”。而想直接访问IndexController.php和NewsController.php文件,我们甚至连它们的url路径是什么都无法知道。
张庆(网眼)文章出处phpchina
分享到:
评论

相关推荐

    Zend Framework教程之Zend_Controller_Plugin插件用法详解

    在Zend Framework中,`Zend_Controller_Plugin`是一个强大的机制,允许开发者在应用程序的不同阶段插入自定义的行为,以扩展和增强其功能。插件系统提供了一种灵活的方式,可以在请求生命周期的关键点进行干预,如...

    Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解

    主要介绍了Zend Framework教程之分发器Zend_Controller_Dispatcher用法,结合实例形式详细分析了分发器Zend_Controller_Dispatcher的结构,功能,使用技巧与相关注意事项,需要的朋友可以参考下

    Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解

    在Zend Framework中,请求对象的封装由Zend_Controller_Request组件实现,该组件是整个MVC架构中用于处理客户端请求的核心部分。 首先,请求对象是一个简单的值对象,它在前端控制器、路由器、分发器和控制类之间...

    ZEND FRAMEWORK 1.11.7 中文参考文档

    Table of Contents •Introduction to Zend Framework •Overview •Installation •Learning Zend Framework •Zend Framework Quick Start •Autoloading in Zend Framework •Plugins in Zend Framework •...

    Zend Framework教程之路由功能Zend_Controller_Router详解

    主要介绍了Zend Framework教程之路由功能Zend_Controller_Router,详细分析了路由功能Zend_Controller_Router的原理,使用技巧与相关注意事项,需要的朋友可以参考下

    基于Zend Framework 框架的CMS PHP 源代码

    本资源提供了基于Zend Framework的CMS源代码,这为我们深入理解PHP编程和Web应用开发提供了一个宝贵的实践平台。 **一、Zend Framework介绍** Zend Framework是一款开源的PHP框架,由Zend Technologies公司开发,...

    ZendFramework-1.10.4-minimal

    由于仅给出了 "ZendFramework-1.10.4-minimal" 这一个文件名,我们可以推测压缩包内可能包含的是 Zend Framework 1.10.4 版本的源代码、库文件、配置文件、文档等基本组成部分,但不包含任何额外的模块或示例应用。...

    zend framework教程.zip

    **Zend Framework 框架详解** Zend Framework 是一个基于组件的 PHP 开发框架,由 Zend Technologies 公司创建并维护,被PHP官网推荐为MVC(Model-View-Controller)框架之一,尤其适合构建企业级的Web应用。本教程...

    ZendFramework-1.7.2帮助文档

    - **路由和调度**:`Zend_Controller_Router` 和 `Rewrite` 负责解析 URL 并调度到相应的控制器和动作。 - **表单处理**:`Zend_Form` 支持创建复杂的表单,包含验证、过滤和装饰器功能。 - **缓存**:`Zend_Cache` ...

    Zend Framework 框架开发入门教程

    ### Zend Framework 框架开发入门教程 #### 一、简介 本文档旨在提供一个针对初学者的 **Zend Framework** 开发指南。该框架是一种基于 PHP 的开源 Web 应用框架,提供了大量的组件来帮助开发者构建高效且健壮的 ...

    Zend Framework实例教程

    - 命令行下载:使用`wget`命令下载,例如:`$ wget http://framework.zend.com/download/tgz`,接着解压:`$ tar -xvzf ZendFramework-0.1.2.tar.gz`。 ##### 目录结构: - 将下载的`library`目录重命名并放置于...

    zfcn.rar_ZendFramework

    描述"ZendFramework入门教程简体中文pdf版"明确指出这是一份针对初学者的 Zend Framework 教程,以简体中文编写,并且是以 PDF 文件的形式存在。这表明这份资料适合对中国开发者,尤其是那些刚开始接触 Zend ...

    zendframework中文手册2010

    综上所述,"zendframework中文手册2010"提供了全面的 Zend Framework 学习资源,无论是初学者还是经验丰富的开发者,都能从中受益,提升PHP编程技能。通过深入学习和实践,可以有效地利用 Zend Framework 构建高质量...

    ZendFramework1.7.5

    1. **MVC 模式**:Zend Framework 遵循 Model-View-Controller(MVC)设计模式,使得业务逻辑、数据处理和用户界面分离,提高了代码的可读性和可维护性。 2. **组件化**:框架由一系列可复用、松散耦合的组件组成,...

    zendframework1.12

    2. **MVC 结构**:Zend Framework 实现了 Model-View-Controller 设计模式,用于分离业务逻辑、数据处理和用户界面。这有助于提高代码的可读性和可维护性。 3. **对象关系映射(ORM)**:ZF1 包含了 Zend_Db 和 ...

    最新版的Zend_Framework 手册 中文版

    这个“最新版的Zend Framework 手册 中文版”提供了对框架组件的详细解释,帮助开发者更有效地理解和使用这个强大的工具。 **核心特性** 1. **模块化设计**:Zend Framework 鼓励模块化的应用设计,这使得代码组织...

    zend framework 中文手册

    描述提到"zend framework zendframework manual 手册,Zend Framework手册 中文版,有一部分还没有汉化",这意味着虽然该手册是中文版本,但可能并非全部内容都已翻译完成,部分原文可能是英文状态。 **Zend ...

    Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解

    动作助手相关的文件位于 `/library/Zend/Controller/Action/` 目录下,包括各种助手类和接口,如 `HelperBroker`、`Abstract`、`Exception` 等。 常见的动作助手包括: 1. **FlashMessenger**:用于处理 Flash ...

    Zend Framework API documentation

    Zend Framework API 文档是一份详尽的资源,专为开发者提供关于 Zend Framework 的技术信息和使用指南。这个框架是用 PHP 开发的,旨在帮助构建高质量、可维护的 Web 应用程序。其 API(应用程序编程接口)文档是...

    ZendFramework-1.12.9 手册 (HTML版)

    2. **安全性**:学习如何利用 Zend Framework 提供的工具和最佳实践来防止 SQL 注入、XSS 攻击等安全问题。 3. **插件和扩展**:了解如何创建自定义组件和插件,以满足特定的项目需求。 4. **与其他技术集成**:例如...

Global site tag (gtag.js) - Google Analytics