Zend Framework实例教程(1)

2007-03-24 18:23:50

我们邀请PHP安全专家 — 最新版Zend Frame的贡献者 — Chris Shiflett帮我们写一篇文章介绍一下ZF的主要细节,他爽快地答应了!

这份手把手的完整教程提供了用ZF构建实例的方法,并教你如何编写一个新闻管理系统。

在我们的论坛上讨论ZF和这篇教程。

Brain Bulb 

Zend Framework发布了!虽然仍处于开发初期,这个教程仍突出讲解目前几个最好的功能,并指导你完成一个简单程序的构建。

Zend最早在社区里发布了ZF。基于同样的想法,这个教程写来用于展示ZF现有的功能。由于这个教程是在线发布,我将在ZF变化时对其进行更新,以便尽可能有效。

要求

Zend Framework要求PHP5。为了更好利用本教程的代码,你还需要Apache网页服务器。因为示范程序(一个新闻管理系统)用到了mod_rewrite

这个教程的代码可以自由下载,所以你可以自己试一下。你可以从Brain Buld的网站下载到代码:http://brainbulb.com/zend-framework-tutorial.tar.gz。

下载ZF

当你开始这篇教程时,你需要下载ZF的最新版本。你可以用浏览器手工从http://framework.zend.com/download选择tar.gzzip文件进行下载,或者使用下列命令:

$ wget http://framework.zend.com/download/tgz
$ tar -xvzf ZendFramework-0.1.2.tar.gz
提示:Zend计划提供自有PEAR通道简化下载。

一旦你下载了预览版,把library目录放到方便的地方。在这个教程,我把library重命名为lib以便有个简洁的目录结构:

app/
    views/
    controllers/
www/
    .htaccess
    index.php
lib/

www目录是文档根目录,controllersviews目录是以后会用到的空目录,而lib目录来自你下载的预览版。

开始

我要介绍的第一个组件是Zend_Controller。从很多方面看,它为你开发的程序提供了基础,同时也部分决定了Zend Framework不只是个组件的集合。但是,你在用之前需要将所有的得到的请求都放到一个简单的PHP脚本。本教程用的是mod_rewrite

mod_rewrite自身是一种艺术,但幸运的是,这个特殊的任务特别简单。如果你对mod_rewrite或Apache的一般配置不熟悉,在文档根目录下创建一个.htaccess文件,并添加以下内容:

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
提示: Zend_Controller的一个TODO项目就是取消对mod_rewrite的依赖。为了提供一个预览版的范例,本教程用了mod_rewrite

如果你直接把这些内容添加到httpd.conf,你必须重启网页服务器。但如果你用.htaccess文件,则什么都不必做。你可以放一些具体的文本到index.php并访问任意路径如/foo/bar做一下快速测试。如你的域名为example.org,则访问http://example.org/foo/bar。

你还要设置ZF库的路径到include_path。你可以在php.ini设置,也可以直接在你的.htaccess文件放下列内容:

php_value include_path "/path/to/lib"

Zend

Zend类包含了一些经常使用的静态方法的集合。下面是唯一一个你要手工添加的类:

<?php

include 'Zend.php';

?>

一旦你包含了Zend.php,你就已经包含了Zend类的所有的类方法。用loadClass()就可以简单地加载其它类。例如,加载Zend_Controller_Front类:

<?php

include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

?>

include_path能理解loadclass()及ZF的组织和目录结构。我用它加载所有其它类。

Zend_Controller

使用这个controller非常直观。事实上,我写本教程时并没有用到它丰富的文档。

提示:文档目前已经可以在http://framework.zend.com/manual/zend.controller.html看到。

我一开始是用一个叫Zend_Controller_Front的front controller。为了理解它是怎么工作的,请把下列代码放在你的index.php文件:

<?php

include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

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

?>

如果你更喜欢对象链结,可以用以下代码代替:

<?php

include 'Zend.php';

Zend::loadClass('Zend_Controller_Front');

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

?>

现在如果你访问/foo/bar,会有错误发生。没错!它让你知道发生了什么事。主要的问题是找不到IndexController.php文件。

在你创建这个文件之前,应先理解一下ZF想让你怎样组织这些事情。ZF把访问请求给拆分开来。假如访问的是/foo/bar,则foo是controller,而bar是action。它们的默认值都是index.

如果foo是controller,ZF就会去查找controllers目录下的FooController.php文件。因为这个文件不存在,ZF就退回到IndexController.php。结果都没有找到,就报错了。

接下来,在controllers目录创建IndexController.php文件(可以用setControllerDirectory()设置):

<?php

Zend::loadClass('Zend_Controller_Action');

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

?>

就如刚才说明的,IndexController类处理来自index controller或controller不存在的请求。indexAction()方法处理action为index的访问。要记住的是index是controller和action的默认值。如果你访问//index/index/indexindexAction()方法就会被执行。 (最后面的斜杠并不会改变这个行为。) 而访问其他任何资源只会导致出错。

在继续做之前,还要在IndexController加上另外一个有用的类方法。不管什么时候访问一个不存在的控制器,都要调用noRouteAction()类方法。例如,在FooController.php不存在的条件下,访问/foo/bar就会执行noRouteAction()。但是访问/index/foo仍会出错,因为foo是action,而不是controller.

noRouteAction()添加到IndexController.php:

<?php

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()时,可能发生的行为。这会将对不存在controllers的访问重定向到根文档(首页)。

现在创建FooController.php

<?php

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是action。现在你不只支持了友好的URL,还可以只用几行代码就做得这么有条理。酷吧!

你也可以创建一个__call()类方法来处理像/foo/baz这样未定义的action。

<?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是一个用来帮助你组织好你的view逻辑的类。这对于模板-系统是不可知的,为了简单起见,本教程不使用模板。如果你喜欢的话,不妨用一下。

记住,现在所有的访问都是由front controller进行处理。因此应用框架已经存在了,另外也必须遵守它。为了展示Zend_View的一个基本应用,将IndexController.php修改如下:

<?php

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

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

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

?>

views目录创建example.php文件:

<html>
<head>
    <title>This Is an Example</title>
</head>
<body>
    <p>This is an example.</p>
</body>
</html>

现在,如果你访问自己网站的根资源,你会看到example.php的内容。这仍没什么用,但你要清楚你要在以一种结构和组织非常清楚的方式在开发网络应用。

为了让Zend_View的应用更清楚一点,,修改你的模板(example.php)包含以下内容:

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

现在已经添加了两个功能。$this->escape()类方法用于所有的输出。即使你自己创建输出,就像这个例子一样。避开所有输出也是一个很好的习惯,它可以在默认情况下帮助你防止跨站脚本攻击(XSS)。

$this->title$this->body属性用来展示动态数据。这些也可以在controller中定义,所以我们修改IndexController.php以指定它们:

<?php

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

class IndexController extends Zend_Controller_Action 
{
    public function indexAction()
    {
        $view = new Zend_View();
        $view->setscrīptPath('/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脚本,所以你完全可以做你想做的。只是应努力只在要求显示数据时才使用模板。你的controller (controller分发的模块)应处理你全部的业务逻辑。

来源:http://www.phpchina.com/9136/viewspace_7042.html

转载于:https://www.cnblogs.com/8user/archive/2008/09/12/1289663.html

Zend Framework实例教程相关推荐

  1. Zend Framework实例教程三

    整合 为了进行整合,在lib目录下创建Database.php,loadClass()就可以找到它.你的index.php文件现在就会初始化$view和$db并存储到寄存器.你也可以创建__autol ...

  2. Zend Framework 入门教程(简体中文版)

    Zend Framework 入门教程(简体中文版) Getting Started With the Zend Framework Author:Rob Allen, www.akrabat.com ...

  3. Zend Framework入门教程

    转战了各个Blog平台,发现还是落户到csdn上吧,以后吐槽在新浪,发长文在csdn,整理链接在Baidu Hi 在大四的时候接下的实验室网站,网站是上三届的吴师兄写的,主要采用的是LAMP,其中PH ...

  4. Zend Framework 入门教程

    中文翻译见: http://phpeye.com/articles/tutorial.html 同时还有中文Zend Php Framework Zend Framework 中文版手册在线浏览 A ...

  5. php.ini开启命名空间,Zend Framework教程之模型Model基本规则和使用方法

    本文实例讲述了Zend Framework教程之模型Model基本规则和使用方法.分享给大家供大家参考,具体如下: 这里讲讲Zend中的model.其实Zend中的Model处理是相当简单的. 这主要 ...

  6. PHP高级教程——Zend Framework核心开发人员力作

    <PHP高级程序设计:模式.框架与测试> -- Zend Framework核心开发人员力作 在过去的十年间, PHP 已经从一套为 Web 站点开发人员提供的简单工具转化成完整的 OOP ...

  7. zend framework mysql_Zend Framework连接Mysql数据库实例分析

    这篇文章主要介绍了Zend Framework连接Mysql数据库的方法,以完整实例形式分析了Zend Framework连接MySQL数据库的具体步骤与相关实现技巧,需要的朋友可以参考下 本文实例讲 ...

  8. [转]Zend Framework + Smarty 应用实例

    一.Zend Framework简介 Zend Framework使用模型-视图-控制器(Model-View-Controller(MVC))结构.这个用来把你的程序分离成不同部分使得开发和维护变得 ...

  9. Zend Framework教程-Zend_Db-数据库操作4-Zend_Db_Select

    Zend_Db_Selec提供了构造SELECT查询语句的方法.通过Zend_Db_Select构造生成的查询语句是跨数据库的.下面介绍Zend_Db_Select提供的常见方法. class Zen ...

最新文章

  1. R语言在ggplot中使用变量指定柱状图的名称实战
  2. 修改进程权限(转载)
  3. apache camel 相关配置_小白在 linux 系统部署apache、mysql、Laravel 环境学习笔记!
  4. php生成随机验证码
  5. Spring Security中HttpSecurity常用方法及说明
  6. 设计灵感|大火C4D立体字效在海报中的应用
  7. 云计算时代的DCI技术
  8. 更新时卡住_7月2日全区1.693版本更新公告
  9. 电容麦克风测试软件,章和电气AudioExpress麦克风测试解决方案———您的音频测试专家...
  10. 设计模式微课版来啦——《设计模式(第2版)》
  11. 【Datawhale第25期组队学习】Task01:异常检测概念和方法
  12. FacesServlet (Java EEWTP/JSF问题的解决--java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
  13. Flutter 适配安卓异形屏幕
  14. 【动画图解微积分笔记】 (一) -1.概述 (附B站视频)
  15. Centos内核升级-Yum方式_1
  16. html判断符号,html js 格式验证标点符号
  17. 网易云音乐(netease-cloud-music)无法通过图标打开,只能用命令行开启
  18. MessageQueue原理分析(1)
  19. 计算机网络硬件开关win7,win7系统笔记本无线网络红叉电脑网络连接不可用的解决方法...
  20. SQL Server从本地Excel表格导入数据

热门文章

  1. 几个商业模式的运用手法
  2. 2021 年高教社杯全国大学生数学建模竞赛题目(B 题 乙醇偶合制备 C4 烯烃)
  3. pppoe拨号中的server name和service name
  4. 索引sql server_SQL Server索引结构和概念
  5. CF285D.Permutation Sum
  6. ie9 jscript7 内存不足 页面无响应
  7. Linux Guard Service - 守护进程分裂
  8. 9-n个人中选k个人的选择方法种类
  9. 洛谷——P1025 数的划分
  10. soupUI生成webservice客户端代码