- 浏览: 75449 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hay:
大骗子
zend studio教程 -
jiewuzhe02:
请问开源CMS digitaluscms 安装后不能登录后台 ...
zend frawework 开源代码列子 -
天梯梦:
怎么一个都打不开啊
zend studio教程 -
freedomstyle:
调试的时候,变量中文出现乱码
zend studio for eclipse 中文乱码的问题 -
freedomstyle:
是的,我也碰到这样的问题。
zend studio for eclipse 中文乱码的问题
作者:张佳(译) 来源:PHPEye开源社区 2006-11-07 最后更新:2006-12-19 15:42:16
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.gz
或zip
文件进行下载,或者使用下列命令:
$ wget http://framework.zend.com/download/tgz
$ tar -xvzf ZendFramework-0.1.2.tar.gz
一旦你下载了预览版,把library
目录放到方便的地方。在这个教程,我把library
重命名为lib
以便有个简洁的目录结构:
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
文件,并添加以下内容:
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非常直观。事实上,我写本教程时并没有用到它丰富的文档。
我一开始是用一个叫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/index
,indexAction()
方法就会被执行。 (最后面的斜杠并不会改变这个行为。) 而访问其他任何资源只会导致出错。
在继续做之前,还要在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->setScriptPath('/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->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脚本,所以你完全可以做你想做的。只是应努力只在要求显示数据时才使用模板。你的controller (controller分发的模块)应处理你全部的业务逻辑。
在继续之前,我想做最后一个关于Zend_View
的提示。在controller的每个类方法内初始化$view
对象需要额外输入一些内容,而我们的主要目标是让快速开发网络应用更简单。如果所有模板都放在一个目录下,是否要在每个例子中都调用setScriptPath()
也存在争议。
幸运的是,Zend
类包含了一个寄存器来帮助减少工作量。你可以用register()
方法把你的$view
对象存储在寄存器:
<?php
Zend::register('view', $view);
?>
用registry()
方法进行检索:
<?php
$view = Zend::registry('view');
?>
基于这点,本教程使用寄存器。
Zend_InputFilter
本教程讨论的最后一个组件是Zend_InputFilter
。这个类提供了一种简单而有效的输入过滤方法。你可以通过提供一组待过滤数据来进行初始化。
<?php
$filterPost = new Zend_InputFilter($_POST);
?>
这会将($_POST
)设置为NULL
,所以就不能直接进入了。Zend_InputFilter
提供了一个简单、集中的根据特定规则过滤数据的类方法集。例如,你可以用getAlpha()
来获取$_POST['name']
中的字母:
<?php
/* $_POST['name'] = 'John123Doe'; */
$filterPost = new Zend_InputFilter($_POST);
/* $_POST = NULL; */
$alphaName = $filterPost->getAlpha('name');
/* $alphaName = 'JohnDoe'; */
?>
每一个类方法的参数都是对应要过滤的元素的关键词。对象(例子中的$filterPost
)可以保护数据不被篡改,并能更好地控制对数据的操作及一致性。因此,当你操纵输入数据,应始终使用Zend_InputFilter
。
Zend_Filter
提供与Zend_InputFilter
方法一样的静态方法。
构建新闻管理系统
虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。
每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。
当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/
/add/news
/add/comment
/admin
/admin/approve
/view/{id}
你可以直接把这些网址和controller联系起来。IndexController
列出新闻,AddController
添加新闻和评论,AdminController
处理一些如批准新闻之类的管理,ViewController
特定新闻和对应评论的显示。
如果你的FooController.php
还在,把它删除。修改IndexController.php
,为业务逻辑以添加相应的action和一些注释:
<?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
文件:
<?php
Zend::loadClass('Zend_Controller_Action');
class AddController extends Zend_Controller_Action
{
function indexAction()
{
$this->_redirect('/');
}
function commentAction()
{
/* Add a comment. */
}
function newsAction()
{
/* Add news. */
}
function __call($action, $arguments)
{
$this->_redirect('/');
}
}
?>
记住AddController
的indexAction()
方法不能调用。当访问/add
时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。
接下来,创建AdminController.php
文件:
<?php
Zend::loadClass('Zend_Controller_Action');
class AdminController extends Zend_Controller_Action
{
function indexAction()
{
/* Display admin interface. */
}
function approveAction()
{
/* Approve news. */
}
function __call($action, $arguments)
{
$this->_redirect('/');
}
}
?>
最后,创建ViewController.php
文件:
<?php
Zend::loadClass('Zend_Controller_Action');
class ViewController extends Zend_Controller_Action
{
function indexAction()
{
$this->_redirect('/');
}
function __call($id, $arguments)
{
/* Display news and comments for $id. */
}
}
?>
和AddController
一样,index()
方法不能调用,所以你可以使用你认为合适的action。ViewController
和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23
这样的网址,你要使用__call()
来支持动态action。
数据库操作
因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。
<?php
class Database
{
private $_db;
public function __construct($filename)
{
$this->_db = new SQLiteDatabase($filename);
}
public function addComment($name, $comment, $newsId)
{
$name = sqlite_escape_string($name);
$comment = sqlite_escape_string($comment);
$newsId = sqlite_escape_string($newsId);
$sql = "INSERT
INTO comments (name, comment, newsId)
VALUES ('$name', '$comment', '$newsId')";
return $this->_db->query($sql);
}
public function addNews($title, $content)
{
$title = sqlite_escape_string($title);
$content = sqlite_escape_string($content);
$sql = "INSERT
INTO news (title, content)
VALUES ('$title', '$content')";
return $this->_db->query($sql);
}
public function approveNews($ids)
{
foreach ($ids as $id) {
$id = sqlite_escape_string($id);
$sql = "UPDATE news
SET approval = 'T'
WHERE id = '$id'";
if (!$this->_db->query($sql)) {
return FALSE;
}
}
return TRUE;
}
public function getComments($newsId)
{
$newsId = sqlite_escape_string($newsId);
$sql = "SELECT name, comment
FROM comments
WHERE newsId = '$newsId'";
if ($result = $this->_db->query($sql)) {
return $result->fetchAll();
}
return FALSE;
}
public function getNews($id = 'ALL')
{
$id = sqlite_escape_string($id);
switch ($id) {
case 'ALL':
$sql = "SELECT id,
title
FROM news
WHERE approval = 'T'";
break;
case 'NEW':
$sql = "SELECT *
FROM news
WHERE approval != 'T'";
break;
default:
$sql = "SELECT *
FROM news
WHERE id = '$id'";
break;
}
if ($result = $this->_db->query($sql)) {
if ($result->numRows() != 1) {
return $result->fetchAll();
} else {
return $result->fetch();
}
}
return FALSE;
}
}
?>
(你可以用自己的解决方案随意替换这个类。这里只是为你提供一个完整示例的介绍,并非建议要这么实现。)
这个类的构造器需要SQLite数据库的完整路径和文件名,你必须自己进行创建。
<?php
$db = new SQLiteDatabase('/path/to/db.sqlite');
$db->query("CREATE TABLE news (
id INTEGER PRIMARY KEY,
title VARCHAR(255),
content TEXT,
approval CHAR(1) DEFAULT 'F'
)");
$db->query("CREATE TABLE comments (
id INTEGER PRIMARY KEY,
name VARCHAR(255),
comment TEXT,
newsId INTEGER
)");
?>
你只需要做一次,以后直接给出Database
类构造器的完整路径和文件名即可:
<?php
$db = new Database('/path/to/db.sqlite');
?>
整合
为了进行整合,在lib
目录下创建Database.php
,loadClass()
就可以找到它。你的index.php
文件现在就会初始化$view
和$db
并存储到寄存器。你也可以创建__autoload()
函数自动加载你所需要的类:
<?php
include 'Zend.php';
function __autoload($class)
{
Zend::loadClass($class);
}
$db = new Database('/path/to/db.sqlite');
Zend::register('db', $db);
$view = new Zend_View;
$view->setScriptPath('/path/to/views');
Zend::register('view', $view);
$controller = Zend_Controller_Front::getInstance()
->setControllerDirectory('/path/to/controllers')
->dispatch();
?>
接下来,在views
目录创建一些简单的模板。index.php
可以用来显示index视图:
<html>
<head>
<title>News</title>
</head>
<body>
<h1>News</h1>
<?php foreach ($this->news as $entry) { ?>
<p>
<a href="/view/<?php echo $this->escape($entry['id']); ?>">
<?php echo $this->escape($entry['title']); ?>
</a>
</p>
<?php } ?>
<h1>Add News</h1>
<form action="/add/news" method="POST">
<p>Title:<br /><input type="text" name="title" /></p>
<p>Content:<br /><textarea name="content"></textarea></p>
<p><input type="submit" value="Add News" /></p>
</form>
</body>
</html>
view.php
模板可以用来显示选定的新闻条目:
<html>
<head>
<title>
<?php echo $this->escape($this->news['title']); ?>
</title>
</head>
<body>
<h1>
<?php echo $this->escape($this->news['title']); ?>
</h1>
<p>
<?php echo $this->escape($this->news['content']); ?>
</p>
<h1>Comments</h1>
<?php foreach ($this->comments as $comment) { ?>
<p>
<?php echo $this->escape($comment['name']); ?> writes:
</p>
<blockquote>
<?php echo $this->escape($comment['comment']); ?>
</blockquote>
<?php } ?>
<h1>Add a Comment</h1>
<form action="/add/comment" method="POST">
<input type="hidden" name="newsId"
value="<?php echo $this->escape($this->id); ?>" />
<p>Name:<br /><input type="text" name="name" /></p>
<p>Comment:<br /><textarea name="comment"></textarea></p>
<p><input type="submit" value="Add Comment" /></p>
</form>
</body>
</html>
发表评论
-
Zend Framework 教程大全(英文版)
2009-02-22 23:05 2532Zend Framework教程大全 07月 3rd, 200 ... -
Zend Framework 1.7.5发布增加了不少功能
2009-02-19 21:43 1405Welcome to Zend Framework 1.7 ... -
lucene的简单实例<一>
2009-02-17 15:15 1074说明一下,这一篇文章的用到的lucene,是用2.0版本的,主 ... -
走进全文搜索
2009-02-17 14:07 1006走进全文搜索 http://www.phpx.com/hap ... -
Jobeet 第17天:搜索引擎
2009-02-17 10:49 953写给每个朋友来访的朋友! Friday, December ... -
Zend Search Lucene实现全文搜索收藏
2009-02-17 10:24 1871Zend Search Lucene实现全文搜索收藏 新一篇 ... -
DBSight-Zend Framework中lucene的最佳替代方案
2009-02-17 10:22 2355DBSight-Zend Framework中lucene的最 ... -
理解ZEND_DB_PROFILE相关的知识
2009-02-14 00:46 978MYSQL的性能跟踪mysql> help profil ... -
zend framwork quickstart 列子SQLLITE介绍
2009-02-13 01:54 1215SQLLITE 1、SQLite简介SQLite第一个Al ... -
ZF HEADLINK相关的HTML link标签 rel 属性
2009-02-12 21:04 2262rel 属性 -- rel属性,描述了当前页面与href所指定 ... -
php 目录结构学习
2009-02-11 21:59 0d:/docroot/ index.phpapplica ... -
zend framework中的helper们
2009-02-10 15:21 22102008-11-06 00:28 写 ... -
使用zend Framework的lucene进行全文检索——中文分词
2009-02-09 16:05 1963[2007/06/16 21:52 | 分类: PHP高级技 ... -
Zend Framework实例教程2
2009-02-09 10:00 2319最后,admin.php模板可以用来批准新闻条目: &l ... -
Zend Framework 留言本实战
2009-02-08 20:27 5817一、环境搭建和ZF安装 *[注] ... -
xampp下跑zendframe框架apache报pdo错
2009-02-08 16:47 2075今天在xampp下跑zendframe框架 链接数据库,遇到这 ... -
zend frawework 开源代码列子
2009-02-08 13:01 16371.zend frawework QUICK START ... -
国外主流PHP框架比较
2009-02-06 10:13 2303国外主流PHP框架比较 作者:heiyelure ...
相关推荐
1. **下载与解压**:首先,从官方网站或者提供的压缩包"ZendFramework-1.12.9.zip"下载并解压到服务器的适当位置。 2. **环境要求**:确保服务器环境满足PHP 5.2.5或更高版本。 3. **配置自动加载**:通过设置`...
本教程将深入探讨如何利用Zend Framework进行开发,特别针对中国的PHP开发者,通过实例学习,使你对这个强大的框架有更深入的理解。 **1. MVC架构** 在Zend Framework中,MVC模式是核心设计思想。模型(Model)处理...
Zend Framework 2(ZF2)是一个面向对象的、模块化且高性能的PHP开发框架,用于构建Web应用程序和服务。本示例“album”是ZF2官方提供的一个基础教程项目,旨在帮助开发者快速理解和学习如何在ZF2中进行实际的开发...
在本教程中,我们将深入了解Zend Framework框架中的Zend_Config组件,这是一款专门用于处理应用配置信息的工具。通过实例讲解,我们将会掌握Zend_Config组件的基本用法,并学习如何操作不同类型配置文件的方法。 ...
本实例源码提供了对 Zend Framework 的基础认识和实际操作经验,包括入门级的项目搭建和数据库操作。 **1. Zend Framework 概述** Zend Framework 提供了一套完整的开发工具和库,支持各种Web服务,如RESTful API、...
总的来说,Zend Framework 1.11.10的官方中文手册不仅涵盖了框架的基本概念和组件,还提供了详细的API参考和实例教程,是开发者学习和应用Zend Framework的重要资源。通过深入学习和实践,开发者可以充分利用这个...
1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问...
在本文中,我们将深入探讨 Zend Framework 中的 Zend_Application,这是一个至关重要的组件,它为框架应用程序提供了基础结构和启动流程。Zend_Application 作为程序的入口点,主要负责两件关键的事情:初始化PHP...
综上所述,通过本教程的介绍和实例分析,我们可以看到Zend Framework通过Zend_Db_Table类如何方便地实现复杂数据库表之间的关系管理。开发者需要掌握使用这些类和属性的技巧,以及在实现过程中需要注意的事项,才能...
在Zend Framework中,请求对象的封装由Zend_Controller_Request组件实现,该组件是整个MVC架构中用于处理客户端请求的核心部分。 首先,请求对象是一个简单的值对象,它在前端控制器、路由器、分发器和控制类之间...
这个教程聚焦于 `Zend Framework 1.9.0` 版本,该版本发布于2010年,虽然相对较老,但对于理解框架的基本原理和结构仍然非常有价值。 ** MVC 架构模式** 在 `Zend Framework` 中,Model-View-Controller(MVC)...
标题"ZendFramework 1 cache for Redis,Memcached"表明这是一个关于使用 Zend Framework 1 框架来实现缓存功能的教程,重点在于集成和使用 Redis 和 Memcached 这两种流行的数据缓存系统。Zend Framework 是一个广泛...
主要介绍了Zend Framework教程之分发器Zend_Controller_Dispatcher用法,结合实例形式详细分析了分发器Zend_Controller_Dispatcher的结构,功能,使用技巧与相关注意事项,需要的朋友可以参考下
**描述:**“这个实例是基于 Zend Framework2 的一个演示项目,可以直接配置为Web站点进行运行。源代码来源于官方,更多关于此实例的详细信息建议查阅 Zend Framework2 官方文档。” **知识点详解:** **1. Zend ...