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 程式相關程式碼
本例中的 URL root 為 /test/FormExample。
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 架構的設計彈性與可用性。