436 1234
发新话题
打印

Zend 框架学习之模型-视图-控制器及添加数据库篇

Zend 框架学习之模型-视图-控制器及添加数据库篇

“理解 Zend 框架” 系列按顺序记录了构建在线提要阅读器 Chomp 的过程,同时对使用近期引入的开放源码的 PHP Zend 框架的主要方面进行了解释。在 第 1 部分 中,我们讨论了 Zend 框架所要实现的目标,其中包括了易用组件和基于模型-视图-控制器(MVC)模式的架构。现在我们将其付诸实践。在本教程中,将向您介绍使用 Zend 框架创建在线提要阅读器 Chomp 的开始,也就是在逐渐了解 MVC 模式的同时创建一个表单并为数据库添加信息。
开始之前

本教程是为那些想要更好地理解 MVC 模式的开发人员而写,也同样适用于想要使用并更多地了解 Zend 框架的人们。

关于本系列

“理解 Zend 框架” 系列按顺序记录了构建在线提要阅读器 Chomp 的过程,同时对使用近期引入的开放源码的 PHP Zend 框架的主要方面进行了解释。

第 1 部分 中,我们探讨了 Zend 框架的全部概念,包括一系列相关类和对 MVC 模式的总体探讨。在第 2 部分即本文中,我们将详述以上内容并展示如何在 Zend 框架应用程序中实现 MVC 模式。我们将创建用户注册及登录过程,将用户信息添加到数据库中并重新获取这些信息。

第 3 和第 4 部分是有关真实的 RSS 和 Atom 提要。在第 3 部分中,我们使用户能够订阅独立的提要并显示列于这些提要中的条目。还讨论了 Zend 框架的一些表单处理功能,如验证数据和清除提要条目。第 4 部分说明了如何创建代理以从不含提要的站点中提取数据。

本系列余下的部分是涉及到为 Chomp 应用程序增值。第 5 部分是关于使用 PDF 格式作为已保存条目的备份类型。第 6 部分是关于使用 Zend_Mail 模块提醒用户有新文章。第 7 部分探讨了搜索已保存内容并返回排列好的结果。在第 8 部分中,我们创建了自己的混合体以添加 Amazon、Flickr 和 Yahoo! 中的信息。而在第 9 部分中,我们使用 JavaScript 对象符号为网站添加 Ajax 交互方式。

TOP

关于本教程

我们即将使用 Zend 框架开始开发。目标是使 Chomp 成为完美的在线提要阅读器。在本教程中,我们使用 MVC 模式的 Zend 框架实现及其基本数据库类来创建基本的应用程序,该程序包括了注册和登录页面。您将学到:

如何设置 Apache 和 mod_rewrite 模块。
如何将 PHP V5 与 Apache 集成。
针对 Zend 框架改变某些配置。
如何使用模型-视图-控制器(MVC)模式。
如何创建定制控制器。
如何创建定制行为。
如何插入数据到数据库中。
如何从数据库中提取数据。
如何在数据库中更新数据。
如何使用 Zend 的通用数据库功能。
在本教程结束的时候,您将实现此应用程序的基本框架,在第 3 部分中就可以添加提要了。

TOP

GOGO...

TOP

在本例中,我们需要编辑 httpd.conf 文件来为 mod_rewrite 模块包含重写规则,并且为了使 Zend 框架生效添加一些指令,如下所示。


清单 1. Httpd.conf 文件
复制内容到剪贴板
代码:
RewriteEngine on
RewriteLog "g:\ZendFramework-0.1.2\rewrite.log"
RewriteRule !\.(js|ico|gif|jpg|png|css|php)$ /index.php

php_value include_path ".;g:\ZendFramework-0.1.2\library"
将这些代码添加到 httpd.conf 文件的末尾以设置 URL 重写,这一操作通过 index.php 文件发送所有的请求来使得 Zend MVC 成为可能。php_value include_path 和 RewriteLog 指向需要精确指向正确的分区。您也许需要将我所设置的 g: 改成您的安装的任何正确路径。

TOP

将 Zend 框架添加到混合体中

获取 Zend 框架。下载压缩文件并完整地解压到您选择的目录中,并确保引用该目录的 HTTPD.CONF 指向都具有正确的路径。

现在就可以着手工作了。

TOP

模型、视图、控制器

既然我们已经安装并设置好了一切,现在就该动手构建实际的站点了。我们将从 MVC 模式开始。

什么是模型-视图-控制器模式?

MVC 是颇具争议的一个模式,不同群体中的个人对这一问题都有自己的看法。但该模式的存在是为了解决问题,而不是制造问题,因而鉴于本教程的宗旨,我们只讨论 MVC 模式与 Zend 框架相关的内容。

MVC 模式将应用程序的职责分为三层:

模型
这里的模型概念性地表示了应用程序中的实体,它类同于一个类或者是面向对象世界中的对象。在一些实现中,模型只包含实体的结构。而在另一些实现中,模型还包含了与对象相关的业务逻辑。在本例中,模型仅包含实体的结构。

视图
视图是指页面的外观。它不包含,或至少不应该包含任何业务逻辑。在本例中,视图是能放置信息的模板,本例中为 HTML。

控制器
控制器是处理业务逻辑的地方。它具有两方面的职责,控制对象及其可视化表现,后者是由通过操纵视图来实现的。

TOP

模型

尽管最终的应用程序会处理更多的实体,我们现在需只考虑三种:

用户
这个实体代表 Web 站点的用户,包括了如用户名称及电子邮件地址等数据。用户需要能够登录、退出及注册。以后,还需要执行其他的操作,如创建订阅或阅读提要。

提要
这个实体代表了 RSS 或 Atom 提要,并最终包含其他提要条目的模型。

索引页
这个实体实际上代表了站点本身。毕竟网站是一个需要显示视图并执行特定操作的对象。按照惯例,它被称为索引页(index),这跟在一个 URL 下显示但未命名的文件是一样的,这些文件被称为 index.html(或 index.php)。

TOP

第一个视图

视图定义了信息显示的方式,但无需是信息本身。我们可以将下列内容添加到 index.php 文件中,并以此作为开始。


清单 2. 在 index.php 文件中创建一个基本视图
复制内容到剪贴板
代码:
<html>
<head>
   <title>Chomp! The online feedreader</title>
</head>
<body>

<table>
<tr><td colspan="2">
   <h1>CHOMP!</h1>
   <h3>the only feedreader you'll ever need</h3>
</td></tr>
<tr><td style="width: 200px;">Login info here</td><td>Content here</td></tr>
</table>

</body>
</html>
将此文件另存为 index.php 放在应用程序的文档根目录中。例如,将文件保存在 e:\sw\public_html 中。要查看实际的视图,请将您的浏览器转到 http://localhost。

TOP

第一个控制器

控制器包含了实体的业务逻辑,该逻辑被分解为许多行为。例如,在本教程中,我们只要求网站完成三件事:显示主页、允许用户登录及注册。这意味着我们可以为网站创建一个控制器,如下所示。


清单 3. 基本控制器
复制内容到剪贴板
代码:
<?php
Zend::loadClass('Zend_Controller_Action');

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        echo "This is the indexAction().";
    }

    public function loginAction()
    {
        echo "This is the loginAction().";
    }

    public function registerAction()
    {
        echo "This is the registerAction().";
    }

}
?>
请记住:我们所调用的实体代表了站点本身,即索引页,所以它的控制器叫做索引页控制器。像所有的控制器一样,它是一个扩展了 Zend_Controller_Action 的类,因而我们首先将加载它。一但创建了实际的类,我们用命名规范 <action_name>Action 为每个行为创建一个函数。

在文档根目录中为网站创建一个名为 controllers 的新目录,并在该目录中将此文件另存为 IndexController.php。

注意:Zend 框架的早期版本中一个 bug,您必须在 <ZEND_HOME>\library 目录下再额外创建一个控制器目录副本。如果框架没有检测到您的控制器,那么请尝试将其放到框架所指定的位置 <ZEND_HOME>\library。

TOP

调用控制器

IndexController 永远不会直接被调用。请记住当配置 PHP 和 Apache 时,我们让 Apache 将所有的请求转发至 index.php 文件。此文件负责将这些请求分派给控制器。通常将 index.php 中的 HTML 文本保存成一个独立的文件,并将清单 4 中的代码添加到 index.php 文件中。


清单 4. 将请求分派给控制器
复制内容到剪贴板
代码:
<?php

include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('controllers');
$controller->dispatch();

?>
Apache 接受这个请求后,它会创建一个 Zend_Controller_Front 类的新实例,它使您可以设置控制器目录的位置。也可以将控制器放到文档根目录以外的位置,以减少损坏。一但您设置了目录,控制器能够基于 URL 适当地分派请求。

因为 URL 并未指定某个控制器,Zend 框架选择了 IndexController,这就像 Apache 通常会找命名为 index.html 文件作为其默认首页一样。同样,由于未指定行为,它会调用 indexAction。后面会遇到更多有关指定控制器和行为的例子,但现在让我们把目光转移到显示视图上来。

TOP

 436 1234
发新话题