热门标签 | 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('/');
    }
}

?> 

推荐阅读
  • 6个常见的 PHP 安全性攻击实例和阻止方法_php实例
    这篇文章主要介绍了6个常见的PHP安全性攻击实例和阻止方法,有对这方面感兴趣的小伙伴 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • jvm内存区域与溢出为什么学习jvm木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握。当一个系统出现内存溢出,内存泄露的时候 ... [详细]
  • 2月4日每日安全热点节日期间某企远程办公遭XRed攻击 ... [详细]
  • JVM(三)虚拟机栈 多合一总述
    虚拟机栈概述虚拟机栈出现背景:由于跨平台性的设计,Java的指令都是根据栈来设计的。不同CPU架构不同,所以不能设计为基于寄存器的跨平台的优点:指令集小,编译器容易实现,缺点是性能 ... [详细]
  • Python多线程的执行顺序及状态
    importthreadingimporttimeclassMyThread(threading.Thread):defrun(self): ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 一、其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储 ... [详细]
  • Java使用poi 5.0解析Excel工作簿的例子
    写在之前Excel文档是日常办公中非常普遍的一种数据记录模式。在业务场景中,往往有“导入Excel到某某系统中”的需求,所以这里记录一种使用poi5.0系 ... [详细]
  • 跨站的艺术XSS Fuzzing 的技巧
    作者|张祖优(Fooying)腾讯云云鼎实验室对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做F ... [详细]
  • 小程序服务器获取用户名头像,微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现...
    这个接口只能获得一些非敏感信息,例如用户昵称,用户头像,经过用户授权允许获取的情况下即可获得用户信息,至于openid这些& ... [详细]
  • 点击上方Java后端,选择设为星标优质文章,及时送达项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在Spri ... [详细]
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社区 版权所有