理解Zend 框架(1):建置完美的閱讀器

日期:2006-11-17  作者:喜騰小二  來源:PHPChina


    我們程式設計人員是自相矛盾的懶漢。我的意思是我們會花上數小時甚至幾天的時間來建立一個東西,讓我們用 30 秒鐘完成 5 分鐘才能完成的工作。因此,Zend 框架的建立也許不是一件太讓人驚奇的事情。您尚未聽說過 Zend 框架嗎?不要急 —— 您會瞭解的。本文概要介紹了 Zend 框架,解釋了它的一般概念,並為 “理解 Zend 框架” 係列的其餘部分做好準備,其餘部分將透過遍歷一個新的線上 RSS/Atom 提要閱讀器的建立過程來深入到該框架的細節之中。在本文中不會有太多編碼,但在其餘部分中您應該熟悉 PHP。

    Zend 框架

    眾所周知,幾年前,在眾多強大且易用的指令檔語言中,PHP 占據着首要位置。大多數基於 UNIX® 和 Linux® 的 Web 伺服器都安裝了該語言。如果您是一個程式設計人員,您很容易獲得一個主機帳戶來使用該語言。Ruby 曾經風靡一時,但現在已經沒有多少人使用了。如果您曾經想使用動態生成的內容來建置一個網站,但卻並不確定是否要使用諸如 J2EE 之類的應用伺服器,那麼您就極可能使用 PHP。它快速、易學、方便,您無需學習 Perl。

    然後情況很快改變。Ruby on Rails 震驚了編程界。Ruby on Rails 是麵嚮物件和基於模型-視圖-控制器 (MVC) 的典範,它提供了一種方式來實現我們都想實現的事情,即不費任何力氣地建立一個網站。當然,仍然存在兩個問題。一個問題是您需要學習一門新的編程語言。不管這門語言是什麼樣的,這都不是一項簡單的工作。另一個問題是,如果您找到一臺能執行 Ruby on Rails 的主機,那是非常幸運的,而大多數情況下不可能。如果您(像我一樣)擁有一個 10 年的帳戶,僅因為其缺少新的編程語言,那麼放鍥起來會猶豫再三的。當然,您這些年來編寫的所有現有的 PHP 程式碼也是一個問題。您真的願意把它們全部扔掉並重新開始嗎?當然不是!

    一個有進取心的 PHP 程式設計人員需要做什麼呢?那就是建立一個囊括大多數上述新優勢的新框架。Zend 框架由此誕生了。

    Zend 框架提供了簡潔穩定的程式碼,也許最為重要的是,它是在明晰的智慧財產權下完成的。PHP 正在企業界跑馬圈地,但如果您是一家財富 500 強公司,您不會願意冒險將模組提交給一個也許是屬於其他公司智慧財產權的知識庫。

    準確地講 Zend 框架究竟是什麼呢?Zend 框架俱有以下特徵:

    是基於 PHP 建立的。 
    是麵嚮物件的。 
    使用 MVC 範例。 
    俱有開放源碼貢獻者。 
    有貢獻者負責保證他們的程式碼不是他人的智慧財產權。 
    透過建立 MVC 模式,Zend 框架的目的是使編程生活更加輕鬆,這不僅體現在通用領域,而且對您始終想要做的俱體的事情也是如此,比如訪問資料庫或輸出 PDF 檔案。(也許您一直都不輸出 PDF 檔案。但如果它更簡單的話,我想您會去這樣做的。)

Zend 框架元件包括:

Zend_Controller
此模組為應用程式提供全麵的控制。它將請求轉化為特定的行為並確保其執行。
Zend_Db
此模組基於 PHP 資料物件 (PDO) 並提供一種通用方式來訪問資料庫。
Zend_Feed
此模組使使用 RSS 和 Atom 提要變得簡單。
Zend_Filter
此模組提供字串篩選函式,如 isEmail() 和 getAlpha()。
Zend_InputFilter
對於 Zend_Filter,此模組是用來操作陣列的,如表單輸入。
Zend_HttpClient
此模組使您能輕易地執行 HTTP 請求。
Zend_Json
此模組使您能夠輕易地將 PHP 物件轉換成 JavaScript 物件符號,反之亦然。
Zend_Log
此模組提供通用日誌功能。
Zend_Mail
此模組使您能夠發送文字檔案和多部分 MIME 電子郵件。
Zend_Mime
此模組被 Zend_Mail 用來解碼 MIME 訊息。
Zend_Pdf
此模組用來建立新的 PDF 文檔,及載入和編輯現有文檔。
Zend_Search
此模組使您能在現有文字上執行復雜搜尋。例如,您可以建立一個搜尋引擎,該引擎可以基於相關性或其他因素返回結果。
Zend_Service_Amazon、Zend_Service_Flickr 以及 Zend_Service_Yahoo
這些模組提供對這些 Web 服務 API 的簡單訪問。
Zend_View
此模組處理 MVC 模式的 “視圖” 部分。
Zend_XmlRpc
此模組使您能夠輕易地建立 XML-RPC 客戶機。(已為將來計劃好伺服器功能。)
現在來看一下我們的目的和在實現這個目的的過程中將做些什麼

    項目

    為了展示 Zend 框架的所有的內幕,需要一個涵蓋 Zend 大部分功能的項目。那很好,因為我最喜愛的項目仍然是線上提要閱讀器。為什麼呢?因為我還未找到一個能夠真正實現我想要實現的功能的項目。每當我掌握一門新技術時,我就試着制作一個比我以前用的要更好的提要閱讀器。所以我們要建立一個新的線上 RSS/Atom 提要閱讀器服務。

    這個世界真的需要另一個線上提要閱讀器嗎?也許。但我不介意我是其惟一的使用者。並且要點是:Zend 框架目的在於使我能用於項目上的東西足夠簡單。我用它們僅僅是因為我想,而不是因為我花了價值成百上韆美元的研究來證明它。那麼這個作為新聞管理員的寶貝應該實現些什麼呢?目前來講,它應當俱備以下功能:

使使用者能夠儲存提要或訂閱的集合。
使使用者能夠閱讀提要和單個條目。
使使用者能夠儲存單個帖子。
使使用者能夠針對特定的文字來搜尋已儲存的條目。
使使用者能夠容易地閱讀沒有 RSS 提要的页面。
使使用者能夠列印帖子集合。

在本係列中,我將嚮您展示如何透過 Zend 框架來實現所有這些功能。本係列包括:

第 1 部分:基礎
本文在總體上解釋了這個項目和 Zend 框架。
第 2 部分:新增資料庫
此教程展示如何使用 Zend_DB 模組建立並操縱用來存儲訂閱資訊、已儲存條目和其他資訊的中央資料庫。
第 3 部分:提要
現在我們把提要加入到這個整體中來,使使用者能夠建立一個帳戶、訂閱特定的提要,並顯示這些提要。此教程使用 Zend_Feed 和 Zend_Inputfilter 模組,後者用來檢驗電子郵件地址並去除提要條目中的 HTML 標記。
第 4 部分:當沒有提要時:Zend_HTTPClient 模組
並非所有的站點都有提要,但在同一個地點追蹤所有的東西還是有用的。這篇文章展示了如何使用 Zend_HTTPClient 模組來建立代理將資料拖入提要閱讀器介麵中。
第 5 部分:建立 PDF 檔案
此教程解釋如何使用 Zend_PDF 模組來用儲存的文章、影像和搜尋結果建立自訂的 PDF 檔案。
第 6 部分:發送電子郵件
這篇文章解釋如何使用 Zend_Mail 模組提醒使用者有新的帖子和訂閱的提要,甚至使用 HTML 格式的電子郵件發送這些帖子。
第 7 部分:搜尋
這篇文章解釋如何使用 Zend_Search 模組針對一個特定的搜尋條件搜尋現有的和已儲存的日誌條目,並返回排列好的結果。
第 8 部分:新增相關的資訊和服務
此教程解釋如何使用 Zend_Service 模組從其他服務特別是從 Amazon、Flickr 和 Yahoo! 獲取資訊。此介麵將使用 Ajax 從當前日誌條目或者使用者指定的搜尋條件中獲取相關的書、照片和搜尋結果。
第 9 部分:新增 Ajax
Zend 框架透過本機 PHP 物件同 JavaScript 物件符號 (JSON) 之間的自動互換使得在應用程式中新增非同步的 JavaScript + XML (Ajax) 互動變得簡單。這篇文章展示了如何將此功能新增到提要閱讀器中,還簡單描述了 JSON。

   安裝

   Zend 框架不需要任何特別的安裝,但您需要牢記一些需求。Zend 框架需要 PHP V5,它同 V5.0.4 及以上版本相容,所以您可以使用而不是必須用 V5.1。但無論如何,您必須確保庫目錄包含在 include_path 中,Zend 框架將從中尋找其所有的檔案。要想這樣,請確保在 php.ini 檔案中設定 include_path,如:

; Windows: "path1;path2"
include_path = ".;c:phpincludes;e:swzendframeworklibrary"
這樣就可以了。

   MVC 模式

   提到圖形設計,我不可能知其不可為而為之,因為這不是我所擅長的。然而,給我一個其他有天賦的人拼湊好的設計,我可以用那個介麵完成您想完成的任何事情。因而,能夠分解好一個基於網路的應用程式的設計相關的工作是非常有利的,這樣,設計人員、編碼人員和 DBA 都可以做他們各自擅長的事情。這就是 MVC 模式的實質,它將一個項目分解成三層。

   模型層 由真實資料的表示組成。例如,在我們的提要閱讀器項目中,包含了使用者、提要和提要條目。它們在資料庫中的表示總體上 “建模” 了它們的結構,從而組成了模型層。

   視圖層 由一些邏輯組成,這些邏輯實際上定義了顯示的資料如何表現。它並不決定這些已顯示的資料是什麼,而僅僅是它們如何表現。理想狀態下,該模組不包含任何邏輯,隻接受所給資訊,並把它們顯示出來。

   控制器 實際上定義了資料是什麼。事實上,控制器是所有邏輯存放的地方。在 Zend 框架中,該層控制了要執行的行為。例如,如果我想要顯示單個提要條目物件,那麼職責被解析為:提要條目物件俱有一個控制器,該控制器定義了當調用顯示行為時所發生的事情。該顯示行為回呼以從模型(或者說是資料庫或其他持久性記憶體)中獲取需要的資料,然後將這些欄位 —— 如標題、內容、持久連結等 —— 填入視圖中,該視圖可以將其簡單地顯示在浏覽器中。

   應當承認,對大多數程式設計人員來說,這是一次啓程。儘管存在物件,但 PHP 始終是一門過程化的語言。儘管如此,這項交易是絕對值得的。按照 MVC 模式建置應用程式遠要比建置一個裡麵亂成一團的應用程式要簡單的多。

   現在,讓我們來看看您需要做些什麼。

   編碼準則

   當您為 Zend 框架編碼,或使用其編碼時,您應該遵循特定的準則。這些準則是為了使團隊項目變得更加簡單而設計的。換句話說,透過定義編碼規範,您不僅能避免接下來的問題,而且能夠使其他人更容易閱讀您的程式碼。Zend 框架文檔中包含幾頁指導準則,比如:

   確保檔案整潔。換句話說,在檔案頭、標準的四格縮進等前麵不能有任何前導或者後置的空格,這些空格會調用 Web 伺服器導緻意外地發送內容。
有且隻有當類作為 Zend 框架的一部分時,而不僅僅是使用 Zend 框架時,類名才以 Zend_ 開頭。
在函式名中底線是禁止的。而是使用小寫開頭大小寫間隔的方式(如 getTodaysDate())。
隻有當變數是 private 或 protected 類型時,才以底線開頭。
將所有的變數宣告為 private、protected 或者 public,而不要使用 var。
使用標準的 PHP 標記(如 ),而不是簡寫方式 ()。
確保您的程式碼易於閱讀。換句話說,當使用一個句號 (.) 連線文字時,確保在句號前後加上空格以便於閱讀。同理,當宣告一個陣列時,要在逗號後麵加上空格。
如果您必須透過引用傳值,那隻能在函式宣告中這樣做。調用時透過引用傳值是不允許的。
任何 PHP 檔案都必須包括能被 PhpDocumentor 閱讀的文檔,並且編碼準則指定了特定的最少標記。
當然這並不是完整的編碼準則清單,但它應能讓您對所需要遵循的準則類型有所瞭解。檢視文檔瞭解整個準則清單,以使您的程式碼會更容易滿足使 PHP 項目更易共用的承諾。

   結束語

Zend 框架提供了一種新的、特定於 IP 的方式來建置 PHP 應用程式。因此,Zend 框架旨在改善您的 PHP 編碼體驗。在本係列中,我們將使用 Zend 框架來建置一個 RSS/Atom 提要閱讀器。本係列以後的部分將涵蓋資料訪問、搜尋、Web 服務以及該框架的其他部分。在第 2 部分中,將建立登入係統並開始建置資料庫。

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计