2007年06月4日

以 PHP-GTK + Glade 設計桌面應用程式 - 混合 Web 應用程式的 MVC 架構敏捷途徑

Tags: php gtk mvc framework 標籤語言 delphi

我們一般對 PHP 的印象是:寫 Web 應用程式的工具。其實它也可以作為單純的解譯器運行一般的本地程式, PHP 稱此運行模式為 CLI mode。若進一步結合 PHP-GTK 擴充模組 (關於 PHP-GTK 的安裝,請參考《Glade/GTK2 for Windows with PHP5 and Ruby 快速安裝指南) ,我們仍然可以使用 PHP 設計具有圖形使用者介面的桌面應用程式。

本文不只單純地說明如何利用 PHP-GTK + Glade 設計桌面應用程式,更要混合現成的 Web 應用程式,一併為各位展示 MVC 架構所帶來的高度彈性與可用性。


PHP 是現今最流行的 Web 應用程式開發工具之一。與基於 MVC 架構的各種 framework 結合之後,開發速度與軟體品質也逐漸提昇。同時這也意味著,有愈來愈多現成的 Model 與 Control 組件可用。 MVC 架構在概念上就已經將使用者輸出入、資料來源、運算處理等等不同工作隔離了,其體質原本就可適應分散式架構。因此對 MVC 架構而言, Web 應用程式與桌面應用程式唯一的差異是使用者介面不同,也就是 View 不同。一但我們嘗試利用 PHP-GTK + Glade 設計桌面應用程式時,我們理論上將可直接使用那些原本是為 Web 應用程式所開發的 Model 與 Control 組件,僅需專注於基於 GTK 函數庫的圖形使用者介面之設計工作。

基於 MVC 架構的 Web 應用程式

在設計桌面應用程式之前,我們先來看一個基於 MVC 架構所設計的 Web 應用程式。這是一個現成的程式開發資源,我們稍候將直接利用此一現成的資源開發桌面應用程式,而且提供相同的操作功能。

Web應用程式操作圖例
Web 程式相關程式碼

本例中的 URL root 為 /test/FormExample

  • FormExample.php - Web 應用程式的進入點 (master/loader)。它可呈現使用者的表單輸入網頁,另一方面也是相關 Control 的調用者。它透過 FormExample.php/$controlName/$methodName/$arguments 的格式調用指定的 Control 組件方法,並將回傳值以 JSON 格式輸出。
  • UserControl.php - UserControl 類,提供使用者資料操作的服務。在本例中,它只有一個 user_profile($userName) 方法。此方法將根據傳入的使用者名稱查詢使用者的相關資料,若無使用者則回傳 false。本例同時將使用者資料直接建立在 UserControl 類之中,故沒有其他的 Model 。
  • view/web/FormExampleView.phtml - View 的網頁樣版。
  • view/web/FormExampleView.js - 瀏覽器端的 JavaScript 程式,利用 Ajax 技術。
  • view/web/FormExampleView.php - Web 應用程式的 View 。
  • view/web/jquery.js - jQuery library。瀏覽器端的 JavaScript 程式所用到的 JavaScript library。
FormExample.php (web ver.)
UserControl.php
view/web/FormExampleView.phtml
view/web/FormExampleView.php (web ver.)
view/web/FormExampleView.js

設計桌面應用程式

首先,我們需要改造一下作為主控程式的 FormExample.php,使其依 PHP 的運行模式判斷其所需的 View 。

以 PHP 內建的系統常數 PHP_SAPI 便可判斷運行模式。當 PHP_SAPI 之值為 'cli' 時,即為本地程式之運行狀態。

我於原本的 view 目錄下建立了 2 個子目錄,分別為 web 與 desktop ,各自放置 Web 應用程式的 View 源碼檔與桌面應用程式的 View 源碼檔。

FormExample.php (兩用版)
桌面應用程式操作圖例
桌面程式相關程式碼
view/desktop/FormExampleView.glade

命名方式跟隨 Web 應用程式的慣例。並設主控視窗元件的名稱為 window ,以表示其意義如同 JavaScript 的 window 個體。

元件 事件 處理方法
window destroy Gtk::main_quit
submit clicked on_submit_clicked
close clicked on_close_clicked

內容過長,不線上顯示。

view/desktop/View.php

設計 View 時,桌面應用程式有許多與 Web 應用程式之設計差異。在 Web 應用程式中,程序員並不需要處理使用者介面的諸多細節。但桌面應用程式就需要決定何時顯現視窗及視覺元件,何時進入等待使用者操作動作的迴圈,以及如何自視覺元件之中取得使用者輸入的資料。將這些細節封裝在此 View 基礎類。

view/desktop/FormExampleView.php

這是桌面程式的 FormExampleView.php 。 Web 版載入 FormExampleView.phtml ,而桌面版則載入 FormExampleView.glade 。至於事件處理方法,在此處的 PHP 程式碼工作,與 Web 版中的 FormExampleView.js 中的 JavaScript 程式所負責的工作相同。

程式碼即文件。本文儘可能地精簡程式碼內容,只使用恰好能展示本文目的之內容。請各位自行閱讀源碼,細細體會 (好吧,我承認我是懶得打字了)。

本文於設計桌面應用程式時,完全使用了原有的 Control 與 Model 組件的程式碼。儘管那些 Control 與 Model 原本是為了 Web 應用程式所設計,但本文仍然未做任何修改便可運用如常。在設計桌面應用程式時所需要做的,就是專注於 View 的內容。本文除了示範如何實作一個封裝 GladeXML 的 View 基礎類,亦適切地展示了 MVC 架構的設計彈性與可用性。


Posted by shirock at 樂多Roodo! │22:28 │回應(0)引用(0)PHP
樂多分類:網路/3C 共同主題:PHP基本語法 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/3400303