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

ZendFramework指南(1)

如果你再请求/foo/bar,就应该看到执行了barAction(),因为请求的动作是bar。这样不仅可以支持友好的URL,同时也可以用极少的代码就可以很好得进行组织。酷啊!

作者:Chris Shiflett
翻译:ShiningRay
  我们邀请了PHP安全专家——兼最新发布的Zend Framework的贡献者——Chris Shiflett来为我们写一篇关于ZF主要特点的文章。
  这份完整的、按部就班的教程通过向你展示如何应用框架写出一个简单的新闻管理系统,为你提供了构
建实际应用的独特视角。
  Zend Framework终于掀开了其神秘的面纱!尽管它尚处于开发过程的早期阶段,但本文将现在所能用的中最好的部分特别呈现给读者,并通过构建一个简单的应用这个过程引导你了解这个框架。
  Zend很早就发布了框架并引入社区运作。写本指南只能针对框架今天的情况来列出其特点。因为本指南是在线发布的,所以我会在框架发生变化的时候及时更新本文,这样就能尽可能保持一致。
要求Zend Framework 要求使用 PHP 5。为了能完全利用本指南中展示的代码,你还需要Apache Web服务器,因为范例应用(一个新闻管理系统)用到了mod_rewrite。
本指南中的代码可以自由下载,所以你可以亲自尝试一下。可以从Brain Bulb的网站上下载到:
http://brainbulb.com/zend-framework-tutorial.tar.gz.
下载框架在开始阅读本指南之前,你还需要先下载一份框架的预览发布版。可以用浏览器察看http://framework.zend.com/download 并选择 tar.gz 或者 zip 文件手工下载,也可以使用下面的命令行:
清单1
$ wget http://framework.zend.com/download/tgz
$ tar -xvzf ZendFramework-0.1.2.tar.gz注意 Zend已经计划提供一个独立的PEAR通道来方便下载。
下载了预览发布版之后,将这个库的目录放到一个方便的地方。在本教程中,我将库的目录名改称了lib
,以便提供一个简单干净的目录结构:
清单2
app/
  +-views/
  +-controllers/
www/
  +- .htaccess
  +- index.php
lib/www 目录是文档根目录,controllers和views目录为空,是将来要用的,lib目录是来自于下载的预
览版。
入门
  我第一个要向你展示的组件是Zend_Controller。在很多情况下,它为要开发的应用提供了一个基础,同时它也是令Zend Framework超越了组件集合的一个部分。不过在使用它之前,需要将所有进入的请求引导到某个PHP脚本中。本教程将使用mod_rewrite来完成这个目的。
  如何用好mod_rewrite确实是一门艺术,不过还好本文中这个特殊的任务十分简单。如果你对
mod_rewrite或者是Apache的一般配置还不是很熟悉的话,可以在文档根目录下创建一个.htaccess文件
,并加入一下指令:
清单3
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.phpZend_Controller目前的任务之一就是去掉对
mod_rewrite的依赖。为了提供一个预览版可以使用的例子,本教程便使用了mod_rewrite。
如果你直接在httpd.conf中添加这些指令,还必须重新启动Web服务。但是,如果使用.htaccess文件,
就不用了,而且这样更好。你可以随便在index.php中写点东西,然后任意请求某些路径来测试一下,比
如/foo/bar。例如,如果你的主机是example.org,那么就请求URL http://example.org/foo/bar。
可能你还想在 include_path 中包含框架库的路径。你可以直接在php.ini中配置,或者可以将以下指令
放入.htaccess文件中:
清单4
php_value include_path "/path/to/lib"Zend
Zend 类包含了一系列十分通用也十分有用的静态方法。这是唯一一个需要手工进行包含的类:
清单5



include 'Zend.php';

?> 

一旦引用了Zend.php,就可以访问Zend类中的所有方法了。使用loadClass()方法,载入其他类也变得
简单了。例如载入Zend_Controller_Front类:
清单6


include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

?> 
loadClass()方法会考虑到include_path,同时它还知道框架的目录组织结构。我就使用它来载入所有
其他的类。
Zend_Controller
这个控制器的使用还是比较直观的。实际上,我写这份指南的时候可没有官方文档可用!
现在ZF网站上已经有官方文档了。
首先讲Zend_Controller_Front,这是一个前端控制器。你可以将下面的代码放入index.php中来理解它
是如何工作的:
清单7

include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

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

?> 

如果你更希望使用对象链方式,可以如下改写:
清单8


include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

$controller = Zend_Controller_Front::getInstance()
    ->setControllerDirectory('/path/to/controllers')
    ->dispatch();
?> 

  现在,当进行/foo/bar的请求时,就会出现一个错误。这很好!它至少能告诉你有动作了。主要的问
题是未发现IndexController.php。
  在创建这个文件之前,最好首先了解框架组织东西的方式。框架会将一个请求分解成几个部分,在这个
例子中,请求/foo/bar,foo是控制器,bar是动作。两者的默认值都是index。
当foo作为控制器时,框架首先在控制器目录中查找名叫FooController.php的文件。因为不存在这个文
件,于是框架退一步查找IndexController.php。如果还是没有发现,就报告错误。
  下面,在controllers目录(可以使用setControllerDirectory()自己设置)中创建
IndexController.php:
清单9
 


Zend::loadClass('Zend_Controller_Action');

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

?> 

IndexController类处理控制器为index的请求或者指定的控制器不存在的请求,就像刚才所说的。
indexAction()方法将处理动作为index的请求。记住无论是控制器还是动作,默认的值都是index,前面
也说过了。如果尝试请求/、/index或者/index/index,都会执行indexAction()方法(结尾的斜杠不会
改变这种行为)。对任何其他资源的请求都可能会产生错误。
继续之前还要为IndexController添加一个很有用的方法noRouteAction()。一旦请求某个控制器且其不
存在时便调用noRouteAction()方法。例如,请求/foo/bar时,如果FooController.php不存在,那么就
会执行noRouteAction()。不过,/index/foo的请求还是会产生错误,因为这里foo是一个动作,而非控
制器。
在IndexController中添加 noRouteAction() :
清单10


Zend::loadClass('Zend_Controller_Action');

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

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

?> 

这个例子使用了 $this->_redirect('/') 来描述可以在noRouteAction()中一般可能出现的动作。这
可令对不存在的控制器的请求被重定向到根文档(首页)。
现在来创建 FooController.php:
清单11


Zend::loadClass('Zend_Controller_Action');

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

public function barAction()
{
  echo 'FooController::barAction()';
}
}
?> 
  如果你再请求 /foo/bar,就应该看到执行了barAction(),因为请求的动作是bar。这样不仅可以支持
友好的URL,同时也可以用极少的代码就可以很好得进行组织。酷啊!
还可以创建一个__call()方法来处理未定义的动作的请求,如 /foo/baz:

推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
author-avatar
王小瑶p_35ps
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有