热门标签 | 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:

推荐阅读
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 小编给大家分享一下如何移除URL中的index.php,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
  • 本文探讨了如何解决PHP文件无法写入本地文件的问题,并解释了PHP文件中HTML代码无效的原因,提供了一系列实用的解决方案和最佳实践。 ... [详细]
  • 使用PHP实现网站访客计数器的完整指南
    本文详细介绍了如何利用PHP构建一个简易的网站访客统计系统。通过具体的代码示例和详细的解释,帮助开发者理解和实现这一功能,适用于初学者和有一定经验的开发人员。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • Google排名优化-面向Google(Search Engine Friendly)的URL设计 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 苹果系统频繁弹窗提示无法验证服务器身份?竟是网易邮箱证书过期所致
    近日,众多苹果用户发现iOS、iPadOS和macOS系统频繁弹出无法验证服务器身份的警告。问题根源在于网易邮箱未能及时更新其数字证书,导致原证书过期后无法被信任。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
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社区 版权所有