首页 > PHP资讯 > PHP培训技术 > ZendFramework指南(1)

ZendFramework指南(1)

PHP培训技术

作者: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培训技术

本文由欣才IT学院整理发布,未经许可,禁止转载。
支持48不支持0