430 123
发新话题
打印

Zend 框架学习之提要篇

Zend 框架学习之提要篇

“理解 Zend 框架” 系列按顺序记录了构建在线提要阅读器 Chomp 的过程,同时对使用近期引入的开放源码的 PHP Zend 框架的主要方面进行了解释。在第 1 和第 2 部分中,我们讨论了 Zend 框架所要实现的目标,以及如何使用 Zend 框架创建在线提要阅读器的开端,在逐渐了解 MVC 模式的同时创建一个表单并为数据库添加信息。本教程将向您介绍如何使用 Zend 框架实现应用程序的在线提要阅读器部分。
开始之前

本教程是为那些想要理解模型-视图-控制器(MVC)模式的开发人员而写,本文在 第 2 部分 内容之上进一步深入探讨,同时也讲述了如何使用 Zend 框架的 Zend_Feed 和 Zend_InputFilter 模块构建提要阅读器。

关于本系列

“理解 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

概要

本部分首先介绍了 RSS 提要及其提供的数据。接着介绍了本教程所需的新的数据库纲要,随后您就可以创建并初始化新表。最后,您会了解一些杂项功能,包括自动装载类、注册视图对象及退出。

RSS 提要

最受欢迎的提要阅读形式就是通过 RSS 阅读提要。RSS 有几个意思:RDF Site Summary、Rich Site Summary 或 Really Simple Syndication。它是一种 XML 格式,用来在互联网上分发大标题数据和其他信息。无需向站点发送任何特殊的参数,只需知道您想要从中获取信息的 RSS 提要的 URL,将浏览器指向该 URL 即可。

将浏览器指向 Google News,即可查看 RSS 数据。现在您可以看到所有以 RSS XML 格式返回的信息。这里有很多信息,但在本教程中,我们仅关注摘要数据:标题和用于获取全文的 URL。

TOP

新数据库模式

在第 2 部分中,我们已经给出了用户表,在这里我们再添加一些表,如下所示:

feeds
此表用于存储可用提要。它包含两个字段:feedname 和 link。
subscribedfeeds
此表用于保存用户订阅的所有提要。订阅一条提要即为此表添加了一行,该行包含用户及订阅的这个提要的名称。它包含两个字段:username 和 feedname。
savedentries
此表用于存储用户已保存的全部 RSS 提要条目。以便使用户能在以后再次访问。它包含四个字段:username、feedname、channelname(文章标题)和 link。

TOP

创建新表

下面为数据库创建新表。打开一个 MySQL 窗口并添加下列代码:

清单 1. 创建新表
复制内容到剪贴板
代码:
use chomp;

create table feeds
    (feedname varchar(256), link varchar(512));

create table subscribedfeeds
    (username varchar(20), feedname varchar(256));

create table savedentries
    (username varchar(20), feedname varchar(256),
     channelname varchar(256), link varchar(512));
新数据库表现在已经在您的数据库中了。

TOP

初始化新表

使用提要阅读器上可用提要的标题和 URL 来初始化 feeds 表。将下列代码添加到同一个 MySQL 窗口中:


清单 2. 初始化数据表
复制内容到剪贴板
代码:
insert into feeds values
('Fox Sports', 'http://feeds.feedburner.com/foxsports/rss/headlines'),
('Google News', 'http://news.google.com/?output=rss'),
('Yahoo News', 'http://rss.news.yahoo.com/rss/topstories');

insert into subscribedfeeds values ('tsa', 'Google News');
现在,应用程序中有了三条可用提要:Fox Sports、Google News 和 Yahoo News。作为开始,我们也为 subscribedfeeds 表添加了一条已订阅提要。

TOP

自动装载类

Zend 框架需要我们添加 Zend::loadClass,它增加了代码的长度,但我们也许并不能记起所有需要的类。下列代码使我们不必手工装载类。


清单 3. 自动装载类
复制内容到剪贴板
代码:
<?php
session_start();

include 'Zend.php';

function __autoload($class)
{
    Zend::loadClass($class);
}
...
Zend 框架检测到这个方法并为您装载必要的类。同样,在此处添加 session_start()(仅此一处),所以要将其他实例从第 2 部分的代码中移除。

TOP

注册视图

注册该视图,它能够通过向注册库中添加视图对象,从而将两行代码变成一行。向注册库中添加对象,如下所示。


清单 4. 向注册库中添加 Zend 视图对象
复制内容到剪贴板
代码:
...
    Zend::loadClass($class);
}
$view = new Zend_View;
$view->setScriptPath('views');
Zend::register('view', $view);
...
在注册及登录活动中,从注册库重新检索视图对象,如下所示。


清单 5. 从 Zend 注册库重新检索视图对象
复制内容到剪贴板
代码:
    public function registerAction()
    {   
        $view = Zend::registry('view');
        $view->userFunction = 'Create';
        $view->action = '/user/create';
        $view->button = 'Register';
        echo $view->render('register.php');
    }

    public function loginAction()
    {
        $view = Zend::registry('view');
        $view->title = 'Login';
        echo $view->render('login.php');
    }

TOP

构建完美的阅读器

InputFilter 类

Zend_InputFilter 类提供的功能是惊人的,这些功能也是每位 Zend 框架用户都要用到的。本部分论及了其提供的具体功能,第 2 部分末尾已经提到过,我们将在代码中使用它们。

提供的功能

除非您能够过滤并验证此数据,否则可使用 Zend_InputFilter 类,装载 $_GET, $_POST 和 $_SESSION 等数组,然后用类似的方式访问它们。例如,向 Zend 对象中装载 GET 数组的方法如下:$filterGet = new Zend_InputFilter($_GET);。

有很多种方法可用于访问和测试数据,但下列方法更为常用:

getAlpha
只返回字母字符
getAlnum
只返回字母/数字字符
getDigits
只返回数字
getRaw
返回原始数据(未经过过滤及测试)
testAlnum
如只包含字母字符及数字,返回其值,否则返回 FALSE
testAlpha
如只包含字母字符,返回其值,否则返回 FALSE
testCcnum
若是有效信用卡号码,返回其值,否则返回 FALSE
testDate
若是有效日期,返回其值,否则返回 FALSE
testEmail
若是有效的电子邮件地址(目前还未在 Zend 框架下实现),返回其值,否则返回 FALSE
testName
若是有效的人名,返回其值,否则返回 FALSE
testRegex
若同正则表达式相匹配,返回其值(我们会用此方法测试有效的电子邮件地址),否则返回 FALSE
testPhone
若是有效的电话号码,返回其值,否则返回 FALSE
testUri
若是有效的 URL,返回其值,否则返回 FALSE
testZip
若是有效的邮政编码,返回其值,否则返回 FALSE
noTags
返回过滤掉所有 HTML 标记的值
还有一些其他的方法,您可以查看框架内的代码,以查看 Zend 发布版中的其他方法:zend/library/Zend/InputFilter.php。

TOP

通过 GET、POST 和 SESSION 存储数据

让我们使用针对 GET、POST 和 SESSION 数组的输入过滤器,您将在代码中多次使用该过滤器。按照如下方法操作。


清单 6. 将每一个数组装载到 Zend 对象中并使用 Zend 注册库注册
复制内容到剪贴板
代码:
...
    Zend::loadClass($class);
}
$filterGet = new Zend_InputFilter($_GET);
$filterPost = new Zend_InputFilter($_POST);
$filterSession = new Zend_InputFilter($_SESSION);
Zend::register('fGet', $filterGet);
Zend::register('fPost', $filterPost);
Zend::register('fSession', $filterSession);
...
请注意,一旦使用 Zend_InputFilter 装载了一个数组,该数组将被设置为 NULL,同时被强制复制一份。下一步,我们将把 Zend_InputFilter 类的该用法结合到当前的代码中来使用。

TOP

重温 IndexController

我们在此类中使用输入过滤器检索当前用户的用户名,来验证该用户是否当前已登录,如果未登录则将用户转到登录页面或 viewFeeds 页面。修改 IndexController.php 文件,如下所示。


清单 7. 修改 IndexController 类
复制内容到剪贴板
代码:
<?php

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $filterSession = Zend::registry('fSession');
        $username = $filterSession->getRaw('username');
        if(!isset($username))
            $this->_redirect('user/login');
        else{
            $db = Zend::registry('db');
            $select = $db->select();
            $select->from('subscribedfeeds, feeds', '*');
            $select->where('subscribedfeeds.Username = ?', $username);
            $select->where('feeds.feedname=subscribedfeeds.feedname');
            $results = $db->fetchAll($select);

            $view = Zend::registry('view');
            $view->username = $username;
            $view->feeds = $results;
            echo $view->render('viewFeeds.php');
        }
    }

    public function noRouteAction()
    {
        $this->_redirect('/');
    }
}

?>
从注册库中检索 filterSession 对象及用户名,如清单 7 所示。如果用户已登录,我们从数据库中检索该用户当前订阅的提要。这些都会在 viewFeeds 视图中展示,稍后我们会在教程中提到。

TOP

 430 123
发新话题