首頁 >php教程 >PHP开发 >Zend Framework開發入門經典教程

Zend Framework開發入門經典教程

高洛峰
高洛峰原創
2016-12-26 15:27:231054瀏覽

本文講述了Zend Framework開發入門相關知識點。分享給大家參考,具體如下:

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

   

提示:Zend計畫提供自有PEAR通道下載。

一旦你下載了預覽版,把library目錄放到方便的地方。在這個教程,我把library重新命名為lib以便有個簡潔的目錄結構:

app/
    views/
    controllers/
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 &#39;Zend.php&#39;;
?>

   

一旦你包含了Zend.php,你就已經包含了Zend類別的所有的類別方法。用loadClass()就可以簡單地載入其它類別。例如,載入Zend_Controller_Front類別:

<?php
include &#39;Zend.php&#39;;
Zend::loadClass(&#39;Zend_Controller_Front&#39;);
?>

   

include_path能理解loadclass()及ZF的組織和目錄結構。我用它加載所有其它類。  

Zend_Controller

使用這個controller非常直覺。事實上,我寫本教學時並沒有用到它豐富的文檔。

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

我一開始是用一個叫Zend_Controller_Front的front controller。為了理解它是怎麼運作的,請將下列程式碼放在你的index.php檔案:

<?php
include &#39;Zend.php&#39;;
Zend::loadClass(&#39;Zend_Controller_Front&#39;);
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory(&#39;/path/to/controllers&#39;);
$controller->dispatch();
?>

   

如果你喜歡物件連結,可以用下列程式碼取代:

<?php
include &#39;Zend.php&#39;;
Zend::loadClass(&#39;Zend_Controller_Front&#39;);
$controller = Zend_Controller_Front::getInstance()
       ->setControllerDirectory(&#39;/path/to/controllers&#39;)
       ->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(&#39;Zend_Controller_Action&#39;);
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    echo &#39;IndexController::indexAction()&#39;;
  }
}
?>

   

就如刚才说明的,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(&#39;Zend_Controller_Action&#39;);
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    echo &#39;IndexController::indexAction()&#39;;
  }
  public function noRouteAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

例子中使用$this->_redirect('/')来描述执行noRouteAction()时,可能发生的行为。这会将对不存在controllers的访问重定向到根文档(首页)。

现在创建FooController.php:

<?php
Zend::loadClass(&#39;Zend_Controller_Action&#39;);
class FooController extends Zend_Controller_Action
{
  public function indexAction()
  {
    echo &#39;FooController::indexAction()&#39;;
  }
  public function barAction()
  {
    echo &#39;FooController::barAction()&#39;;
  }
}
?>

   

如果你再次访问/foo/bar,你会发现执行了barAction(),因为bar是action。现在你不只支持了友好的URL,还可以只用几行代码就做得这么有条理。酷吧!
你也可以创建一个__call()类方法来处理像/foo/baz这样未定义的action。

<?php
Zend::loadClass(&#39;Zend_Controller_Action&#39;);
class FooController extends Zend_Controller_Action
{
  public function indexAction()
  {
    echo &#39;FooController::indexAction()&#39;;
  }
  public function barAction()
  {
    echo &#39;FooController::barAction()&#39;;
  }
  public function __call($action, $arguments)
  {
    echo &#39;FooController:__call()&#39;;
  }
}
?>

   

现在你只要几行代码就可以很好地处理用户的访问了,准备好继续。

Zend_View

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

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

<?php
Zend::loadClass(&#39;Zend_Controller_Action&#39;);
Zend::loadClass(&#39;Zend_View&#39;);
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    $view = new Zend_View();
    $view->setScriptPath(&#39;/path/to/views&#39;);
    echo $view->render(&#39;example.php&#39;);
  }
  public function noRouteAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

在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(&#39;Zend_Controller_Action&#39;);
Zend::loadClass(&#39;Zend_View&#39;);
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    $view = new Zend_View();
    $view->setScriptPath(&#39;/path/to/views&#39;);
    $view->title = &#39;Dynamic Title&#39;;
    $view->body = &#39;This is a dynamic body.&#39;;
    echo $view->render(&#39;example.php&#39;);
  }
  public function noRouteAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

现在你再次访问根目录,应该就可以看到模板所使用的这些值了。因为你在模板中使用的$this就是在Zend_View范围内所执行的实例。

要记住example.php只是一个普通的PHP脚本,所以你完全可以做你想做的。只是应努力只在要求显示数据时才使用模板。你的controller (controller分发的模块)应处理你全部的业务逻辑。

在继续之前,我想做最后一个关于Zend_View的提示。在controller的每个类方法内初始化$view对象需要额外输入一些内容,而我们的主要目标是让快速开发网络应用更简单。如果所有模板都放在一个目录下,是否要在每个例子中都调用setScriptPath()也存在争议。

幸运的是,Zend类包含了一个寄存器来帮助减少工作量。你可以用register()方法把你的$view对象存储在寄存器:

<?php
Zend::register(&#39;view&#39;, $view);
?>

   

用registry()方法进行检索:

<?php
$view = Zend::registry(&#39;view&#39;);
?>

   

基于这点,本教程使用寄存器。 

Zend_InputFilter

本教程讨论的最后一个组件是Zend_InputFilter。这个类提供了一种简单而有效的输入过滤方法。你可以通过提供一组待过滤数据来进行初始化。

<?php
$filterPost = new Zend_InputFilter($_POST);
?>

   

这会将($_POST)设置为NULL,所以就不能直接进入了。Zend_InputFilter提供了一个简单、集中的根据特定规则过滤数据的类方法集。例如,你可以用getAlpha()来获取$_POST['name']中的字母:

<?php
/* $_POST[&#39;name&#39;] = &#39;John123Doe&#39;; */
$filterPost = new Zend_InputFilter($_POST);
/* $_POST = NULL; */
$alphaName = $filterPost->getAlpha(&#39;name&#39;);
/* $alphaName = &#39;JohnDoe&#39;; */
?>

   

每一个类方法的参数都是对应要过滤的元素的关键词。对象(例子中的$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(&#39;Zend_Controller_Action&#39;);
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    /* List the news. */
  }
  public function noRouteAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

接下来,创建AddController.php文件:

<?php
Zend::loadClass(&#39;Zend_Controller_Action&#39;);
class AddController extends Zend_Controller_Action
{
  function indexAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
  function commentAction()
  {
    /* Add a comment. */
  }
  function newsAction()
  {
    /* Add news. */
  }
  function __call($action, $arguments)
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

记住AddController的indexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。

接下来,创建AdminController.php文件:

<?php
Zend::loadClass(&#39;Zend_Controller_Action&#39;);
class AdminController extends Zend_Controller_Action
{
  function indexAction()
  {
    /* Display admin interface. */
  }
  function approveAction()
  {
    /* Approve news. */
  }
  function __call($action, $arguments)
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

最后,创建ViewController.php文件:

<?php
Zend::loadClass(&#39;Zend_Controller_Action&#39;);
class ViewController extends Zend_Controller_Action
{
  function indexAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
  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 (&#39;$name&#39;, &#39;$comment&#39;, &#39;$newsId&#39;)";
    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 (&#39;$title&#39;, &#39;$content&#39;)";
    return $this->_db->query($sql);
  }
  public function approveNews($ids)
  {
    foreach ($ids as $id) {
      $id = sqlite_escape_string($id);
      $sql = "UPDATE news
          SET  approval = &#39;T&#39;
          WHERE id = &#39;$id&#39;";
      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 = &#39;$newsId&#39;";
    if ($result = $this->_db->query($sql)) {
      return $result->fetchAll();
    }
    return FALSE;
  }
  public function getNews($id = &#39;ALL&#39;)
  {
    $id = sqlite_escape_string($id);
    switch ($id) {
      case &#39;ALL&#39;:
        $sql = "SELECT id,
                title
            FROM  news
            WHERE approval = &#39;T&#39;";
        break;
      case &#39;NEW&#39;:
        $sql = "SELECT *
            FROM  news
            WHERE approval != &#39;T&#39;";
        break;
      default:
        $sql = "SELECT *
            FROM  news
            WHERE id = &#39;$id&#39;";
        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(&#39;/path/to/db.sqlite&#39;);
$db->query("CREATE TABLE news (
    id    INTEGER PRIMARY KEY,
    title  VARCHAR(255),
    content TEXT,
    approval CHAR(1) DEFAULT &#39;F&#39;
  )");
$db->query("CREATE TABLE comments (
    id    INTEGER PRIMARY KEY,
    name   VARCHAR(255),
    comment TEXT,
    newsId  INTEGER
  )");
?>

   

你只需要做一次,以后直接给出Database类构造器的完整路径和文件名即可:

<?php
$db = new Database(&#39;/path/to/db.sqlite&#39;);
?>

   

整合

为了进行整合,在lib目录下创建Database.php,loadClass()就可以找到它。你的index.php文件现在就会初始化$view和$db并存储到寄存器。你也可以创建__autoload()函数自动加载你所需要的类:

<?php
include &#39;Zend.php&#39;;
function __autoload($class)
{
  Zend::loadClass($class);
}
$db = new Database(&#39;/path/to/db.sqlite&#39;);
Zend::register(&#39;db&#39;, $db);
$view = new Zend_View;
$view->setScriptPath(&#39;/path/to/views&#39;);
Zend::register(&#39;view&#39;, $view);
$controller = Zend_Controller_Front::getInstance()
       ->setControllerDirectory(&#39;/path/to/controllers&#39;)
       ->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[&#39;id&#39;]); ?>">
  <?php echo $this->escape($entry[&#39;title&#39;]); ?>
  </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[&#39;title&#39;]); ?>
 </title>
</head>
<body>
 <h1>
  <?php echo $this->escape($this->news[&#39;title&#39;]); ?>
 </h1>
 <p>
  <?php echo $this->escape($this->news[&#39;content&#39;]); ?>
 </p>
 <h1>Comments</h1>
 <?php foreach ($this->comments as $comment) { ?>
 <p>
  <?php echo $this->escape($comment[&#39;name&#39;]); ?> writes:
 </p>
 <blockquote>
  <?php echo $this->escape($comment[&#39;comment&#39;]); ?>
 </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>

   

最后,admin.php模板可以用来批准新闻条目:

<html>
<head>
 <title>News Admin</title>
</head>
<body>
 <form action="/admin/approve" method="POST">
 <?php foreach ($this->news as $entry) { ?>
 <p>
  <input type="checkbox" name="ids[]"
  value="<?php echo $this->escape($entry[&#39;id&#39;]); ?>" />
  <?php echo $this->escape($entry[&#39;title&#39;]); ?>
  <?php echo $this->escape($entry[&#39;content&#39;]); ?>
 </p>
 <?php } ?>
 <p>
  Password:<br /><input type="password" name="password" />
 </p>
 <p><input type="submit" value="Approve" /></p>
 </form>
</body>
</html>

   

提示:为了保持简单,这个表单用密码作为验证机制。

使用到模板的地方,你只需要把注释替换成几行代码。如IndexController.php就变成下面这样:

<?php
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    /* List the news. */
    $db = Zend::registry(&#39;db&#39;);
    $view = Zend::registry(&#39;view&#39;);
    $view->news = $db->getNews();
    echo $view->render(&#39;index.php&#39;);
  }
  public function noRouteAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

因为条理比较清楚,这个程序首页的整个业务逻辑只有四行代码。AddController.php更复杂一点,它需要更多的代码:

<?php
class AddController extends Zend_Controller_Action
{
  function indexAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
  function commentAction()
  {
    /* Add a comment. */
    $filterPost = new Zend_InputFilter($_POST);
    $db = Zend::registry(&#39;db&#39;);
    $name = $filterPost->getAlpha(&#39;name&#39;);
    $comment = $filterPost->noTags(&#39;comment&#39;);
    $newsId = $filterPost->getDigits(&#39;newsId&#39;);
    $db->addComment($name, $comment, $newsId);
    $this->_redirect("/view/$newsId");
  }
  function newsAction()
  {
    /* Add news. */
    $filterPost = new Zend_InputFilter($_POST);
    $db = Zend::registry(&#39;db&#39;);
    $title = $filterPost->noTags(&#39;title&#39;);
    $content = $filterPost->noTags(&#39;content&#39;);
    $db->addNews($title, $content);
    $this->_redirect(&#39;/&#39;);
  }
  function __call($action, $arguments)
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

因为用户在提交表单后被重定向,这个controller不需要视图。

在AdminController.php,你要处理显示管理界面和批准新闻两个action:

<?php
class AdminController extends Zend_Controller_Action
{
  function indexAction()
  {
    /* Display admin interface. */
    $db = Zend::registry(&#39;db&#39;);
    $view = Zend::registry(&#39;view&#39;);
    $view->news = $db->getNews(&#39;NEW&#39;);
    echo $view->render(&#39;admin.php&#39;);
  }
  function approveAction()
  {
    /* Approve news. */
    $filterPost = new Zend_InputFilter($_POST);
    $db = Zend::registry(&#39;db&#39;);
    if ($filterPost->getRaw(&#39;password&#39;) == &#39;mypass&#39;) {
      $db->approveNews($filterPost->getRaw(&#39;ids&#39;));
      $this->_redirect(&#39;/&#39;);
    } else {
      echo &#39;The password is incorrect.&#39;;
    }
  }
  function __call($action, $arguments)
  {
    $this->_redirect(&#39;/&#39;);
  }
}
?>

   

最后是ViewController.php:

<?php
class ViewController extends Zend_Controller_Action
{
  function indexAction()
  {
    $this->_redirect(&#39;/&#39;);
  }
  function __call($id, $arguments)
  {
    /* Display news and comments for $id. */
    $id = Zend_Filter::getDigits($id);
    $db = Zend::registry(&#39;db&#39;);
    $view = Zend::registry(&#39;view&#39;);
    $view->news = $db->getNews($id);
    $view->comments = $db->getComments($id);
    $view->id = $id;
    echo $view->render(&#39;view.php&#39;);
  }
}
?>

   

虽然很简单,但我们还是提供了一个功能较全的新闻和评论程序。最好的地方是由于有较好的设计,增加功能变得很简单。而且随着Zend Framework越来越成熟,只会变得更好。

更多信息

这个教程只是讨论了ZF表面的一些功能,但现在也有一些其它的资源可供参考。在http://framework.zend.com/manual/有手册可以查询,Rob Allen在http://akrabat.com/zend-framework/介绍了一些他使用Zend Framework的经验,而Richard Thomas也在http://www.cyberlot.net/zendframenotes提供了一些有用的笔记。如果你有自己的想法,可以访问Zend Framework的新论坛:http://www.phparch.com/discuss/index.php/f/289//。

结束语

要对预览版进行评价是很容易的事,我在写这个教程时也遇到很多困难。总的来说,我想Zend Framework显示了承诺,加入的每个人都是想继续完善它。

希望本文所述對大家基於Zend Framework框架的PHP程式設計有所幫助。

更多Zend Framework開發入門經典教學相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn