Heim >php教程 >PHP开发 >Klassisches Tutorial für den Einstieg in die Zend Framework-Entwicklung

Klassisches Tutorial für den Einstieg in die Zend Framework-Entwicklung

高洛峰
高洛峰Original
2017-01-05 10:08:261250Durchsuche

Dieser Artikel beschreibt die Wissenspunkte im Zusammenhang mit dem Einstieg in die Zend Framework-Entwicklung. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Zend Framework wurde veröffentlicht! Obwohl es sich noch in einem frühen Entwicklungsstadium befindet, stellt dieses Tutorial einige der besten verfügbaren Funktionen vor und führt Sie durch die Erstellung eines einfachen Programms.

Zend war der erste, der ZF in der Community veröffentlichte. Basierend auf der gleichen Idee wurde dieses Tutorial geschrieben, um die vorhandenen Fähigkeiten von ZF zu demonstrieren. Da dieses Tutorial online veröffentlicht wird, werde ich es bei ZF-Änderungen aktualisieren, damit es so effizient wie möglich ist.

Anforderungen

Zend Framework erfordert PHP5. Um den Code in diesem Tutorial optimal nutzen zu können, benötigen Sie außerdem den Apache-Webserver. Weil das Demonstrationsprogramm (ein Nachrichtenverwaltungssystem) mod_rewrite verwendet.

Der Code für dieses Tutorial kann kostenlos heruntergeladen werden, sodass Sie es selbst ausprobieren können. Sie können den Code von der Website von Brain Buld herunterladen: http://brainbulb.com/zend-framework-tutorial.tar.gz.

ZF herunterladen

Wenn Sie dieses Tutorial starten, müssen Sie die neueste Version von ZF herunterladen. Sie können einen Browser verwenden, um die tar.gz- oder ZIP-Datei manuell zum Herunterladen von http://framework.zend.com/download auszuwählen, oder den folgenden Befehl verwenden:

$ wget http://framework.zend.com/download/tgz
$ tar -xvzf ZendFramework-0.1.2.tar.gz

Tipp: Zend plant dies Die Bereitstellung eigener PEAR-Kanäle vereinfacht das Herunterladen.

Sobald Sie die Vorschauversion heruntergeladen haben, legen Sie das Bibliotheksverzeichnis an einem geeigneten Ort ab. In diesem Tutorial habe ich die Bibliothek in lib umbenannt, um eine übersichtliche Verzeichnisstruktur zu erhalten:

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

Das www-Verzeichnis ist das Stammverzeichnis des Dokuments, die Controller- und View-Verzeichnisse sind leere Verzeichnisse, die später verwendet werden, und das lib-Verzeichnis stammt aus der Vorschauversion, die Sie heruntergeladen haben.

Start

Die erste Komponente, die ich vorstellen möchte, ist Zend_Controller. Es stellt in vielerlei Hinsicht die Grundlage für die von Ihnen entwickelten Programme dar und bestimmt teilweise auch, dass Zend Framework mehr als nur eine Sammlung von Komponenten ist. Sie müssen jedoch alle erhaltenen Anfragen in ein einfaches PHP-Skript einfügen, bevor Sie es verwenden können. Dieses Tutorial verwendet mod_rewrite.

Die Verwendung von mod_rewrite ist eine Kunst für sich, aber glücklicherweise ist diese spezielle Aufgabe überraschend einfach. Wenn Sie mit mod_rewrite oder der Apache-Konfiguration im Allgemeinen nicht vertraut sind, erstellen Sie eine .htaccess-Datei im Dokumentstamm und fügen Sie den folgenden Inhalt hinzu:

RewriteEngine on
RewriteRule !/.(js|ico|gif|jpg|png|css)$ index.php

Tipp: Ein TODO-Punkt für Zend_Controller besteht darin, die Abhängigkeit von mod_rewrite zu entfernen. Um eine Vorschau des Beispiels bereitzustellen, verwendet dieses Tutorial mod_rewrite.

Wenn Sie diese Inhalte direkt zu httpd.conf hinzufügen, müssen Sie den Webserver neu starten. Wenn Sie jedoch eine .htaccess-Datei verwenden, müssen Sie nichts tun. Sie können einen schnellen Test durchführen, indem Sie einen bestimmten Text in index.php einfügen und auf einen beliebigen Pfad zugreifen, z. B. /foo/bar. Wenn Ihr Domainname example.org lautet, besuchen Sie http://example.org/foo/bar.

Sie müssen außerdem den Pfad der ZF-Bibliothek auf include_path festlegen. Sie können es in php.ini festlegen oder den folgenden Inhalt direkt in Ihre .htaccess-Datei einfügen:

php_value include_path "/path/to/lib"

Zend

Zend Eine Klasse enthält eine Sammlung häufig verwendeter statischer Methoden. Hier ist die einzige Klasse, die Sie manuell hinzufügen müssen:

<?php
include &#39;Zend.php&#39;;
?>

Sobald Sie Zend.php eingebunden haben, haben Sie alle Klassenmethoden der Zend-Klassen eingebunden. Sie können andere Klassen einfach mit loadClass() laden. Laden Sie beispielsweise die Zend_Controller_Front-Klasse:

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

include_path kann die Organisation und Verzeichnisstruktur von Loadclass() und ZF verstehen. Ich verwende es, um alle anderen Klassen zu laden.

Zend_Controller

Die Verwendung dieses Controllers ist sehr intuitiv. Tatsächlich habe ich beim Schreiben dieses Tutorials nicht auf die umfangreiche Dokumentation zurückgegriffen.

Tipps: Die Dokumentation ist derzeit unter http://framework.zend.com/manual/zend.controller.html verfügbar.

Ich habe zunächst einen Front-Controller namens Zend_Controller_Front verwendet. Um zu verstehen, wie es funktioniert, fügen Sie den folgenden Code in Ihre index.php-Datei ein:

<?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();
?>

Wenn Sie Objektverknüpfungen bevorzugen, können Sie den folgenden Code verwenden stattdessen:

<?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();
?>

Wenn Sie nun auf /foo/bar zugreifen, tritt ein Fehler auf. Das stimmt! Es lässt Sie wissen, was los ist. Das Hauptproblem besteht darin, dass die Datei IndexController.php nicht gefunden werden kann.

Bevor Sie diese Datei erstellen, sollten Sie zunächst verstehen, wie die Regierung möchte, dass Sie diese Dinge organisieren. ZF teilt die Zugriffsanfragen auf. Wenn Sie auf /foo/bar zugreifen, ist foo der Controller und bar die Aktion. Ihre Standardwerte sind alle index.

Wenn foo ein Controller ist, sucht ZF nach der Datei FooController.php im Controller-Verzeichnis. Da diese Datei nicht existiert, greift ZF auf IndexController.php zurück. Da keine Ergebnisse gefunden wurden, wurde ein Fehler gemeldet.

Als nächstes erstellen Sie die Datei IndexController.php im Controller-Verzeichnis (kann mit setControllerDirectory() festgelegt werden):

<?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显示了承诺,加入的每个人都是想继续完善它。

Ich hoffe, dass dieser Artikel für jedermann bei der PHP-Programmierung basierend auf dem Zend Framework-Framework hilfreich sein wird.

Weitere Artikel zu Einführungs-Klassiker-Tutorials zur Zend Framework-Entwicklung finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn