Zend Framework 中文手册:企业级Web开发指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Zend Framework是一个开源的PHP框架,旨在用于构建企业级Web应用。该手册详细介绍了框架的核心理念、架构、关键组件和实际应用。包括MVC设计模式、控制器、模型、视图、服务定位器、表单与验证、路由与调度、RESTful API、国际化与本地化、缓存、邮件发送、安全防护和测试等,旨在帮助开发者深入理解并高效使用Zend Framework,提高开发效率,构建高效、稳定、安全的Web应用。 Zend Framework手册 中文版

1. MVC设计模式在Zend Framework中的应用

1.1 MVC设计模式概述

MVC(Model-View-Controller)设计模式将应用程序分为三个核心组件,它们通过相互作用提供一个清晰的分层结构。在Zend Framework中,MVC模式被用作构建Web应用程序的基石。模型(Model)代表数据和业务逻辑,视图(View)负责展示用户界面,而控制器(Controller)则处理用户输入并调用模型和视图来完成整个应用程序的业务流程。

1.2 Zend Framework中的MVC实现

Zend Framework通过组件化的方式实现了MVC架构,其中 Zend\Mvc\MvcEvent 是核心,它在应用程序的生命周期内触发事件,使得开发者可以挂载自定义逻辑。控制器在Zend Framework中扮演中心角色,它不仅管理着模型和视图的调用,还响应用户的请求。模型通常使用 Zend\Db 模块与数据库交互,视图则通过 Zend\View 模块渲染输出。

1.3 从MVC到现实应用的迁移

将MVC理论应用到实际的Web开发中,需要对每个组件的职责有深刻理解。在Zend Framework中,通过控制器来驱动整个流程,模型层处理数据逻辑,而视图则负责生成HTML或其他格式的输出。理解这一点,开发者便能够使用Zend Framework开发出高效、可维护、具有良好架构的Web应用程序。

在接下来的章节中,我们将深入探讨如何在Zend Framework中定制和优化控制器、模型和视图,以及如何将它们整合在一起,创建出功能完备的Web应用。

2. 控制器的使用与定制技巧

2.1 控制器的基本结构和功能

2.1.1 控制器的作用和设计原则

控制器在MVC架构中扮演着指挥官的角色,它负责接收用户的请求,处理这些请求,并指导模型和视图协同工作以产生响应。在Zend Framework中,控制器具有以下主要职责:

  • 接收请求:控制器处理用户通过HTTP请求发送的数据。
  • 处理请求:控制器决定如何处理请求,包括调用相应的模型来获取数据。
  • 数据准备:控制器准备数据,以供视图渲染。
  • 响应发送:控制器将处理结果,通常是一个视图渲染的页面,发送回客户端。

设计控制器时应遵循以下几个原则:

  • 单一职责:一个控制器应只负责一组相关的功能,避免过度膨胀。
  • 模块化:控制器应易于扩展和维护,鼓励将功能分解为可重用的组件。
  • 分层设计:控制器应只处理HTTP请求的逻辑部分,不直接处理业务逻辑。

2.1.2 创建和配置控制器实例

创建一个基本的Zend Framework控制器可以通过继承 Zend\Controller\Action 类实现。下面是一个简单的控制器实例化和配置的示例:

// Application/Controller/IndexController.php
class Application_Controller_IndexController extends Zend\Controller\Action
{
    public function init()
    {
        // 初始化方法,可以配置默认的动作等
    }
    public function indexAction()
    {
        // 默认动作
        echo "Hello, Zend Framework!";
    }
}

application.ini 文件中配置控制器:

[production]
resources.router.routes.default.type = "Zend\Controller\Router\Route\Standard"
resources.router.routes.default.route = "/:controller/:action/*"
resources.router.routes.default.defaults.module = "default"
resources.router.routes.default.defaults.controller = "index"
resources.router.routes.default.defaults.action = "index"

[staging : production]
resources.router.routes.default.defaults.env = "staging"

[development : production]
resources.router.routes.default.defaults.env = "development"

在该配置中, application.ini 定义了一个默认的路由规则,该规则将请求映射到指定的模块、控制器和动作。例如,访问 /index/index 将会触发 index 控制器的 index 动作。

2.2 控制器的高级定制

2.2.1 使用插件和钩子扩展功能

Zend Framework支持使用插件和钩子来扩展控制器的功能。这些插件可以在动作执行前后进行自定义处理,例如进行权限检查、日志记录或修改响应。

class MyPlugin extends Zend\Controller\Plugin\Abstract
{
    public function preDispatch(Zend\Controller\Action $action)
    {
        // 在动作执行前执行的代码
    }
    public function postDispatch(Zend\Controller\Action $action)
    {
        // 在动作执行后执行的代码
    }
}

bootstrap.php 文件中注册该插件:

$frontController = Zend\Controller\Front::getInstance();
$frontController->registerPlugin(new MyPlugin());

2.2.2 自定义控制器类和方法

除了使用内置的 Zend\Controller\Action 类外,还可以自定义控制器类以满足特定的业务需求。例如,创建一个 BaseController 类,其中包含共享的逻辑和方法:

class BaseController extends Zend\Controller\Action
{
    public function doSomethingCommon()
    {
        // 共享的方法逻辑
    }
}

然后其他控制器继承这个基类:

class SomeController extends BaseController
{
    public function someAction()
    {
        // 可以使用doSomethingCommon方法
        $this->doSomethingCommon();
    }
}

2.2.3 控制器的路由和重定向策略

路由是将用户请求映射到控制器动作的过程。Zend Framework允许开发者创建自定义路由规则以实现复杂的URL结构。

class CustomRoute extends Zend\Controller\Router\Route\Abstract
{
    public function match(Zend\Controller\Router\HostStack $router, Zend\HTTP\Request $request)
    {
        // 自定义匹配逻辑
    }
    public function assemble(array $urlOptions = array(), $reset = false, array $encode = array())
    {
        // 自定义组装URL逻辑
    }
}

重定向是一种将用户请求转发到另一个位置的机制。在控制器动作中,可以使用以下代码来实现重定向:

$this->_helper->redirector->gotoSimple('index', 'index', 'default');

或者使用路由名称进行重定向:

$this->_helper->redirector->gotoRoute(array('action' => 'index'), 'default');

以上内容展示了控制器在Zend Framework中的一些基本使用方法和高级定制技巧。掌握这些技巧能够帮助开发者更好地构建和维护Web应用的MVC结构。在下一节中,我们将继续深入探讨控制器的高级定制,包括如何利用插件和钩子来扩展控制器的功能。

3. 模型与数据库的互动操作

3.1 模型的构建和数据访问

3.1.1 模型的定义和使用场景

模型(Model)在MVC架构中是核心组件之一,负责表示应用中的数据以及处理数据相关的逻辑。它作为数据访问层,是数据库访问的抽象,减少了直接对数据库的依赖。在Zend Framework中,模型通常对应于数据表,提供了统一的接口来执行CRUD(创建、读取、更新、删除)操作。

使用场景通常包括:

  • 数据的组织和管理:对数据进行分类存储和管理,保证数据的一致性和完整性。
  • 业务逻辑的实现:处理数据的转换、验证或业务规则。
  • 数据访问的优化:通过模型实现查询优化,提高性能和可维护性。

3.1.2 数据库适配器和数据访问层

数据库适配器是连接特定数据库和应用程序之间的桥梁。在Zend Framework中,可以使用多种数据库适配器,如MySQL、PostgreSQL等。数据访问层利用适配器封装数据库操作,使得代码与特定数据库解耦,提高代码的可移植性和可维护性。

下面是一个使用Zend Framework的PDO适配器进行数据库操作的示例代码:

<?php
// 创建模型实例
$model = new Model();

// 使用PDO适配器进行数据库查询
$results = $model->getAdapter()->fetchAll('SELECT * FROM table_name');

// 对查询结果进行处理
foreach ($results as $row) {
    echo $row['column_name'] . "\n";
}
?>

在这段代码中, Model 类需要继承自 Zend_Db_Table_Abstract ,负责管理数据表的结构和关系。 getAdapter() 方法返回当前表的数据库适配器实例, fetchAll() 方法执行SQL查询并返回结果集。

3.2 数据库操作的高级应用

3.2.1 数据库迁移和版本控制

数据库迁移是指将数据库从一个版本迁移到另一个版本的过程。在 Zend Framework 中,可以使用迁移工具如 Zend Db Migrations 来进行数据库结构的版本控制。

数据库迁移步骤包括:

  1. 创建迁移文件:定义数据库的变更,如增加或删除列。
  2. 更新数据库:执行迁移文件中的变更。
  3. 回滚迁移:撤销已执行的变更。

示例迁移文件的代码如下:

<?php
use Zend\Db\Sql\Ddl\CreateTable;
use Zend\Db\Sql\Ddl\Column\Integer;
use Zend\Db\Sql\Ddl\Column\Varchar;

return new Migration(array(
    'name' => '2018-01-01-1234-add-users-table',
    'primary' => array('user_id'),
    'table' => 'users',
    'columns' => array(
        new Integer('user_id', false, array('auto_increment')),
        new Varchar('username', 50, array('null' => false)),
        new Varchar('password', 50, array('null' => false)),
    ),
    'constraints' => array(
        'primary' => new Primary('user_id'),
    ),
    'indexes' => array(
        new Index('username_idx', array('username')),
    ),
));
?>

3.2.2 使用ORM进行复杂查询

对象关系映射(Object-Relational Mapping,ORM)是一种数据访问技术,它将关系数据库中的表映射为应用程序中的对象。Zend Framework使用 Zend_Db 组件支持简单的ORM操作,更复杂的查询可以使用 Zend_Db_Expr 表达式。

例如,构建一个使用 Zend_Db_Expr 进行复杂查询的代码示例:

<?php
// 假设 $adapter 是 Zend_Db_Adapter 对象
$adapter = Zend_Db::factory(...);

// 创建复杂查询的表达式
复杂的表达式 = new Zend_Db_Expr("CONCAT(first_name, ' ', last_name) AS full_name");

// 使用表达式构建查询
$select = $adapter->select()
    ->from(array('p' => 'person'), new Zend_Db_Expr('COUNT(*) as "row_count"'))
    ->joinLeft(array('a' => 'address'), 'a.person_id = p.person_id', array())
    ->where($复杂的表达式 . ' = ?', 'John Doe')
    ->group('p.city');

// 执行查询并获取结果
$results = $adapter->fetchAll($select);

// 输出结果
var_dump($results);
?>

3.2.3 数据库事务的管理和优化

数据库事务是一系列操作的集合,这些操作作为一个整体单元被执行,要么全部成功,要么全部失败。Zend Framework 提供了对事务的管理支持,可以确保数据操作的完整性。

实现事务的代码示例:

<?php
// 开启事务
$adapter->beginTransaction();

try {
    // 执行数据操作
    $adapter->update(...);
    $adapter->insert(...);

    // 如果所有操作成功,则提交事务
    $adapter->commit();
} catch (Exception $e) {
    // 如果出现异常,则回滚事务
    $adapter->rollback();
}

?>

在执行事务时,应合理配置数据库连接的事务隔离级别,以避免出现锁竞争等问题,提高系统的并发性能。同时,对于复杂的事务操作,需要合理规划回滚点,以确保数据的一致性和系统稳定性。

4. 视图模板的设计与展示技巧

视图模板是构建动态网站不可或缺的一部分,它负责将应用程序的数据以用户友好的方式展示出来。在Zend Framework中,视图模板以PHP脚本和可选的布局文件的形式存在。本章节深入探讨视图模板的设计与展示技巧,通过动态内容渲染、JavaScript/AJAX的集成以及布局和部件的使用,来提升最终用户的交互体验。

4.1 视图模板的创建与使用

4.1.1 视图模板的作用和基本构成

视图模板在MVC架构中担任展示层的角色,它将模型层传递的数据进行格式化,最终输出为HTML或其他格式。它的作用不仅仅限于显示数据,还包括了数据的布局、样式化以及与用户的交互设计。

在Zend Framework中,视图模板文件通常位于 application/views/scripts/ 目录下,文件扩展名为 .phtml ,这是一种混合了PHP和HTML的模板文件。视图模板的基本构成包括视图脚本的头部定义、视图变量的赋值以及输出语句等。

4.1.2 动态内容的渲染和输出控制

在视图模板中,动态内容的渲染是核心功能之一。通过在控制器中传递数据,这些数据可以在视图中被接收并进行渲染。例如,控制器中的一个动作可能会这样传递数据给视图:

// 在控制器中传递数据给视图
$this->view->message = 'Hello, World!';

然后,在视图模板 message.phtml 中,数据可以这样被输出:

<p><?php echo $this->escape($this->message); ?></p>

在这个例子中, escape 方法用于避免XSS攻击,确保输出的内容安全。

4.2 提升视图的用户体验

4.2.1 结合JavaScript和AJAX优化前端

随着前端技术的发展,结合JavaScript和AJAX已经成为提升用户体验的重要手段。在Zend Framework中,可以通过视图助手(view helper)来引入JavaScript和管理AJAX请求。

视图助手是一个封装了特定功能的PHP类,它可以在视图模板中被调用。例如,一个用于弹出确认框的视图助手可以这样实现:

// 创建一个视图助手
class View\Helper\ConfirmBox extends Zend\View\Helper\AbstractHelper
{
    public function __invoke($message, $onConfirm)
    {
        // 生成JavaScript代码
        $js = "if (confirm('{$message}')) { {$onConfirm} }";
        return $this->view->inlineScript($js);
    }
}

然后,在视图模板中调用这个视图助手:

// 在视图模板中使用视图助手
echo $this->confirmBox('Are you sure?', 'alert("Confirmed!");');

4.2.2 使用布局和部件构建复杂的UI

为了构建复杂的用户界面(UI),Zend Framework支持使用布局和部件。布局文件充当页面的模板,而部件则是可重复使用的界面片段。

布局文件通常位于 application/views/layouts/ 目录,它们定义了页面的骨架。例如,一个简单的布局文件 layout.phtml 可能如下所示:

<!DOCTYPE html>
<html>
<head>
    <title><?php echo $this->headTitle(); ?></title>
    <!-- 其他头部信息 -->
</head>
<body>
    <?php echo $this->layout()->content; ?>
</body>
</html>

在视图模板中,可以通过 $this->layout() 方法设置特定的内容到布局的 content 属性,然后渲染整个页面。

4.2.3 视图模板的继承和复用

视图模板的继承和复用是提升开发效率和降低维护成本的关键。通过在视图模板中使用 include 指令可以引用其他模板文件,利用 block 功能可以复用布局中定义的代码块。

使用 include 指令可以这样实现:

// 在父视图模板中
<?php echo $this->include('partial/header.phtml'); ?>

partial/header.phtml 中的内容将在父视图模板中被渲染。

对于模板继承,可以利用 block 指令定义可被子模板覆盖的代码块,如下所示:

// 在父布局文件中定义一个名为'content'的块
<?php if ($this->hasBlock('content')): ?>
    <?php echo $this->block('content'); ?>
<?php else: ?>
    <!-- 默认内容 -->
<?php endif; ?>

然后,在子视图模板中覆盖这个块:

// 在子视图模板中覆盖'content'块
$this->beginBlock('content');
// 用户特定的内容
$this->endBlock();

通过这种方式,视图模板变得灵活且可复用,同时也使得维护和更新变得更加方便。

接下来,本章节将进一步探索如何通过Service Locator与依赖注入,优化和简化服务管理及组件之间的依赖关系。

5. Service Locator与依赖注入

5.1 Service Locator模式的原理和实现

5.1.1 Service Locator模式的定义和优势

Service Locator模式是一种服务定位模式,其核心思想是创建一个中心化的注册表(通常是一个服务容器),用于存放和管理应用程序中所有服务的实例。当某个组件需要一个服务时,它不直接创建服务的实例,而是向Service Locator请求所需的服务。

Service Locator模式的优势在于它提供了一种松耦合的依赖关系管理方式。组件不需要知道如何实例化它所需的服务,这样的信息被抽象化到了Service Locator中。这使得服务的替换和测试变得更加容易,因为可以随时改变Service Locator中的实现,而不需要修改依赖于该服务的组件代码。

5.1.2 Service Locator在Zend Framework中的应用

Zend Framework 1采用Service Locator模式来管理应用程序中的服务依赖关系。开发者可以利用ZF提供的Service Locator来获取服务实例,而不必关心服务的具体实现。在ZF2及以后的版本中,Service Locator模式被依赖注入模式所取代,但在某些特定场景下,了解Service Locator模式依然十分重要。

在Zend Framework中,Service Locator通常在应用程序的启动阶段进行配置,开发者可以在一个中心位置定义所有服务。当应用程序请求一个服务时,Service Locator负责查找并返回服务实例。如果服务尚未创建,Service Locator会负责初始化服务实例,然后再返回给请求者。

接下来的章节将探讨依赖注入设计模式以及如何在Zend Framework中实现依赖注入。

5.2 依赖注入的设计模式和实践

5.2.1 依赖注入的原理和类型

依赖注入(Dependency Injection, DI)是一种设计模式,它允许对象定义其依赖关系,而不是创建或查找依赖对象。这些依赖关系通常通过构造函数、工厂方法或属性被注入到对象中。依赖注入的出现主要是为了解决对象之间耦合度过高、难以测试和维护的问题。

依赖注入的类型主要有三种:

  • 构造器注入(Constructor Injection)
  • 设值注入(Setter Injection)
  • 接口注入(Interface Injection)

构造器注入是在对象创建时通过构造函数传入依赖对象,这种方式可以保证依赖对象在对象生命周期内不会改变,提高了代码的可测试性。设值注入则是通过setter方法来设置依赖对象,更加灵活,但同时也带来了运行时的不确定性。接口注入通过定义注入接口来实现依赖的注入,这种方法较为少见,因其强制依赖注入框架的使用。

5.2.2 实现依赖注入的策略和示例

在Zend Framework中,依赖注入可以通过多种方式实现。一个常见的策略是使用服务管理器(Service Manager),这是一个内置的服务容器,负责管理应用程序中服务的生命周期。

首先,我们需要定义服务,例如一个用户服务:

class UserService
{
    public function __construct(UserRepositoryInterface $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function getUserById($id)
    {
        return $this->userRepository->getUserById($id);
    }
}

接下来,创建服务接口 UserRepositoryInterface

interface UserRepositoryInterface
{
    public function getUserById($id);
}

然后实现接口:

class UserRepository implements UserRepositoryInterface
{
    public function getUserById($id)
    {
        // 模拟从数据库获取用户信息的逻辑
    }
}

最后,在服务管理器中配置服务:

$serviceManager = new ServiceManager([
    'factories' => [
        UserService::class => function ($container) {
            return new UserService($container->get(UserRepositoryInterface::class));
        },
        UserRepositoryInterface::class => function ($container) {
            return new UserRepository();
        },
    ]
]);

在这个例子中,我们通过服务管理器来创建 UserService UserRepository 的实例,并且 UserService 依赖于 UserRepositoryInterface 。通过工厂方法模式,我们控制了对象的创建过程,并将依赖注入到对象中。这样,我们不仅减少了各个组件之间的耦合,也提高了代码的可测试性和可维护性。

总结来说,Service Locator与依赖注入在Zend Framework中有其特定的应用场景和优势。理解这两种模式对于构建一个灵活、可维护的PHP应用程序至关重要。

6. 表单处理与数据验证的策略

表单作为Web应用中收集用户输入的重要工具,其设计和实现质量直接影响用户体验和数据安全。在Zend Framework中,表单处理和数据验证是构建健壮Web应用不可或缺的环节。本章节将从表单的创建和管理开始,探讨数据验证的最佳实践,帮助开发者在应用中实现高效、安全的表单交互。

6.1 表单的创建和管理

在 Zend Framework 中,Zend_Form 组件是用于创建表单的工具。它提供了一套丰富的功能,包括字段定义、数据验证、装饰器和事件处理。开发者可以使用它来快速构建复杂的表单,而不必从头开始编写HTML和验证逻辑。

6.1.1 Zend_Form组件的使用和定制

Zend_Form 组件提供了一个对象导向的界面来定义表单。它允许开发者通过声明的方式添加表单元素、设置验证规则以及配置表单的呈现方式。在Zend Framework 2之后,Zend\Form 提供了一个模块化的表单构建方法,利用表单元素、输入过滤器和验证器的组合来创建功能强大的表单。

下面是一个使用Zend_Form组件创建一个简单用户注册表单的例子:

use Zend\Form\Element;
use Zend\Form\Form;

class UserForm extends Form
{
    public function __construct($name = null)
    {
        // 调用父类的构造函数
        parent::__construct($name);
        $this->add([
            'name' => 'username',
            'type' => Element\Text::class,
            'options' => [
                'label' => 'Username',
            ],
            'attributes' => [
                'required' => 'required',
                'placeholder' => 'Enter your username',
            ],
        ]);
        // 添加其他字段如密码、邮箱等
        // 设置表单提交按钮
        $this->add([
            'name' => 'submit',
            'type' => Element\Submit::class,
            'attributes' => [
                'value' => 'Submit',
            ],
        ]);
        // 设置输入过滤器和验证器
        $this->setInputFilter(new UserFormFilter());
    }
}

在这个例子中,我们创建了一个名为 UserForm 的表单类,它继承自 Form 。在构造函数中,我们添加了一个文本类型的 username 字段,并设置了其属性和验证规则。我们同样添加了一个提交按钮,并可以继续添加其他字段。最后,通过一个独立的 UserFormFilter 类来设置输入过滤器和验证器。

6.1.2 动态表单的构建和数据收集

动态表单是指在运行时根据业务逻辑的不同要求,动态添加或删除表单字段的表单。Zend_Form 提供了多种方法来支持动态表单的构建,使得开发者可以根据需要调整表单结构。比如,在处理一个表单时,根据某些条件决定是否显示某些字段或增加新的字段。

动态表单的一个常见场景是在表单的某些字段依赖于另一些字段的值时。例如,在选择了一个特定的职业后,表单可能会添加更多的专业相关问题。这种情况下,可以使用表单元素的 conditional() 方法来控制元素的显示。

$form->getElement('profession')->setConditionals([
    'required' => function ($element) {
        $value = $element->getValue();
        return $value == 'doctor';
    }
]);

这个例子中,'profession' 字段将仅在用户选择了 'doctor' 时成为必填项。这提供了一种灵活的方式在表单中进行逻辑判断和动态变化。

6.2 数据验证的最佳实践

在Web应用中,数据验证是防止错误和恶意输入的重要措施。Zend Framework通过Zend\Form组件提供的验证器(Validators)和输入过滤器(Input Filters)来支持数据验证。开发者可以利用这些工具来确保用户输入的数据既符合预期的格式,也符合业务规则。

6.2.1 验证器的类型和选择

Zend Framework 提供了众多内置验证器,如 NotEmpty , StringLength , EmailAddress , Date , Regex 等。根据表单字段的特定需求,开发者可以选择合适的验证器来确保数据的有效性。

例如,对于一个邮箱地址字段,可以使用 EmailAddress 验证器:

$form->getElement('email')->addValidator(new \Zend\Validator\EmailAddress());

在某些场景中,单一验证器可能无法满足需求,因此可以将多个验证器组合使用。

6.2.2 前后端验证的整合和安全

前后端验证指的是在客户端和服务器端都进行数据验证。客户端验证可以提高用户体验,减少无效的服务器请求。服务器端验证是安全的必要步骤,确保即使用户绕过了客户端验证,数据仍然得到检查。

为了确保数据在传输过程中的安全,开发者应当使用服务器端的验证。客户端验证可以使用JavaScript进行,但应当把验证逻辑的决定权留到服务器端。在Zend Framework中,可以通过设置表单的 use_input_filter_specs 选项为 true 来在客户端应用与服务器端相同的验证规则。

6.2.3 自定义验证规则和验证器

虽然Zend Framework提供了大量的内置验证器,但开发者可能仍需根据特定的业务需求创建自定义验证器。创建自定义验证器通常涉及实现 Zend\Validator\ValidatorInterface 接口或者扩展 Zend\Validator\AbstractValidator 类。

假设我们需要创建一个自定义的邮箱验证器来处理特定的邮箱格式:

use Zend\Validator\AbstractValidator;

class CustomEmailValidator extends AbstractValidator
{
    const INVALID = 'invalid';

    protected $messageTemplates = [
        self::INVALID => 'Invalid type given. String expected',
    ];

    public function isValid($value)
    {
        $this->setValue($value);

        // 自定义邮箱验证逻辑
        if (!preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/', $value)) {
            $this->error(self::INVALID);
            return false;
        }

        return true;
    }
}

在这个例子中,我们定义了一个简单的邮箱验证器,通过正则表达式来匹配邮箱格式。 isValid 方法根据验证规则返回布尔值。如果验证失败,可以通过 error() 方法返回自定义的错误信息。

通过结合使用内置验证器、客户端和服务器端验证以及自定义验证器,开发者可以确保应用的数据处理既符合用户需求又满足安全标准。

7. 路由与控制器调度详解

7.1 路由系统的构建和配置

7.1.1 路由机制的原理和作用

在Web应用中,路由系统扮演着至关重要的角色,它是将客户端请求映射到后端特定控制器和动作的桥梁。路由机制的核心在于将URL的结构解析为可以由应用程序识别和处理的参数。这种机制允许开发者将复杂的业务逻辑封装在控制器中,同时通过用户友好的URL呈现给最终用户。

在Zend Framework中,路由的配置是灵活且强大的。通过定义路由规则,我们可以处理不同格式的URL,甚至可以从URL中直接提取参数供控制器使用。此外,路由系统也支持路由的重写,这意味着可以在不更改URL结构的情况下更改背后对应的控制器和动作。

7.1.2 创建自定义路由规则

自定义路由规则是实现复杂URL处理的关键。通过编写自定义路由,可以将更复杂的路径或参数映射到特定的控制器和动作。

// 示例代码:定义自定义路由规则
$router = $this->getRouter();
$router->addRoute('custom-route', new Zend_Controller_Router_Route(
    ':module/:controller/:action/*',
    array(
        'module'     => 'default',
        'controller' => 'index',
        'action'     => 'index'
    )
));

在上面的例子中,我们创建了一个名为 custom-route 的路由,它将形如 /module/controller/action 的URL映射到相应的模块、控制器和动作。星号( * )表示该路由可以接受任意数量的附加参数。

7.2 控制器调度的高级应用

7.2.1 分发器的工作机制

控制器调度是Zend Framework处理客户端请求的下一个重要步骤。分发器(Front Controller的Dispatcher)是处理调度过程的核心组件,它负责调用合适的控制器和动作来响应请求。

分发器的工作机制是根据路由系统解析得到的参数,查找相应的模块、控制器和动作,然后实例化对应的控制器类,并调用指定的方法来处理请求。如果请求的控制器或动作不存在,分发器会尝试调用默认的控制器或动作。

7.2.2 前后端路由的同步和冲突解决

在开发过程中,有时候会遇到前后端路由出现不同步的情况,比如在单页面应用(SPA)中,前端路由可能会与后端的路由发生冲突。解决这类冲突通常需要对路由策略进行调整,以确保前后端能够和平共存。

// 示例代码:在Zend Framework中处理路由冲突
// 修改应用配置文件,为SPA指定特定的控制器和动作
$router->addRoute('spa', new Zend_Controller_Router_Route(
    'app',
    array(
        'module'     => 'spa',
        'controller' => 'index',
        'action'     => 'index'
    )
));

在这个例子中,我们定义了一个名为 spa 的路由规则,当访问 /app 时,会调用 spa 模块的 index 控制器中的 index 动作。这样,即使前端路由使用了相同的路径,后端也可以通过这个规则来避免冲突。

7.2.3 多语言和多环境下的路由策略

在多语言和多环境部署的场景中,路由系统需要能够支持不同配置和语言的灵活切换。Zend Framework提供了针对这些场景的策略,以确保应用的可扩展性和国际化。

一个常见的做法是根据用户请求的语言环境来调整路由规则,这样可以针对不同的语言环境提供特定的控制器和视图。

// 示例代码:根据语言环境调整路由规则
// 在路由初始化代码中添加对语言的支持
$router->addRoute('lang-default', new Zend_Controller_Router_Route(
    ':lang/:controller/:action/*',
    array(
        'lang'       => 'en',
        'controller' => 'index',
        'action'     => 'index'
    )
));

// 根据当前请求的语言设置lang参数
$defaultRoute = $router->getRoute('lang-default');
params = $defaultRoute->getParams();
params['lang'] = $userLanguage; // 假设$userLanguage是根据用户请求获取的语言代码
$router->addRoute('lang-custom', new Zend_Controller_Router_Route(':lang/*', $params));

通过上述策略,我们创建了一个新的路由规则 lang-custom ,它会根据用户语言设置调整 lang 参数。这样,每个用户的请求都会基于他们选择的语言环境加载相应的内容。

在路由和控制器调度方面,Zend Framework提供了强大而灵活的工具,使得开发者能够应对各种复杂的Web应用场景。通过以上章节的介绍和示例,我们了解了如何根据特定的需求来构建和配置路由规则,以及如何解决在多语言和多环境下的路由策略问题。这些知识对于设计和优化高性能、高可用性的Web应用至关重要。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Zend Framework是一个开源的PHP框架,旨在用于构建企业级Web应用。该手册详细介绍了框架的核心理念、架构、关键组件和实际应用。包括MVC设计模式、控制器、模型、视图、服务定位器、表单与验证、路由与调度、RESTful API、国际化与本地化、缓存、邮件发送、安全防护和测试等,旨在帮助开发者深入理解并高效使用Zend Framework,提高开发效率,构建高效、稳定、安全的Web应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问控制 2.1.6. 查询 ACL 2.2. 精细的访问控制 2.2.1. 精细的访问控制 2.2.2. 除去访问控制 2.3. 高级用法 2.3.1. 保存 ACL 数据确保持久性 2.3.2. 使用声明(Assert)来编写条件性的 ACL 规则 3. Zend_Auth 3.1. 简介 3.1.1. 适配器 3.1.2. 结果 3.1.3. 身份的持久(Persistence) 3.1.3.1. 在PHP Session 中的缺省持久(Persistence) 3.1.3.2. 实现订制存储 3.1.4. 使用Zend_Auth 3.2. 数据库表认证 3.2.1. 简介 3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 3.4.3. 配置选项 3.4.4. Resolvers 3.4.4.1. 文件 Resolver 3.4.5. 基本用法 4. Zend_Cache 4.1. 简介 4.2. 缓存原理 4.2.1. Zend_Cache 工厂方法 4.2.2. 标记纪录 4.2.3. 缓存清理 4.3. Zend_Cache前端 4.3.1. Zend_Cache_Core 4.3.1.1. 简介 4.3.1.2. 可用选项 4.3.1.3. 例子 4.3.2. Zend_Cache_Frontend_Output 4.3.2.1. 简介 4.3.2.2. 可用的选项 4.3.2.3. 例子 4.3.3. Zend_Cache_Frontend_Function 4.3.3.1. Introduction 4.3.3.2. A可用的选项 4.3.3.3. 例子 4.3.4. Zend_Cache_Frontend_Class 4.3.4.1. Introduction 4.3.4.2. Available options 4.3.4.3. Examples 4.3.5. Zend_Cache_Frontend_File 4.3.5.1. Introduction 4.3.5.2. Available options 4.3.5.3. Examples 4.3.6. Zend_Cache_Frontend_Page 4.3.6.1. Introduction 4.3.6.2. Available options (for this frontend in Zend_Cache factory) 4.3.6.3. Examples 4.4. Zend_Cache后端 4.4.1. Zend_Cache_Backend_File 4.4.2. Zend_Cache_Backend_Sqlite 4.4.3. Zend_Cache_Backend_Memcached 4.4.4. Zend_Cache_Backend_Apc 4.4.5. Zend_Cache_Backend_ZendPlatform 5. Zend_Config 5.1. 简介 5.2. 操作理论 5.3. Zend_Config_Ini 5.4. Zend_Config_Xml 6. Zend_Console_Getopt 6.1. Getopt 简介 6.2. 声明 Getopt 规则 6.2.1. 用短语法声明选项 6.2.2. 用长语法声明选项 6.3. 读取(Fetching)选项和参数 6.3.1. 操作 Getopt 异常 6.3.2. 通过名字读取 (Fetching)选项 6.3.3. 报告选项 6.3.4. 读取非选项参数 6.4. 配置 Zend_Console_Getopt 6.4.1. 添加选项规则 6.4.2. 添加帮助信息 6.4.3. 添加选项别名 6.4.4. 添加参数列表 6.4.5. 添加配置 7. Zend_Controller 7.1. Zend_Controller 快速入门 7.1.1. 简介 7.1.2. 入门 7.1.2.1. 文件系统的组织结构 7.1.2.2. 设置文件根目录 7.1.2.3. 创建URL重写规则 7.1.2.4. 创建你的bootstrap文件 7.1.2.5. 创建默认的控制器(Action Controller) 7.1.2.6. 创建你的视图脚本 7.1.2.7. 创建你自己的错误控制器 7.1.2.8. 访问站点! 7.2. Zend_Controller 基础 7.3. 前端控制器 7.3.1. 概述 7.3.2. 主要方法 7.3.2.1. getInstance() 7.3.2.2. setControllerDirectory() 和 addControllerDirectory() 7.3.2.3. dispatch() 7.3.2.4. run() 7.3.3. 环境访问器方法 7.3.4. 前端控制器参数 7.3.5. 继承前端控制器 7.4. 请求对象 7.4.1. 介绍 7.4.2. HTTP 请求 7.4.2.1. 访问请求数据 7.4.2.2. 基地址和子目录 7.4.2.3. 决定请求方式 7.4.2.4. 删除 AJAX 请求 7.4.3. 子类化请求对象 7.5. 标准路由器:Zend_Controller_Router_Rewrite 7.5.1. 简介 7.5.2. 使用路由器 7.5.3. 基本的Rewrite路由器操作 7.5.4. 缺省路由 7.5.5. 基本 URL 和子目录 7.5.6. Route Types 7.5.6.1. Zend_Controller_Router_Route 7.5.6.1.1. 变量缺省 7.5.6.1.2. 变量请求 7.5.6.2. Zend_Controller_Router_Route_Static 7.5.6.3. Zend_Controller_Router_Route_Regex 7.5.7. 使用 Zend_Config with the RewriteRouter 7.5.8. Subclassing the Router 7.6. 分发器 7.6.1. 概述 7.6.2. 子类化分发器 7.7. 动作控制器 7.7.1. 简介 7.7.2. 对象初始化 7.7.3. 派遣前后的钩子 7.7.4. 访问器 7.7.5. 视图集成 7.7.5.1. 视图初始化 7.7.5.2. 解析(Rendering)视图 7.7.6. 实用方法 7.7.7. 继承(Subclassing)动作控制器 7.8. 动作助手 7.8.1. 介绍 7.8.2. 初始化助手 7.8.3. 助手经纪人 7.8.4. 内建的动作助手 7.8.4.1. 动作堆栈(助手) 7.8.4.2. AutoComplete 7.8.4.2.1. AutoCompletion with Dojo 7.8.4.2.2. AutoCompletion with Scriptaculous 7.8.4.3. ContextSwitch and AjaxContext 7.8.4.3.1. 缺省可用的上下文 7.8.4.3.2. 创建定制的上下文 7.8.4.3.3. 为每个动作设置上下文 7.8.4.3.4. 初始化上下文开关 7.8.4.3.5. 另外的功能 7.8.4.3.6. AjaxContext 函数 7.8.4.4. FlashMessenger 7.8.4.4.1. 简介 7.8.4.4.2. Basic Usage Example 7.8.4.5. JSON 7.8.4.6. 转向器(Redirector) 7.8.4.6.1. 介绍 7.8.4.6.2. 基础用例 7.8.4.7. ViewRenderer 7.8.4.7.1. 介绍 7.8.4.7.2. API 7.8.4.7.3. 基础用法示例 7.8.4.7.4. 高级用法示例 7.8.5. 编写自己的助手 7.9. 响应对象 7.9.1. 用法 7.9.2. 处理消息头 7.9.3. 命名片段 7.9.4. 在响应对象中测试异常 7.9.5. 子类化响应对象 7.10. 插件 7.10.1. 简介 7.10.2. 编写插件 7.10.3. 使用插件 7.10.4. 获取和控制插件 7.10.5. 包含在标准发行包中的插件 7.10.5.1. 动作堆栈 7.10.5.2. Zend_Controller_Plugin_ErrorHandler 7.10.5.2.1. 使用 ErrorHandler 作为一个 404 处理器(handler) 7.10.5.2.2. 处理以前呈现的(rendered)输出 7.10.5.2.3. 插件用法示例 7.10.5.2.4. 错误控制器示例 7.11. 使用传统的模块目录结构 7.11.1. 简介 7.11.2. 指定模块控制器目录 7.11.3. Routing to modules 7.11.4. 模块或全局缺省控制器 7.12. MVC 异常 7.12.1. 介绍 7.12.2. 如何处理异常? 7.12.3. 可能遭遇的MVC异常 7.13. 从以前的版本移植 7.13.1. 从 1.0.x 到 1.5.0 或更新的版本的移植 7.13.2. 从 0.9.3 到 1.0.0RC1 或更新的版本的移植 7.13.3. 从 0.9.2 移植到 0.9.3 或更新的版本 7.13.4. 从 0.6.0 移植到 0.8.0 或更新的版本 7.13.5. 从 0.2.0 或以前的版本移植到 0.6.0 8. Zend_Currency 8.1. Zend_Currency 简介 8.1.1. 为什么使用 Zend_Currency ? 8.2. 如何使用货币 8.2.1. 从货币创建输出 8.2.2. 修改货币格式 8.2.3. Zend_Currency 的信息方法 8.2.4. 设置新缺省值 8.2.5. 加速 Zend_Currency 8.3. 从前面的版本迁移 8.3.1. 从 1.0.2 到 1.0.3 或更新的迁移 9. Zend_Date 9.1. Introduction 9.1.1. Always Set a Default Timezone 9.1.2. Why Use Zend_Date? 9.2. 操作理论 9.2.1. 内部(Internals) 9.3. Basic Methods 9.3.1. The current date 9.3.2. Zend_Date by Example 9.3.2.1. Ouput a Date 9.3.2.2. Setting a Date 9.3.2.3. Adding and Subtracting Dates 9.3.2.4. Comparation of dates 9.4. Zend_Date API Overview 9.4.1. Zend_Date Options 9.4.1.1. Selecting the date format type 9.4.1.2. DST and Date Math 9.4.1.3. Month Calculations 9.4.1.4. Speed up date localization and normalization with Zend_Cache 9.4.1.5. Receiving syncronised timestamps with Zend_TimeSync 9.4.2. Working with Date Values 9.4.3. Basic Zend_Date Operations Common to Many Date Parts 9.4.3.1. List of Date Parts 9.4.3.2. List of Date Operations 9.4.4. Comparing Dates 9.4.5. Getting Dates and Date Parts 9.4.6. Working with Fractions of Seconds 9.4.7. Sunrise / Sunset 9.5. Creation of dates 9.5.1. Create the actual date 9.5.2. Create a date from database 9.5.3. Create dates from an array 9.6. Constants for General Date Functions 9.6.1. Using Constants 9.6.2. List of All Constants 9.6.3. Self-Defined OUTPUT Formats with ISO 9.6.4. Self-defined OUTPUT formats using PHP's date() format specifiers 9.7. Working examples 9.7.1. Checking dates 9.7.2. Sunrise and Sunset 9.7.3. Timezones 10. Zend_Db 10.1. Zend_Db_Adapter 10.1.1. 简介 10.1.2. 添加引号防止数据库攻击 10.1.3. 直接查询 10.1.4. 事务处理 10.1.5. 插入数据行 10.1.6. 更新数据行 10.1.7. 删除数据行 10.1.8. 取回查询结果 10.2. Zend_Db_Statement 10.2.1. Creating a Statement 10.2.2. Executing a Statement 10.2.3. Fetching Results from a SELECT Statement 10.2.3.1. Fetching a Single Row from a Result Set 10.2.3.2. Fetching a Complete Result Set 10.2.3.3. Changing the Fetch Mode 10.2.3.4. Fetching a Single Column from a Result Set 10.2.3.5. Fetching a Row as an Object 10.3. Zend_Db_Profiler 10.3.1. Introduction 10.3.2. Using the Profiler 10.3.3. Advanced Profiler Usage 10.3.3.1. Filter by query elapsed time 10.3.3.2. Filter by query type 10.3.3.3. Retrieve profiles by query type 10.4. Zend_Db_Select 10.4.1. 简介 10.4.2. 同一表中查询多列数据 10.4.3. 多表联合查询 10.4.4. WHERE条件 10.4.5. GROUP BY分句 10.4.6. HAVING 条件 10.4.7. ORDER BY 分句 10.4.8. 通过总数和偏移量进行LIMIT限制 10.4.9. 通过页数和总数进行LIMIT限制 10.5. Zend_Db_Table 10.5.1. 简介 10.5.2. 开始 10.5.3. 表名和主键 10.5.4. 插入数据 10.5.5. 更新数据 10.5.6. Deleting Rows 10.5.7. 根据主键查找数据 10.5.8. 取回一条记录 10.5.9. 取回多条记录 10.5.10. Adding Domain Logic 10.6. Zend_Db_Table_Row 10.6.1. 简介 10.6.2. 取回一条记录 10.6.3. 修改数据 10.7. Zend_Db_Table_Rowset 10.7.1. 简介 10.7.2. 取回结果集 10.7.3. 遍历结果集 10.8. Zend_Db_Table Relationships 10.8.1. Introduction 10.8.2. Defining Relationships 10.8.3. Fetching a Dependent Rowset 10.8.4. Fetching a Parent Row 10.8.5. Fetching a Rowset via a Many-to-many Relationship 10.8.6. Cascading Write Operations 10.8.6.1. Notes Regarding Cascading Operations 11. Zend_Debug 11.1. 输出变量的值 (Dumping Variables) 12. Zend_Exception 12.1. 使用“异常” 13. Zend_Feed 13.1. 介绍 13.2. 导入Feeds 13.2.1. 定制 feeds 13.2.1.1. 导入定制的数组 13.2.1.2. 导入定制的数据源 13.2.1.3. Dumping feed 内容 13.3. 从网页上获得Feed 13.4. RSS Feed的使用 13.5. Atom Feed的使用 13.6. 单个Atom条目的处理 13.7. 修改Feed和条目结构 13.8. 自定义Feed和条目类 14. Zend_Filter 14.1. 简介 14.1.1. 什么是过滤器(filter)? 14.1.2. 过滤器的基本用法 14.1.3. 使用静态 get() 方法 14.2. 标准过滤器类 14.2.1. Alnum 14.2.2. Alpha 14.2.3. BaseName 14.2.4. Digits 14.2.5. Dir 14.2.6. HtmlEntities 14.2.7. Int 14.2.8. RealPath 14.2.9. StringToLower 14.2.10. StringToUpper 14.2.11. StringTrim 14.2.12. StripTags 14.3. 过滤器链 14.4. 编写过滤器 14.5. Zend_Filter_Input 14.5.1. Declaring Filter and Validator Rules 14.5.2. Creating the Filter and Validator Processor 14.5.3. Retrieving Validated Fields and other Reports 14.5.3.1. Querying if the input is valid 14.5.3.2. Getting Invalid, Missing, or Unknown Fields 14.5.3.3. Getting Valid Fields 14.5.4. Using Metacommands to Control Filter or Validator Rules 14.5.4.1. The FIELDS metacommand 14.5.4.2. The PRESENCE metacommand 14.5.4.3. The DEFAULT_VALUE metacommand 14.5.4.4. The ALLOW_EMPTY metacommand 14.5.4.5. The BREAK_CHAIN metacommand 14.5.4.6. The MESSAGES metacommand 14.5.4.7. Using options to set metacommands for all rules 14.5.5. Adding Filter Class Namespaces 14.6. Zend_Filter_Inflector 14.6.1. Operation 14.6.2. Setting Paths To Alternate Filters 14.6.3. Setting the Inflector Target 14.6.4. Inflection Rules 14.6.4.1. Static Rules 14.6.4.2. Filter Inflector Rules 14.6.4.3. Setting Many Rules At Once 14.6.5. Utility Methods 14.6.6. Using Zend_Config with Zend_Filter_Inflector 15. Zend_Form 15.1. Zend_Form 15.2. Zend_Form 快速起步 15.2.1. 创建表单对象 15.2.2. 添加表单元素 15.2.3. 解析(Render)表单 15.2.4. 检查表单是否有效 15.2.5. 获得错误状态 15.2.6. 放到一起 15.2.7. 使用 Zend_Config 对象 15.2.8. 结论 15.3. 使用 Zend_Form_Element 生成表单元素 15.3.1. 插件加载器 15.3.2. 过滤器 15.3.3. 校验器 15.3.4. 装饰器 15.3.5. 元数据和属性 15.3.6. 标准元素 15.3.7. Zend_Form_Element 方法 15.3.8. 配置 15.3.9. 定制元素 15.4. 使用 Zend_Form 生成表单 15.4.1. 插件加载器 15.4.2. 元素(Elements) 15.4.2.1. 组装和读取数值 15.4.2.2. 全局操作 15.4.2.3. 和元素交互使用的方法 15.4.3. 显示组(Display Groups) 15.4.3.1. 全局操作 15.4.3.2. 使用定制的显示组类 15.4.3.3. 和显示组交互使用的方法 15.4.3.4. Zend_Form_DisplayGroup 方法 15.4.4. 子表单 15.4.4.1. 全局操作 15.4.4.2. 和子表单交互使用的方法 15.4.5. 元数据(Metadata)和属性(Attributes) 15.4.6. 装饰器 15.4.7. 校验 15.4.8. 方法 15.4.9. 配置 15.4.10. 定制表单 15.5. 使用 Zend_Form_Decorator 生成定制的表单标识(Markup) 15.5.1. 操作 15.5.2. 标准装饰器 15.5.3. 定制装饰器 15.6. Zend Framework 带有的标准表单元素 15.6.1. Zend_Form_Element_Button 15.6.2. Zend_Form_Element_Checkbox 15.6.3. Zend_Form_Element_Hidden 15.6.4. Zend_Form_Element_Hash 15.6.5. Zend_Form_Element_Image 15.6.6. Zend_Form_Element_MultiCheckbox 15.6.7. Zend_Form_Element_Multiselect 15.6.8. Zend_Form_Element_Password 15.6.9. Zend_Form_Element_Radio 15.6.10. Zend_Form_Element_Reset 15.6.11. Zend_Form_Element_Select 15.6.12. Zend_Form_Element_Submit 15.6.13. Zend_Form_Element_Text 15.6.14. Zend_Form_Element_Textarea 15.7. Zend Framework 带有的标准表单装饰器(Decorators) 15.7.1. Zend_Form_Decorator_Callback 15.7.2. Zend_Form_Decorator_Description 15.7.3. Zend_Form_Decorator_DtDdWrapper 15.7.4. Zend_Form_Decorator_Errors 15.7.5. Zend_Form_Decorator_Fieldset 15.7.6. Zend_Form_Decorator_Form 15.7.7. Zend_Form_Decorator_FormElements 15.7.8. Zend_Form_Decorator_HtmlTag 15.7.9. Zend_Form_Decorator_Image 15.7.10. Zend_Form_Decorator_Label 15.7.11. Zend_Form_Decorator_ViewHelper 15.7.12. Zend_Form_Decorator_ViewScript 15.8. Zend_Form 的国际化 15.8.1. 在表单中初始化 I18n 15.8.2. 标准 I18N 目标 15.9. Zend_Form 的高级用法 15.9.1. 数组符号(Notation) 15.9.2. 多页表单 16. Zend_Gdata 16.1. Introduction to Gdata 16.1.1. Structure of Zend_Gdata 16.1.2. Interacting with Google Services 16.1.3. Obtaining instances of Zend_Gdata classes 16.1.4. Google Data Client Authentication 16.1.5. Dependencies 16.1.6. Creating a new Gdata client 16.1.7. Common query parameters 16.1.8. Fetching a feed 16.1.9. Working with multi-page feeds 16.1.10. Working with data in feeds and entries 16.1.11. Updating entries 16.1.12. Posting entries to Google servers 16.1.13. Deleting entries on Google servers 16.2. Authenticating with AuthSub 16.2.1. Creating an AuthSub authenticated Http Client 16.2.2. Revoking AuthSub authentication 16.3. Authenticating with ClientLogin 16.3.1. Creating a ClientLogin authenticated Http Client 16.3.2. Terminating a ClientLogin authenticated Http Client 16.4. Using Google Calendar 16.4.1. Connecting To The Calendar Service 16.4.1.1. Authentication 16.4.1.2. Creating A Service Instance 16.4.2. Retrieving A Calendar List 16.4.3. Retrieving Events 16.4.3.1. Queries 16.4.3.2. Retrieving Events In Order Of Start Time 16.4.3.3. Retrieving Events In A Specified Date Range 16.4.3.4. Retrieving Events By Fulltext Query 16.4.3.5. Retrieving Individual Events 16.4.4. Creating Events 16.4.4.1. Creating Single-Occurrence Events 16.4.4.2. Event Schedules and Reminders 16.4.4.3. Creating Recurring Events 16.4.4.4. Using QuickAdd 16.4.5. Modifying Events 16.4.6. Deleting Events 16.4.7. Accessing Event Comments 16.5. Using Google Documents List Data API 16.5.1. Get a List of Documents 16.5.2. Upload a Document 16.5.3. Searching the documents feed 16.5.3.1. Get a List of Word Processing Documents 16.5.3.2. Get a List of Spreadsheets 16.5.3.3. Performing a text query 16.6. Using Google Spreadsheets 16.6.1. Create a Spreadsheet 16.6.2. Get a List of Spreadsheets 16.6.3. Get a List of Worksheets 16.6.4. Interacting With List-based Feeds 16.6.4.1. Get a List-based Feed 16.6.4.2. Reverse-sort Rows 16.6.4.3. Send a Structured Query 16.6.4.4. Add a Row 16.6.4.5. Edit a Row 16.6.4.6. Delete a Row 16.6.5. Interacting With Cell-based Feeds 16.6.5.1. Get a Cell-based Feed 16.6.5.2. Send a Cell Range Query 16.6.5.3. Change Contents of a Cell 16.7. Using Google Apps Provisioning 16.7.1. Setting the current domain 16.7.1.1. Setting the domain for the service class 16.7.1.2. Setting the domain for query classes 16.7.2. Interacting with users 16.7.2.1. Creating a user account 16.7.2.2. Retrieving a user account 16.7.2.3. Retrieving all users in a domain 16.7.2.4. Updating a user account 16.7.2.4.1. Resetting a user's password 16.7.2.4.2. Forcing a user to change their password 16.7.2.4.3. Suspending a user account 16.7.2.4.4. Granting administrative rights 16.7.2.5. Deleting user accounts 16.7.3. Interacting with nicknames 16.7.3.1. Creating a nickname 16.7.3.2. Retrieving a nickname 16.7.3.3. Retrieving all nicknames for a user 16.7.3.4. Retrieving all nicknames in a domain 16.7.3.5. Deleting a nickname 16.7.4. Interacting with email lists 16.7.4.1. Creating an email list 16.7.4.2. Retrieving all email lists to which a recipient is subscribed 16.7.4.3. Retrieving all email lists in a domain 16.7.4.4. Deleting an email list 16.7.5. Interacting with email list recipients 16.7.5.1. Adding a recipient to an email list 16.7.5.2. Retrieving the list of subscribers to an email list 16.7.5.3. Removing a recipient from an email list 16.7.6. Handling errors 16.8. Using Google Base 16.8.1. Connect To The Base Service 16.8.1.1. Authentication 16.8.1.2. Create A Service Instance 16.8.2. Retrieve Items 16.8.2.1. Send a Structured Query 16.8.2.1.1. Query Customer Items Feed 16.8.2.1.2. Query Snippets Feed 16.8.2.2. Iterate through the Items 16.8.3. Insert, Update, and Delete Customer Items 16.8.3.1. Insert an Item 16.8.3.2. Modify an Item 16.8.3.3. Delete an Item 16.9. Using the YouTube data API 16.9.1. Retrieving video feeds 16.9.1.1. Searching for videos by metadata 16.9.1.2. Searching for videos by categories and tags/keywords 16.9.1.3. Retrieving standard feeds 16.9.1.4. Retrieving videos uploaded by a user 16.9.1.5. Retrieving videos favorited by a user 16.9.1.6. Retrieving video responses for a video 16.9.2. Retrieving video comments 16.9.3. Retrieving playlist feeds 16.9.3.1. Retrieving the playlists of a user 16.9.3.2. Retrieving a specific playlist 16.9.4. Retrieving a list of a user's subscriptions 16.9.5. Retrieving a user's profile 16.10. Using Picasa Web Albums 16.10.1. Connecting To The Service 16.10.1.1. Authentication 16.10.1.2. Creating A Service Instance 16.10.2. Understanding and Constructing Queries 16.10.3. Retrieving Feeds And Entries 16.10.3.1. Retrieving A User 16.10.3.2. Retrieving An Album 16.10.3.3. Retrieving A Photo 16.10.3.4. Retrieving A Comment 16.10.3.5. Retrieving A Tag 16.10.4. Creating Entries 16.10.4.1. Creating An Album 16.10.4.2. Creating A Photo 16.10.4.3. Creating A Comment 16.10.4.4. Creating A Tag 16.10.5. Deleting Entries 16.10.5.1. Deleting An Album 16.10.5.2. Deleting A Photo 16.10.5.3. Deleting A Comment 16.10.5.4. Deleting A Tag 16.10.5.5. Optimistic Concurrency (Notes On Deletion) 16.11. Catching Gdata Exceptions 17. Zend_Http 17.1. Zend_Http_Client 17.1.1. 简介 17.1.2. 带有指定的HTTP头的基本 GET 请求 17.1.3. 发送请求到多个域名 17.1.4. 改变HTTP timeout时间 17.1.5. 动态指定HTTP Header 17.1.6. 构造 HTTP POST, PUT, 和 DELETE 请求 17.2. Zend_Http_Client - Advanced Usage 17.2.1. HTTP Redirections 17.2.2. Adding Cookies and Using Cookie Persistence 17.2.3. Setting Custom Request Headers 17.2.4. File Uploads 17.2.5. Sending Raw POST Data 17.2.6. HTTP Authentication 17.2.7. Sending Multiple Requests With the Same Client 17.3. Zend_Http_Client - Connection Adapters 17.3.1. Overview 17.3.2. The Socket Adapter 17.3.3. The Proxy Adapter 17.3.4. The Test Adapter 17.3.5. Creating your own connection adapters 17.4. Zend_Http_Cookie and Zend_Http_CookieJar 17.4.1. Introduction 17.4.2. Instantiating Zend_Http_Cookie Objects 17.4.3. Zend_Http_Cookie getter methods 17.4.4. Zend_Http_Cookie: Matching against a scenario 17.4.5. The Zend_Http_CookieJar Class: Instantiation 17.4.6. Adding Cookies to a Zend_Http_CookieJar object 17.4.7. Retrieving Cookies From a Zend_Http_CookieJar object 17.5. Zend_Http_Response 17.5.1. 简介 18. Zend_Json 18.1. 简介 18.2. 基本用法 18.3. JSON 对象 18.4. XML 到 JSON 转换 19. Zend_Layout 19.1. 简介 19.2. Zend_Layout 快速入门 19.2.1. 布局脚本 19.2.2. 和Zend Framework MVC一起使用 Zend_Layout 19.2.3. 使用Zend_Layout做为独立的组件 19.2.4. 尝试一下布局 19.3. Zend_Layout 配置选项 19.3.1. 范例 19.4. Zend_Layout 高级用法 19.4.1. 定制视图对象 19.4.2. 定制前端控制器插件 19.4.3. 定制动作助手 19.4.4. 定制布局脚本路径解析(Resolution):使用变形器(Inflector) 20. Zend_Loader 20.1. 动态加载文件和类 20.1.1. 加载文件 20.1.2. 加载类 20.1.3. 判定某个文件是否可读 20.1.4. 使用 Autoloader 20.2. 加载插件 20.2.1. 基本用例 20.2.2. 处理插件路径 20.2.3. 测试插件和获取类的名字 21. Zend_Locale 21.1. Introduction 21.1.1. What is Localization 21.1.2. What is a Locale? 21.1.3. How are Locales Represented? 21.1.4. Selecting the Right Locale 21.1.5. Usage of automatic Locales 21.1.6. Using a default Locale 21.1.7. ZF Locale-Aware Classes 21.1.8. Zend_Locale_Format::setOptions(array $options) 21.1.9. Speed up Zend_Locale and it's subclasses 21.2. Using Zend_Locale 21.2.1. Copying, Cloning, and Serializing Locale Objects 21.2.2. Equality 21.2.3. Default locales 21.2.4. Set a new locale 21.2.5. Getting the language and region 21.2.6. Obtaining localized strings 21.2.7. Obtaining translations for "yes" and "no" 21.2.8. Get a list of all known locales 21.3. Normalization and Localization 21.3.1. Number normalization: getNumber($input, Array $options) 21.3.1.1. Precision and Calculations 21.3.2. Number localization 21.3.3. Number testing 21.3.4. Float value normalization 21.3.5. Floating point value localization 21.3.6. Floating point value testing 21.3.7. Integer value normalization 21.3.8. Integer point value localization 21.3.9. Integer value testing 21.3.10. Numeral System Conversion 21.3.10.1. List of supported numeral systems 21.4. Working with Dates and Times 21.4.1. Normalizing Dates and Times 21.4.2. Testing Dates 21.4.3. Normalizing a Time 21.4.4. Testing Times 21.5. Supported Languages for Locales 21.6. Supported Regions for Locales 22. Zend_Log 22.1. 概述 22.1.1. 创建Log 22.1.2. 日志消息 22.1.3. 销毁Log 22.1.4. 使用内建的消息等级 22.1.5. 添加用户定义的日志等级 22.1.6. 理解日志事件 22.2. Writers 22.2.1. 写入到流(Streams) 22.2.2. 写入到数据库 22.2.3. 踩熄Writer 22.2.4. 测试 Mock 22.2.5. 组合Writers 22.3. Formatters 22.3.1. 简单格式化 22.3.2. 格式化到XML 22.4. 过滤器 22.4.1. 对所有Writer过滤 22.4.2. 过滤一个Writer实例 23. Zend_Mail 23.1. 简介 23.1.1. 起步 23.1.2. 配置缺省的 sendmail 传送器(transport) 23.2. 通过SMTP发送邮件 23.3. 通过一个SMTP连接发送多个邮 23.4. 使用不同的Transport对象 23.5. HTML邮件 23.6. 附件 23.7. 增加收件人 23.8. 控制MIME分界线 23.9. 外加邮件头信息 23.10. 字符集 23.11. 编码 23.12. SMTP 身份验证 23.13. Securing SMTP Transport 23.14. Reading Mail Messages 23.14.1. Simple example using Pop3 23.14.2. Opening a local storage 23.14.3. Opening a remote storage 23.14.4. Fetching messages and simple methods 23.14.5. Working with messages 23.14.6. Checking for flags 23.14.7. Using folders 23.14.8. Advanced Use 23.14.8.1. Using NOOP 23.14.8.2. Caching instances 23.14.8.3. Extending Protocol Classes 23.14.8.4. Using Quota (since 1.5) 24. Zend_Measure 24.1. Introduction 24.2. Creation of Measurements 24.2.1. Creating measurements from integers and floats 24.2.2. Creating measurements from strings 24.2.3. Measurements from localized strings 24.3. Outputting measurements 24.3.1. Automatic output 24.3.2. Outputting values 24.3.3. Output with unit of measurement 24.3.4. Output as localized string 24.4. Manipulating Measurements 24.4.1. Convert 24.4.2. Add and subtract 24.4.3. Compare 24.4.4. Compare 24.4.5. Manually change values 24.4.6. Manually change types 24.5. Types of measurements 24.5.1. Hints for Zend_Measure_Binary 24.5.2. Hints for Zend_Measure_Number 24.5.3. Roman numbers 25. Zend_Memory 25.1. 概述 25.1.1. 简介 25.1.2. 操作原理 25.1.2.1. 内存管理器 25.1.2.2. 内存容器 25.1.2.3. 锁定的内存 25.1.2.4. 可移动内存 25.2. 内存管理器 25.2.1. 创建一个内存管理器 25.2.2. 管理内存对象 25.2.2.1. 创建可移动的对象 25.2.2.2. 创建锁定的对象 25.2.2.3. 销毁对象 25.2.3. 内存管理器设置 25.2.3.1. 内存限制 25.2.3.2. MinSize 25.3. 内存对象 25.3.1. 可移动的 25.3.2. 锁定的 25.3.3. 内存容器 '值' 属性. 25.3.4. 内存容器接口 25.3.4.1. getRef() 方法 25.3.4.2. touch() 方法 25.3.4.3. lock() 方法 25.3.4.4. unlock() 方法 25.3.4.5. isLocked() 方法 26. Zend_Mime 26.1. Zend_Mime 26.1.1. 简介 26.1.2. 静态方法和常量 26.1.3. 实例化Zend_Mime 26.2. Zend_Mime_Message 26.2.1. 简介 26.2.2. 实例化 26.2.3. 增加MIME消息段 26.2.4. 分界线处理 26.2.5. 解析字符串,创建Zend_Mime_Message对象(实验性的) 26.3. Zend_Mime_Part 26.3.1. 简介 26.3.2. 实例化 26.3.3. 解析(rendering)消息段为字符串的方法 27. Zend_Pdf 27.1. 简介 27.2. 生成和加载 PDF 文档 27.3. 保存修改到 PDF 文档 27.4. 文档页面 27.4.1. 页面生成 27.4.2. 页面克隆 27.5. Drawing. 27.5.1. Geometry. 27.5.2. Colors. 27.5.3. Shape Drawing. 27.5.4. Text Drawing. 27.5.5. Using fonts. 27.5.6. Starting in 1.5, Extracting fonts. 27.5.7. Image Drawing. 27.5.8. Line drawing style. 27.5.9. Fill style. 27.5.10. Rotations. 27.5.11. Save/restore graphics state. 27.5.12. Clipping draw area. 27.5.13. Styles. 27.6. Zend_Pdf module usage example. 28. Zend_Registry 28.1. 使用对象注册表(Registry) 28.1.1. 设置Registry中的值 28.1.2. 获取Registry中的值 28.1.3. 创建一个Registry对象 28.1.4. 像访问数组一样访问Registry对象 28.1.5. 对象方式访问Registry 28.1.6. 查询一个索引是否存在 28.1.7. 扩展Registry对象 28.1.8. 删除静态注册表 29. Zend_Rest 29.1. Introduction 29.2. Zend_Rest_Client 29.2.1. Introduction 29.2.2. Responses 29.2.3. Request Arguments 29.3. Zend_Rest_Server 29.3.1. Introduction 29.3.2. REST Server Usage 29.3.3. Calling a Zend_Rest_Server Service 29.3.4. Sending A Custom Status 29.3.5. Returning Custom XML Responses 30. Zend_Search_Lucene 30.1. 概述 30.1.1. 简介 30.1.2. 文档和字段对象 30.1.3. 理解字段类型 30.2. 建立索引 30.2.1. 创建新索引 30.2.2. 更新索引 30.3. 搜索索引 30.3.1. 建立查询 30.3.2. 搜索结果 30.3.3. 结果评分 30.4. Query Language 30.4.1. Terms 30.4.2. Fields 30.4.3. Starting in 1.5, Wildcards 30.4.4. Term Modifiers 30.4.5. Starting in 1.5, Range Searches 30.4.6. Starting in 1.5, Fuzzy Searches 30.4.7. Proximity Searches 30.4.8. Boosting a Term 30.4.9. Boolean Operators 30.4.9.1. AND 30.4.9.2. OR 30.4.9.3. NOT 30.4.9.4. &&, ||, and ! operators 30.4.9.5. + 30.4.9.6. - 30.4.9.7. No Operator 30.4.10. Grouping 30.4.11. Field Grouping 30.4.12. Escaping Special Characters 30.5. 查询类型 30.5.1. 单项查询 30.5.2. 多项查询 30.5.3. 短语查询 30.6. 字符集 30.6.1. UTF-8 和单字节字符集支持 30.7. 扩展性 30.7.1. 文本分析 30.7.2. 评分算法 30.7.3. 存储容器 30.8. 与 Java Lucene 的互操作性 30.8.1. 文件格式 30.8.2. 索引目录 30.8.3. Java 源代码 30.9. Advanced 30.9.1. Using the index as static property 30.10. Best Practices 30.10.1. Field names 30.10.2. Indexing performance 30.10.3. Index during Shut Down 30.10.4. Retrieving documents by unique id 30.10.5. Memory Usage 30.10.6. Encoding 30.10.7. Index maintenance 31. Zend_Server 31.1. 简介 31.2. Zend_Server_Reflection 31.2.1. 简介 31.2.2. 用法 32. Zend_Service 32.1. 简介 32.2. Zend_Service_Akismet 32.2.1. Introduction 32.2.2. Verify an API key 32.2.3. Check for spam 32.2.4. Submitting known spam 32.2.5. Submitting false positives (ham) 32.2.6. Zend-specific Accessor Methods 32.3. Zend_Service_Amazon 32.3.1. Introduction 32.3.2. Country Codes 32.3.3. Looking up a Specific Amazon Item by ASIN 32.3.4. Performing Amazon Item Searches 32.3.5. Using the Alternative Query API 32.3.5.1. Introduction 32.3.6. Zend_Service_Amazon Classes 32.3.6.1. Zend_Service_Amazon_Item 32.3.6.1.1. Zend_Service_Amazon_Item::asXML() 32.3.6.1.2. Properties 32.3.6.2. Zend_Service_Amazon_Image 32.3.6.2.1. Properties 32.3.6.3. Zend_Service_Amazon_ResultSet 32.3.6.3.1. Zend_Service_Amazon_ResultSet::totalResults() 32.3.6.4. Zend_Service_Amazon_OfferSet 32.3.6.4.1. Properties 32.3.6.5. Zend_Service_Amazon_Offer 32.3.6.5.1. Zend_Service_Amazon_Offer Properties 32.3.6.6. Zend_Service_Amazon_SimilarProduct 32.3.6.6.1. Properties 32.3.6.7. Zend_Service_Amazon_Accessories 32.3.6.7.1. Properties 32.3.6.8. Zend_Service_Amazon_CustomerReview 32.3.6.8.1. Properties 32.3.6.9. Zend_Service_Amazon_EditorialReview 32.3.6.9.1. Properties 32.3.6.10. Zend_Service_Amazon_Listmania 32.3.6.10.1. Properties 32.4. Zend_Service_Audioscrobbler 32.4.1. Introduction to Searching Audioscrobbler 32.4.2. Users 32.4.3. Artists 32.4.4. Tracks 32.4.5. Tags 32.4.6. Groups 32.4.7. Forums 32.5. Zend_Service_Delicious 32.5.1. Introduction 32.5.2. Retrieving posts 32.5.3. Zend_Service_Delicious_PostList 32.5.4. Editing posts 32.5.5. Deleting posts 32.5.6. Adding new posts 32.5.7. Tags 32.5.8. Bundles 32.5.9. Public data 32.5.9.1. Public posts 32.5.10. HTTP client 32.6. Zend_Service_Flickr 32.6.1. 对Flickr搜索的介绍 32.6.2. 查找 Flickr 用户 32.6.3. 获得 Flickr 图像详细资料 32.6.4. Zend_Service_Flickr 类 32.6.4.1. Zend_Service_Flickr_ResultSet 32.6.4.1.1. 属性 32.6.4.1.2. Zend_Service_Flickr_ResultSet::totalResults() 32.6.4.2. Zend_Service_Flickr_Result 32.6.4.2.1. 属性 32.6.4.3. Zend_Service_Flickr_Image 32.6.4.3.1. 属性 32.7. Zend_Service_Simpy 32.7.1. Introduction 32.7.2. Links 32.7.3. Tags 32.7.4. Notes 32.7.5. Watchlists 32.8. Zend_Service_StrikeIron 32.8.1. Overview 32.8.2. Registering with StrikeIron 32.8.3. Getting Started 32.8.4. Making Your First Query 32.8.5. Examining Results 32.8.6. Handling Errors 32.8.7. Checking Your Subscription 32.9. Zend_Service_StrikeIron: Bundled Services 32.9.1. ZIP Code Information 32.9.2. U.S. Address Verification 32.9.3. Sales & Use Tax Basic 32.10. Zend_Service_StrikeIron: Advanced Uses 32.10.1. Using Services by WSDL 32.10.2. Viewing SOAP Transactions 32.11. Zend_Service_Yahoo 32.11.1. 简介 32.11.2. 用Yahoo!来搜索网页 32.11.3. 用Yahoo!来查找图片 32.11.4. Finding Local Businesses and Services with Yahoo! 32.11.5. 搜索Yahoo! 新闻 32.11.6. Zend_Service_Yahoo 类 32.11.6.1. Zend_Service_Yahoo_ResultSet 32.11.6.1.1. Zend_Service_Yahoo_ResultSet::totalResults() 32.11.6.1.2. Properties 32.11.6.2. Zend_Service_Yahoo_WebResultSet 32.11.6.3. Zend_Service_Yahoo_ImageResultSet 32.11.6.4. Zend_Service_Yahoo_LocalResultSet 32.11.6.5. Zend_Service_Yahoo_NewsResultSet 32.11.6.6. Zend_Service_Yahoo_Result 32.11.6.6.1. Properties 32.11.6.7. Zend_Service_Yahoo_WebResult 32.11.6.7.1. 属性 32.11.6.8. Zend_Service_Yahoo_ImageResult 32.11.6.8.1. 属性 32.11.6.9. Zend_Service_Yahoo_LocalResult 32.11.6.9.1. 属性 32.11.6.10. Zend_Service_Yahoo_NewsResult 32.11.6.10.1. 属性 32.11.6.11. Zend_Service_Yahoo_Image 32.11.6.11.1. Properties 33. Zend_Session 33.1. 简介 33.2. 基本用法 33.2.1. 实例教程 33.2.2. 迭代会话命名空间 33.2.3. 会话命名空间的访问器 33.3. 高级用法 33.3.1. 开启会话 33.3.2. 锁住会话命名空间 33.3.3. 命名空间过期 33.3.4. 会话封装和控制器 33.3.5. 防止每个命名空间有多重实例 33.3.6. 使用数组 33.3.7. 在对象中使用会话 33.3.8. 在单元测试中使用会话 33.4. 全局会话管理 33.4.1. 配置选项 33.4.2. 错误:Headers Already Sent 33.4.3. 会话标识符 33.4.3.1. 会话劫持和会话固定 33.4.4. rememberMe(integer $seconds) 33.4.5. forgetMe() 33.4.6. sessionExists() 33.4.7. destroy(bool $remove_cookie = true, bool $readonly = true) 33.4.8. stop() 33.4.9. writeClose($readonly = true) 33.4.10. expireSessionCookie() 33.4.11. setSaveHandler(Zend_Session_SaveHandler_Interface $interface) 33.4.12. namespaceIsset($namespace) 33.4.13. namespaceUnset($namespace) 33.4.14. namespaceGet($namespace) 33.4.15. getIterator() 34. Zend_Translate 34.1. 简介 34.1.1. 开始多语言化 34.2. Zend_Translate适配器 34.2.1. 如何判断使用哪种翻译适配器 34.2.1.1. Zend_Translate_Adapter_Array 34.2.1.2. Zend_Translate_Adapter_Csv 34.2.1.3. Zend_Translate_Adapter_Gettext 34.2.1.4. Zend_Translate_Adapter_Tbx 34.2.1.5. Zend_Translate_Adapter_Tmx 34.2.1.6. Zend_Translate_Adapter_Qt 34.2.1.7. Zend_Translate_Adapter_Xliff 34.2.1.8. Zend_Translate_Adapter_XmlTm 34.2.2. 集成编写自己的适配器 34.2.3. 加速所有的适配器 34.3. Using Translation Adapters 34.3.1. Translation Source Structures 34.3.2. Creating array source files 34.3.3. Creating Gettext Source Files 34.3.4. Creating TMX Source Files 34.3.5. Creating CSV Source Files 34.3.6. Options for adapters 34.3.7. Handling languages 34.3.7.1. Automatically handling of languages 34.3.8. Automatic source detection 34.3.8.1. Language through naming directories 34.3.8.2. Language through filenames 34.3.8.2.1. Complete Filename 34.3.8.2.2. Extension of the file 34.3.8.2.3. Filename tokens 34.3.9. Checking for translations 34.3.10. Access to the source data 35. Zend_Uri 35.1. Zend_Uri 35.1.1. 概述 35.1.2. 新建一个URI 35.1.3. 操作现有的URI 35.1.4. URI 验证 35.1.5. 公共实例方法 35.1.5.1. 取得URI的Schema 35.1.5.2. 取得整个URI 35.1.5.3. 验证URI 36. Zend_Validate 36.1. 简介 36.1.1. 什么是校验器(validator)? 36.1.2. 校验器的基本用法 36.1.3. 定制消息 36.1.4. 使用静态 is() 方法 36.2. 标准校验类 36.2.1. Alnum 36.2.2. Alpha 36.2.3. Barcode 36.2.4. Between 36.2.5. Ccnum 36.2.6. 日期 36.2.7. 数字 36.2.8. Email 地址 36.2.9. 浮点数 36.2.10. GreaterThan 36.2.11. 十六进制数 36.2.12. 主机名 36.2.13. InArray 36.2.14. 整数 36.2.15. Ip 36.2.16. LessThan 36.2.17. NotEmpty 36.2.18. Regex 36.2.19. StringLength 36.3. 校验器链 36.4. 编写校验器 37. Zend_Version 37.1. 读取Zend Framework的当前版本 38. Zend_View 38.1. 简介 38.1.1. 控制器脚本 38.1.2. 视图脚本 38.1.3. 选项 38.1.4. 实用访问器 38.2. 控制器脚本 38.2.1. 变量赋值 38.2.2. 调用视图脚本并打印输出 38.2.3. 视图脚本的路径 38.3. 视图脚本 38.3.1. 转义输出(Escaping Output) 38.3.2. 使用模板系统 38.3.2.1. 使用View脚本的模板系统 38.3.2.2. 通过Zend_View_Interface接口使用模板系统 38.4. 视图助手(View Helper) 38.4.1. 基本的助手 38.4.1.1. 动作视图助手 38.4.1.2. 区域助手(Partial Helper) 38.4.1.3. 占位符助手(Placeholder Helper) 38.4.1.3.1. 具体占位符实现 38.4.1.4. 文档类型助手(Doctype Helper) 38.4.1.5. HeadLink 助手 38.4.1.6. HeadMeta 助手 38.4.1.7. HeadScript 助手 38.4.1.8. HeadStyle 助手 38.4.1.9. HeadTitle 助手 38.4.1.10. InlineScript 助手 38.4.1.11. JSON 助手 38.4.1.12. 翻译助手 38.4.2. 助手的路径 38.4.3. 编写自定义的助手类 39. Zend_XmlRpc 39.1. 介绍 39.2. Zend_XmlRpc_Client 39.2.1. 介绍 39.2.2. 带参数 39.2.2.1. 以PHP本地变量的形式传递参数 39.2.2.2. 以Zend_XmlRpc_Value 对象的形式传递参数 39.2.2.3. 将一个XML字符串解析为XML-RPC参数 39.2.3. 参数类型提示 39.2.4. 获取响应 39.3. Zend_XmlRpc_Server 39.3.1. Introduction 39.3.2. Basic Usage 39.3.3. Server Structure 39.3.4. Conventions 39.3.5. Utilizing Namespaces 39.3.6. Custom Request Objects 39.3.7. Custom Responses 39.3.8. Handling Exceptions via Faults 39.3.9. Caching Server Definitions Between Requests 39.3.10. Usage Examples 39.3.10.1. Basic Usage 39.3.10.2. Attaching a class 39.3.10.3. Attaching several classes using namespaces 39.3.10.4. Specifying exceptions to use as valid fault responses 39.3.10.5. Utilizing a custom request object 39.3.10.6. Utilizing a custom response object 39.3.10.7. Cache server definitions between requests A. 系统需求 A.1. PHP 版本需求 A.2. PHP 扩展 A.3. Zend Framework 组件 B. Zend Framework PHP 编码标准 B.1. 绪论 B.1.1. 适用范围 B.1.2. 目标 B.2. PHP File 文件格式 B.2.1. 常规 B.2.2. 缩进 B.2.3. 行的最大长度 B.2.4. 行结束标志 B.3. 命名约定 B.3.1. 类 B.3.2. 接口 B.3.3. 文件名 B.3.4. 函数和方法 B.3.5. 变量 B.3.6. 常量 B.4. 编码风格 B.4.1. PHP 代码划分(Demarcation) B.4.2. 字符串 B.4.2.1. 字符串文字 B.4.2.2. 包含单引号(')的字符串文字 B.4.2.3. 变量替换 B.4.2.4. 字符串连接 B.4.3. 数组 B.4.3.1. 数字索引数组 Numerically Indexed Arrays B.4.3.2. 关联数组 B.4.4. 类 B.4.4.1. 类的声明 B.4.4.2. 类成员变量 B.4.5. 函数和方法 B.4.5.1. 函数和方方声明 B.4.5.2. 函数和方法的用法 B.4.6. 控制语句 B.4.6.1. If / Else / Elseif B.4.6.2. Switch B.4.7. 注释文档 B.4.7.1. 格式 B.4.7.2. 文件 B.4.7.3. 类 B.4.7.4. 函数 C. 版权信息 索引 表格清单 2.1. 一个CMS范例的访问控制 3.1. 配置选项 4.1. 核心前端选项 4.2. 函数前端选项 4.3. Class frontend options 4.4. File frontend options 4.5. Page frontend options 4.6. 文件后端选项 4.7. Sqlite 后端选项 4.8. Memcached 后端选项 5.1. Zend_Config_Ini 构造器参数 8.1. 选择货币描述的常量 8.2. 选择货币位置的常量 9.1. Date Parts 9.2. Basic Operations 9.3. Date Comparison Methods 9.4. Date Output Methods 9.5. Date Output Methods 9.6. Miscellaneous Methods 9.7. Operations involving Zend_Date::HOUR 9.8. Day Constants 9.9. Week Constants 9.10. Month Constants 9.11. Year Constants 9.12. Time Constants 9.13. Timezone Constants 9.14. Date Format Constants (formats include timezone) 9.15. Date and Time Formats (format varies by locale) 9.16. Constants for ISO 8601 date output 9.17. Constants for PHP date output 9.18. Types of supported horizons for sunset and sunrise 17.1. Zend_Http_Client_Adapter_Socket configuration parameters 17.2. Zend_Http_Client configuration parameters 21.1. Details for getTranslationList($type = null, $locale = null, $value = null) 21.2. Details for getTranslation($value = null, $type = null, $locale = null) 21.3. Differences between ZF 1.0 and ZF 1.5 21.4. Format tokens for self generated number formats 21.5. List of supported numeral systems 21.6. Key values for getDate() with option 'fix_date' 21.7. Return values 21.8. Format definition 21.9. Example formats 21.10. List of all supported languages 21.11. List of all supported regions 23.1. Mail Read Feature Overview 23.2. Mail Folder Names 24.1. List of measurement types 30.1. Zend_Search_Lucene_Field 类型 32.1. Zend_Service_Amazon_Item Properties 32.2. Zend_Service_Amazon_Image Properties 32.3. Zend_Service_Amazon_OfferSet Properties 32.4. Properties 32.5. Zend_Service_Amazon_SimilarProduct Properties 32.6. Zend_Service_Amazon_Accessories Properties 32.7. Zend_Service_Amazon_CustomerReview Properties 32.8. Zend_Service_Amazon_EditorialReview Properties 32.9. Zend_Service_Amazon_Listmania Properties 32.10. Methods for retrieving public data 32.11. Methods of the Zend_Service_Delicious_SimplePost class 32.12. Zend_Service_Flickr_ResultSet 属性 32.13. Zend_Service_Flickr_Result 属性 32.14. Zend_Service_Flickr_Image 属性 32.15. Zend_Service_Yahoo_ResultSet 32.16. Zend_Service_Yahoo_LocalResultSet 属性 32.17. Zend_Service_Yahoo_Result Properties 32.18. Zend_Service_Yahoo_WebResult 属性 32.19. Zend_Service_Yahoo_ImageResult 属性 32.20. Zend_Service_Yahoo_LocalResult 属性 32.21. Zend_Service_Yahoo_NewsResult 属性 32.22. Zend_Service_Yahoo_Image Properties 34.1. Zend_Translate适配器 34.2. Options for Translation Adapters 39.1. PHP本地变量类型转化为XML-RPC类型 39.2. Zend_XmlRpc_Value 对象声明的XML-RPC类型 A.1. Zend Framework 使用的 PHP 扩展 A.2. Zend Framework 组件以及其使用到的 PHP 扩展 范例清单 2.1. 角色之间的多重继承 3.1. 修改 Session 名字空间 3.2. 使用定制存储类 3.3. 基本用法 4.1. 调用 Zend_Cache::factory()取得一个前端 4.2. Caching a database query result 4.3. 用Zend_Cache 输出前端缓存输出 5.1. 使用 Zend_Config 本身 5.2. Using Zend_Config with a PHP Configuration File 5.3. 使用 Zend_Config_Ini 5.4. 使用Zend_Config_Xml 6.1. 使用短语法 6.2. 使用长语法 6.3. 捕捉 Getopt 异常 6.4. 使用 getOption() 6.5. 使用 __get() 和 __isset() 魔术方法 6.6. 使用 getRemainingArgs() 6.7. 使用 addRules() 6.8. 使用 setHelp() 6.9. 使用 setAliases() 6.10. 使用 addArguments() 和 setArguments() 6.11. 使用 setOption() 6.12. 使用 setOptions() 7.1. 如何处理不存在的动作 7.2. 用动作、控制器和模块名来添加一个任务 7.3. 使用请求对象添加一个任务 7.4. AutoCompletion with Dojo Using Zend MVC 7.5. 允许动作响应 Ajax 的请求 7.6. 设定选项 7.7. 使用默认设定 7.8. 使用goto()的_forward()API 7.9. 通过gotoRoute()使用路由组装(route assembly) 7.10. 基本用法 7.11. 禁用自动解析 7.12. 选择另外的视图脚本 7.13. 修改注册的视图Modifying the registered view 7.14. 修改路径规则 7.15. 一个动作中解析多个视图脚本 7.16. Standard usage 7.17. Setting a different error handler 7.18. Using accessors 8.1. 从实际地方创建 Zend_Currency 的实例 8.2. 创建 Zend_Currency 实例的其它例子 8.3. 为货币创建输出 8.4. 修改货币的显示格式 8.5. 从货币中获取信息 8.6. 设置新地方 8.7. 缓存货币 9.1. Setting a default timezone 9.2. Creating the current date 9.3. get() - output a date 9.4. set() - set a date 9.5. add() - adding dates 9.6. compare() - compare dates 9.7. equals() - identify a date or date part 9.8. User-specified input date format 9.9. Operating on Parts of Dates 9.10. Date creation by instance 9.11. Static date creation 9.12. Quick creation of dates from database date values 9.13. Convenient creation of dates from database date values 9.14. Date creation by array 9.15. Example usage for self-defined ISO formats 9.16. Example usage for self-defined formats with PHP specifier 9.17. Checking dates 9.18. Getting all available cities 9.19. Getting the location for a city 9.20. Calculating sun informations 9.21. Working with timezones 9.22. Multiple timezones 10.1. Creating a SQL statement object with query() 10.2. Using a SQL statement constructor 10.3. Executing a statement with positional parameters 10.4. Executing a statement with named parameters 10.5. Using fetch() in a loop 10.6. Using fetchAll() 10.7. Setting the fetch mode 10.8. Using fetchColumn() 10.9. Using fetchObject() 10.10. Fetching a Dependent Rowset 10.11. Fetching a Dependent Rowset By a Specific Rule 10.12. Fetching a Dependent Rowset using a Zend_Db_Table_Select 10.13. Fetching Dependent Rowsets using the Magic Method 10.14. Fetching the Parent Row 10.15. Fetching a Parent Row By a Specific Rule 10.16. Fetching the Parent Row using the Magic Method 10.17. Fetching a Rowset with the Many-to-many Method 10.18. Fetching a Rowset with the Many-to-many Method By a Specific Rule 10.19. Fetching Rowsets using the Magic Many-to-many Method 10.20. Example of a Cascading Delete 10.21. Example Declaration of Cascading Operations 11.1. dump()方法使用示例 12.1. 捕捉一个异常的例子 13.1. 用Zend_Feed来处理RSS Feed数据 13.2. Atom Feed的基本用法 13.3. 读取Atom Feed的单个条目 13.4. 用条目对象直接访问Atom Feed的单个条目 13.5. 修改一个已存在的条目 13.6. 用自定义的命名空间创建一个Atom条目元素 13.7. 用自定义的命名空间继承Atom条目类 14.1. Transforming CamelCaseText to another format 14.2. Setting Multiple Rules at Once 14.3. Using Zend_Config with Zend_Filter_Inflector 15.1. 定制标签 15.2. 为所有元素设置前缀路径 15.3. 为所有元素设置装饰器(Decorators) 15.4. 为所有元素设置过滤器 15.5. 为所有的显示组设置装饰器前缀路径 15.6. 为所有显示组设置装饰器 15.7. 注册表单示例 17.1. 执行一个基本的 GET 请求 17.2. 创建一个基本的Zend_Http_Client 17.3. 发送多条header信息 17.4. 发送请求到多个域名 17.5. 用Zend_Http_Client发送POST 数据 17.6. Forcing RFC 2616 Strict Redirections on 301 and 302 Responses 17.7. Setting Cookies Using setCookie() 17.8. Enabling Cookie Stickiness 17.9. Setting A Single Custom Request Header 17.10. Setting Multiple Custom Request Headers 17.11. Using setFileUpload to Upload Files 17.12. Sending Raw POST Data 17.13. Setting HTTP Authentication User and Password 17.14. Performing consecutive requests with one client 17.15. Changing the HTTPS transport layer 17.16. Using Zend_Http_Client behind a proxy server 17.17. Testing Against a Single HTTP Response Stub 17.18. Testing Against Multiple HTTP Response Stubs 17.19. Creating your own connection adapter 17.20. Instantiating a Zend_Http_Cookie object 17.21. Stringifying a Zend_Http_Cookie object 17.22. Using getter methods with Zend_Http_Cookie 17.23. Matching cookies 17.24. 处理HTTP应答 19.1. 传递选项给构造器或startMvc() 19.2. 使用setOption() 和 setConfig() 19.3. 使用访问器 19.4. 使用Zend_Layout访问器来修改变形器(inflector) 19.5. Zend_Layout 变形器的直接修改 19.6. 定制变形器(inflectors) 20.1. loadFile() 方法范例 20.2. Example of loadClass() method 20.3. isReadable()示例: 20.4. 注册 autoloader callback 方法范例 20.5. 从继承类注册 autoload callback 方法范例 21.1. Choosing a specific locale 21.2. Automatically selecting a locale 21.3. Using automatic locales 21.4. Handling locale exceptions 21.5. Setting a default locale 21.6. Dates default to correct locale of web users 21.7. Overriding default locale selection 21.8. Performance optimization when using a default locale 21.9. Dates default to correct locale of web users 21.10. Using STANDARD definitions for setOptions() 21.11. clone 21.12. Check for equal locales 21.13. Get default locales 21.14. setLocale 21.15. getLanguage and getRegion 21.16. getTranslationList 21.17. getTranslationList 21.18. Converting country name in one language to another 21.19. All available translations 21.20. All Languages written in their native language 21.21. getQuestion() 21.22. getLocaleList() 21.23. Number normalization 21.24. Number normalization with precision 21.25. Number localization 21.26. Number localization with precision 21.27. Using a self defined number format 21.28. Number testing 21.29. Floating point value normalization 21.30. Floating point value localization 21.31. Floating point value testing 21.32. Integer value normalization 21.33. Integer value localization 21.34. Integer value testing 21.35. Converting numerals from Eastern Arabic scripts to European/Latin scripts 21.36. Converting numerals from Latin script to Eastern Arabic script 21.37. Getting 4 letter CLDR script code using a native-language name of the script 21.38. Normalizing a date 21.39. Normalizing a date by locale 21.40. Normalizing a date with time 21.41. Normalizing a userdefined date 21.42. Automatic correction of input dates 21.43. Date testing 21.44. Normalize an unknown time 21.45. Testing a time 23.1. 使用Zend_Mail发送简单邮件 23.2. 传递另外的参数给 Zend_Mail_Transport_Sendmail 传送器 23.3. 通过 SMTP 发送邮件 23.4. 通过一个SMTP连接发送多个邮件 23.5. 手工控制传送器连接 23.6. 使用不同的Transport对象 23.7. 发送HTML邮件 23.8. 带附件的邮件 23.9. 更改MIME分界线 23.10. 外加邮件头信息 23.11. 在 Zend_Mail_Transport_Smtp 中使用身份验证 23.12. Enabling a secure connection within Zend_Mail_Transport_Smtp 24.1. Converting measurements 24.2. The meter measurement 24.3. Creation using integer and floating values 24.4. Creation using strings 24.5. Arbitrary text input containing measurements 24.6. Localized string 24.7. Automatic output 24.8. Output a value 24.9. Outputting units 24.10. Convert 24.11. Adding units 24.12. Subtract 24.13. Different measurements 24.14. Identical measurements 24.15. Difference 24.16. Changing a value 24.17. Changing the type 25.1. 使用 Zend_Memory 组件 27.1. 生成新的或加载 PDF 文档 27.2. 请求 PDF 文档的指定版本 27.3. Save PDF document. 27.4. PDF 文档页面管理 27.5. Cloning existing page. 27.6. Draw a string on the page. 27.7. Draw a UTF-8-encoded string on the page. 27.8. Create a standard font. 27.9. Create a TrueType font. 27.10. Create a TrueType font, but do not embed it in the PDF document. 27.11. Do not throw an exception for fonts that cannot be embeded. 27.12. Do not compress an embedded font. 27.13. Combining font embedding options. 27.14. Extracting fonts from a loaded document. 27.15. Extracting font from a loaded document by specifying font name. 27.16. Image drawing. 27.17. Zend_Pdf module usage demo. 28.1. set() 使用示例: 28.2. get() 方法示例: 28.3. 迭代一个registry对象: 28.4. 创建一个registry对象 28.5. Example of initializing the static registry 28.6. array 方式访问示例: 28.7. 对象形式的访问: 28.8. isRegistered() 示例: 28.9. isset() 示例: 28.10. 指定静态注册表的类名: 28.11. _unsetInstance() 示例: 29.1. A basic REST request 29.2. Response Status 29.3. Using Technorati's Rest Service 29.4. Example Technorati Response 29.5. Setting Request Arguments 29.6. Basic Zend_Rest_Server Usage - Classes 29.7. Basic Zend_Rest_Server Usage - Functions 29.8. Returning Custom Status 29.9. Return Custom XML 30.1. 自定义文本分析程序 32.1. isSpam() Usage 32.2. submitSpam() Usage 32.3. submitHam() Usage 32.4. Search Amazon Using the Traditional API 32.5. Search Amazon Using the Query API 32.6. Choosing an Amazon Web Service Country 32.7. Looking up a Specific Amazon Item by ASIN 32.8. Performing Amazon Item Searches 32.9. Using the ResponseGroup Option 32.10. Search Amazon Using the Alternative Query API 32.11. Retrieving User Profile Information 32.12. Retrieving a User's Weekly Artist Chart 32.13. Retrieving Related Artists 32.14. Get all posts 32.15. Accessing post lists 32.16. Filtering a Post List with Specific Tags 32.17. Filtering a Post List by URL 32.18. Post editing 32.19. Method call chaining 32.20. Deleting posts 32.21. Adding a post 32.22. Tags 32.23. Bundles 32.24. Retrieving public data 32.25. Changing the HTTP client of Zend_Rest_Client 32.26. Configuring your HTTP client to keep connections alive 32.27. 简单的 Flickr 照片搜索 32.28. 用email地址来查找Flickr用户 32.29. 获得 Flickr 图像详细资料 32.30. Querying Links 32.31. Modifying Links 32.32. Working With Tags 32.33. Working With Notes 32.34. Retrieving Watchlists 32.35. 用Yahoo!来搜索网页 32.36. 用Yahoo!来查找图片 32.37. 用Yahoo!查找本地商务和服务信息 32.38. 搜索Yahoo! 新闻 33.1. 页面浏览计数 33.2. 新方法: 使用命名空间避免冲突 33.3. 老方法: PHP会话访问 33.4. 会话迭代 33.5. 访问会话数据 33.6. 开启全局会话 33.7. 锁住会话命名空间 33.8. 过期的例子 33.9. 带有生命期的控制器命名空间会话 33.10. 限制命名空间访问单一实例 33.11. 修改带有会话命名空间的数组数据 33.12. 在会话存储之前构造数组 33.13. 方案:重新分配一个被修改的数组 33.14. 方案:存储包括引用的数组 33.15. PHPUnit Testing Code Dependent on Zend_Session 33.16. 使用Zend_Config配置Zend_Session 33.17. 会话固定 34.1. Example of single-language PHP code 34.2. Example of multi-lingual PHP code 34.3. Example TMX file 34.4. Example CSV file 34.5. Example CSV file two 34.6. Using translation options 34.7. Handling languages with adapters 34.8. How automatically language detection works 34.9. Scanning a directory structure for sources 34.10. Directory scanning for languages 34.11. Filename scanning for languages 34.12. Checking if a text is translatable 34.13. Handling languages with adapters 35.1. 使用Zend_Uri::factory()创建一个新的URI 35.2. 使用Zend_Uri::factory()操作一个现有的URI 35.3. 使用Zend_Uri::check()进行URI 验证 35.4. 从Zend_Uri_* 对象取得模式 35.5. 从一个Zend_Uri_* 对象取得整个URI 35.6. 验证一个 Zend_Uri_* 对象 36.1. 创建简单校验类 36.2. 编写有独立条件的校验类 36.3. 带有独立条件、多重失败原因的校验 37.1. compareVersion()方法示例: 38.1. 动作视图助手的基本用法 38.2. Partials 的基本用法 38.3. 使用 PartialLoop 来解析可迭代的(Iterable)的模型 38.4. 在其它模块中解析 Partials 38.5. 占位符的基本用法 38.6. 用占位符来聚合内容 38.7. 使用占位符(Placeholders)来抓取内容 38.8. Doctype 助手的基本用法 38.9. 获取 Doctype 38.10. HeadLink 助手的基本用法 38.11. HeadMeta 助手基本用法 38.12. HeadScript 助手基本用法 38.13. Capturing Scripts Using the HeadScript Helper 38.14. HeadStyle 助手的基本用法 38.15. 用 HeadStyle 助手抓取样式声明 38.16. HeadTitle 助手基本用法 38.17. 已注册的实例 38.18. 在视图里 38.19. 直接用法 38.20. 单个参数 38.21. 参数列表 38.22. 参数数组 38.23. 动态修改地点 (locale) 38.24. 静态修改地点 (locale) 38.25. 获得当前设置的地点 39.1. 一个基本的XML-RPC请求 39.2. 用类型提示来调用一个XML-RPC服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值