理解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 部分中,將創建登錄繫統並開始構建數據庫。

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计