相信只要是從事開發網頁的工作的人,在這幾年中,累積了不少用 ASP 或 PHP 開發的網頁程式。剛開始的時後,一切都很簡單。可是隨著網頁變多,要維護或變動,就開始變得很痛苦了。到最後,只要有變動的要求,根本就是夢魘。
最近,流行 MVC 的框架,可以讓開發和維護網頁的工作變得較為輕鬆。那要把原來的網頁程式移轉至 MVC 架構,現有的 PHP 網頁是否必須重新來過,打掉重練? 還是可以逐步移轉至 MVC 架構呢?沒問題,當然可以。在此,提供個人的懶人移植方法,供各位參考。既然稱為「懶人」法,目的只是把原來的程式塞進 MVC 框架中,產生的程式,並不完全符合 MVC 的精神。不過,只要能把程式搬到 MVC 的框架下,就可以等有時間再慢慢修 (refactoring,重構),或者,要新增功能時,就以 MVC 的方式來開發。
在此是以 PHP 的 MVC 框架 -- Laravel 來說明,所以,假如是 ASP 的程式,當然要先轉成 PHP 的程式。要把 ASP 轉成 PHP,不用擔心,早就有人寫好程式 -- asp2php,上網找到,直接使用就是了。轉換後的 PHP 程式,必需要做一些修改才行。例如,它會把資料庫的操作都改成 mysql 的函式。最好是把資料庫操作的部份改成 PDO 界面,一勞永逸,因為在 Laravel 中只支援 PDO 界面。
接下來,進入正題,說明如何將 PHP 網頁程式塞進 MVC 框架,非常簡單。
假如原來有 3 個網頁 page1.php,page2.php,及 page3.php。瀏覽的 url,以 page1.php 為例,如下
http://my.net/page1.php在 MVC 的 controllers 目錄下,建立一個適當名稱的 controller,例如 web.php。再來,將原來的 PHP 網頁都放到 views 的目錄下。這樣就讓原來的程式變成 MVC 架構中的 View 和 Controller 兩部分了。在 MVC 架構下的瀏覽的 url,以 page1.php 為例,如下
http://my.net/index.php/web/page1我一般都不會去特意的將 index.php 隱藏,留著似乎也沒人在意,而我自己在意的是程式好維護就好。
其中,假設 page1 為預設的網頁,則網址 http://my.net/index.php/web 將傳回 page1 的內容。
假如要傳參數,怎麼辦? 放在後面就行啦,如下
http://my.net/index.php/web/page1?usr=ajax&role=Mweb.php 的內容如下
<?phpclass Web_Controller extends Base_Controller { // 未登入者,導向登入畫面 function __construct() { if (!Session::has("user")) { header("Location: ".url("user/login")); } } public function action_index() { return Controller::call('web@page1'); } public function action_page1() { return View::make('page1'); } public function action_page2() { return View::make('page2'); } public function action_page3() {
return View::make('page3'); }} // end of class在這個 controller 中,有做身分的檢查,這部分可以考慮改成框架提供的功能。若想偷懶,就將就著用吧。就這樣,各個 page 幾乎不用修改,就可以正常運作。在移轉過程中,可以將一些設定值放在 config 目錄下的設定檔,例如 database.php。在舊的程式中要取得這些設定值,例如為舊的程式定義一個資料庫連接函式 get_conn()。
function get_conn() { $db_conns = Config::get('database.connections'); $db = $db_conns[Config::get('database.default')]; $dbsvr = $db['host']; $dbnam = $db['database']; $dbid = $db['username']; $dbpwd = $db['password']; try { $conn = new PDO("sqlsrv:server=$dbsvr ; Database=$dbnam", $dbid, $dbpwd); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); } catch(Exception $e) { die( '<pre>'.print_r($e->getMessage(), true).'</pre>' ); } return $conn;}綜結一下,目錄架構如下 (只列出上面提到的)
application ├- config │ └- database.php ├- controllers │ └- web.php └- views └- page1.php, page2.php, page3.php這時,可能會想移轉到 MVC 架構下,有什麼好處呢? 好處是可以慢慢的將一些東西抽出來,改成符合 MVC 架構精神的作法。例如,可以將 view 中的共用部分抽取出來,做成樣版。或者,將一些資料庫的功能放進 model 中。
就這樣,無痛的將舊網頁移轉到 MVC 的架構,然後等有空,心情好時,再慢慢地修飾。
最後,還是得承認,這樣的程式不完全符合所謂的 MVC 分離的精神。但這總是一個很好的起步,讓你脫離害怕面對支離破碎,無法維護的網頁的窘境。日子是自己要過的,沒人規定程式一定得如何寫才可以。
祝 好運,MVC 與你同在!