热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZendFramework指南(2)

Zend_View是一个可以协助你组织视图逻辑的类。它并不使用特定的模版系统,为了简便起见,在本例中我也不会使用模版系统。然而,你可以随意使用你喜欢的。

清单12

php

Zend
::loadClass('Zend_Controller_Action');

class 
FooController extends Zend_Controller_Action 
{
    public function 
indexAction()
    {
        echo 
'FooController::indexAction()';
    }

    public function 
barAction()
    {
        echo 
'FooController::barAction()';
    }

    public function 
__call($action$arguments)
    {
        echo 
'FooController:__call()';
    }
}

?> 

  现在只需几行代码就可以很优雅地处理进入的请求了,让我们继续。
Zend_View
Zend_View是一个可以协助你组织视图逻辑的类。它并不使用特定的模版系统,为了简便起见,在本例中
我也不会使用模版系统。然而,你可以随意使用你喜欢的。
记住所有进入的请求都是由前端控制器来处理的。因此,既然应用程序的框架已经这样存在了,那么以
后的天价都必须适应它。为了演示Zend_View最基本的用法,我们将IndexController.php中的代码修改
成这样:
清单13

在视图目录(这里是views)创建一个叫做example.php的文件:
清单14 –






This is an example.




现在,当请求网站的根的资源时,应该可以看到example.php的内容。虽然现在这还不是很有用
,不过记住你的工作目标是按照一个结构化、有组织的方法来开发Web应用。
为了更清楚地利用Zend_View,将模版(example.php)修改一下,包含一些数据:
清单15

<html>
<
head>
<
title>php echo $this->escape($this->title); ?>


echo $this->escape($this->body); ?>

 


添加了两个额外的特性。$this->escape()方法必须用在所有的输出上。即便你要自己创建输出
(例如这个例子中的),也要将所有的输出进行转义,这种好习惯可以防止出现跨站脚本(XSS)。
$this->title和$this->body特性在这里是用于演示动态数据的。它们应该在控制器中定义,所以让我们
修改IndexController.php来给他们赋值:
清单16

php

Zend
::loadClass('Zend_Controller_Action');
Zend::loadClass('Zend_View');

class 
IndexController extends Zend_Controller_Action 
{
    public function 
indexAction()
    {
        
$view = new Zend_View();
        
$view->setScriptPath('/path/to/views');
        
$view->title 'Dynamic Title';
        
$view->body 'This is a dynamic body.';
        echo 
$view->render('example.php');
    }

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

?> 


现在你再浏览网站,应该看到了模版所使用的这些值。在模版中使用$this的原因是模版是在
Zend_View的实例的范围内执行的。
记住example.php仅仅是一个普通的PHP脚本,所以你可以在其中做任意你想做的事情。最好还是尽量遵
守规则,仅仅在模版中进行显示数据的工作。控制器(或者是控制器进行分配的模块)则应该承担所有
的业务逻辑。
在继续讲之前,我要最后对Zend_View做一个补充。在每个控制器的方法中实例化$view对象会要额外输
入很多东西,而我们的主要目标是更简单、更快速地进行开发。而且,如果模版都存放在同一个目录下
的话,每次都要调用setScriptPath()也是一件麻烦事。
幸好,Zend类包含了一个注册表,它可以帮助我们消除这种反复的工作。你可以使用register()方法将
$view对象存放在注册表中:
清单17
php

Zend
::register('view'$view);

?> 

可以使用registry()方法来获取它:
清单18
[复制PHP代码]PHP代码如下:

php

$view 
Zend::registry('view');

?> 


从今往后,本教程就会使用注册表了。
Zend_InputFilter
The last component this tutorial covers is Zend_InputFilter. This class provides a simple
but rigid approach to input filtering. You instantiate it by passing an array of data to be
filtered:


清单19

php

$filterPost 
= new Zend_InputFilter($_POST);

?> 


他会把数组($_POST)设置为NULL,这样就不可能再直接进行访问了。Zend_InputFilter提供了一些
根据特定条件筛选数据的方法。例如,如果你需要$_POST['name']都是字母,可以使用getAlpha()方法

清单20

php

/* $_POST{{'name'}} = 'John123Doe'; */

$filterPost = new Zend_InputFilter($_POST);

/* $_POST = NULL; */

$alphaName $filterPost->getAlpha('name');
/* $alphaName = 'JohnDoe'; */

?> 


传给每一个筛选方法的参数是对应要进行筛选的数组元素的键。该对象(在这个例子中是$filterPost
)是一个包含了有错误的数据的保护笼,这使得对数据的访问更加可控和一致。因此,当要访问输入数
据的时候,应该使用Zend_InputFilter。
Zend_Filter提供了一些静态的过滤方法,这些方法和Zend_InputFilter的方法遵循同样的规则。
创建一个新闻管理系统
尽管预览版还包含了很多组件(甚至还有更多的正在进行开发),但是只需要使用前面讨论过的组件就
可以构建简单的应用了。在构建应用的过程中,你就会对框架的基本结构和设计有一个更加清晰的理解

每个人开发应用的方式都有所不同,所以Zend Framework尽可能地尝试包容这些差异。同样,本教程是
根据我的偏好写的,所以你可以将它们调整为适合自己口味的方式。
当我开始开发某个应用时,我是先从界面开始的。这并不是说我喜欢做表面文章,花大量功夫在样式、
图片上,其实我是站在一个用户的角度来透视问题。这样,我将一个应用看作是一系列页面的集合,每
个页面对应一个唯一的URL。这个新闻管理系统有以下一些URL组成:
清单21
/
/add/news
/add/comment
/admin
/admin/approve
/view/{id}马上开始根据控制器考虑这些URL。IndexController显示新闻、AddController处理新闻和评
论的添加,AdminController处理诸如审批新闻之类的管理工作,以及ViewController用于查看指定的新
闻条目和相应的评论。
首先,如果有FooController.php,先将其删除,并修改IndexController.php并添加合适的动作,并加
入一些关于业务逻辑的注释放着:
清单22

php

Zend
::loadClass('Zend_Controller_Action');

class 
IndexController extends Zend_Controller_Action 
{
    public function 
indexAction()
    {
        
/* List the news. */
    
}

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

?> 


下面,创建AddController.php:
清单23



php

Zend
::loadClass('Zend_Controller_Action');
Zend::loadClass('Zend_View');

class 
IndexController extends Zend_Controller_Action 
{
    public function 
indexAction()
    {
        
$view = new Zend_View();
        
$view->setScriptPath('/path/to/views');
        echo 
$view->render('example.php');
    }

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

?> 

推荐阅读
author-avatar
阿加芬散阿加芬散
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有