蒼時弦也
蒼時弦也
資深軟體工程師
發表於

三十分鐘做一個留言板 Part 1

前言


其實我自己也不確定是不是三十分鐘完成,畢竟弦也在製作時花了數倍的時間做 Debug 和架構的動作,不過如果再做一次,我想就有信心三十分鐘完成的!

規劃架構


2012\-01\-03 16\-22\-15

這是弦也在完成後的架構,不過也有先替之後的更新做了準備。 這次我們只需要用到這樣的結構就可以。

除了 lib 資料夾裡面的東西是使用外部的函式庫之外,其餘都是自己撰寫的(.htaccess則是從 Slim Framework 預設給的檔案複製過來的)

這個架構是參考 Slim Framework 官方網站的說明,針對規模比較大的網站所建議的架構,雖然現在規模不大,不過要是有一天要擴大規模時,這個架構就會變得非常方便。

下載 Library 放置


首先,我們要先下載 Slim Framework 以及 ActiveMongo 然後放到 lib 資料夾,這樣之後才能夠使用。

雖然這次會使用到 Twitter 的 Bootstrap 不過我們採用直接連結的方式引入 CSS 檔,因為目前留言板還不需要做太多美化,只要介面看起來簡潔乾淨即可。

Slim Framework

解壓縮 Slim Framework 打開後,應該會看到這樣的畫面。

2012\-01\-03 16\-37\-19

我們只需要 Slim 資料夾以及 .htaccess 檔而已,所以將 Slim 資料夾放到專案的 lib 資料夾裡面,並且把 .htaccess 檔放到專案的根目錄。

.htaccess 檔可以讓我們啟用 Rewrite 功能,有興趣可以到網路上搜尋看看。

####ActiveMongo

解壓縮 ActiveMongo 打開後,應該會發現只看到 lib 資料夾而沒有 ActiveMongo 資料夾,請先別急。 2012\-01\-03 16\-37\-29

因為開發者不一樣的關係,所以習慣也不一樣。打開 lib 資料夾後馬上就發現直接就是檔案,為了方便自己整理,弦也決定重新命名 lib 為 ActiveMongo 並且複製到自己專案的 lib 資料夾內。 現在,專案的 lib 資料夾應該會長成這樣:

完成後,就要開始來撰寫留言板摟!

設定檔


首先,先來對程式的一些基本設定做好準備吧! 我們會使用到資料庫,所以一定要有連接資訊等等,所以先在 app 資料夾下新增 config.inc.PHP 來紀錄一些設定吧!

習慣性的註解一下(其實每次 Version 弦也都會忘記改)

1<?PHP
2/**
3 * Conifg
4 * 
5 * @author Aotoki
6 * @version 1.0
7 */

接著放入資料庫資訊

 1<?PHP
 2/**
 3 * Conifg
 4 * 
 5 * @author Aotoki
 6 * @version 1.0
 7 */
 8
 9//資料庫資訊
10define('DB_HOST', 'localhost'); //伺服器
11define('DB_NAME', '30min-GB-V1'); //資料庫名稱
12define('DB_USER', ''); //使用者名稱
13define('DB_PASS', ''); //使用者密碼

最後把一些常數放進去

 1<?PHP
 2/**
 3 * Conifg
 4 * 
 5 * @author Aotoki
 6 * @version 1.0
 7 */
 8
 9//資料庫資訊
10define('DB_HOST', 'localhost'); //伺服器
11define('DB_NAME', '30min-GB-V1'); //資料庫名稱
12define('DB_USER', ''); //使用者名稱
13define('DB_PASS', ''); //使用者密碼
14
15//設定基準路徑
16if(!defined('ABSPATH')){
17	define('ABSPATH', dirname(__FILE__) . '/');
18}
19
20//設定除錯模式
21define('DEBUG', TRUE);

這樣一來,就完成設定檔了! (說實話,其實弦也平常都是邊寫邊加的,不一定要一開始就全部設定上去。)

建立基礎

現在,我們先在根目錄下新增一個 index.PHP 檔案,他就像 Router (路由) 一樣,全部的請求都會經過他處理(因為 Rewrite 被開啟的關係,伺服器會相關的處理都丟給 index.PHP 處理) 一開始,我們先把一些必要得檔案引用進來(像是 Slim Framework, Active Mongo, 設定檔等等)

 1<?PHP
 2/**
 3 * 30Min Guest Book
 4 * 
 5 * @author Aotoki
 6 * @version 1.0
 7 */
 8
 9//載入 Slim Framework
10require_once('lib/Slim/Slim.PHP');
11
12//載入 Active Mongo (ORM)
13require_once('lib/ActiveMongo/ActiveMongo.PHP');
14
15//載入設定檔
16require_once('app/config.inc.PHP');
17
18?>

接下來,我們要初始化 Slim Framework 讓他可以運行,接著加入以下的程式碼

1//初始化 Slim Framework
2$app = new Slim(
3	array(
4		//'http.version' => '1.0', //在PHPFog或不支援 HTTP 1.1 的伺服器上使用這個設定
5		'templates.path' => 'views', //設定 View 資料夾(視圖層)
6		'debug' => DEBUG, //從設定檔讀取是否啟用除錯
7	)
8);

這樣,我們就可以用 $app 來做相關 Slim Framework 的操作了!

上面這段程式碼,是取得物件的實例並且存在名叫 app 的變數內。 $app 是一個變數,請想像他是一個萬用箱子,可以放入任何東西,但是一次只能有一種東西。 Slim 是一個物件,但是他還未產生實例之前就跟設計圖一樣,裡面紀錄很多關於他的能力。 $app = new Slim(); 這就是我們用 new 產生一個新的物件,叫做 $app 而且他是以 Slim 這個設計圖為基礎製作的。 而在建立時我們會給他一些參數,就像是 templates.path 等等,以上的動作我們可以參考牙膏的製作。 黑人牙膏 = 牙膏(一組秘密配方) 所以黑人牙膏會是黑人牙膏!

然後,我們要先連接好資料庫,不然之後的存取就沒辦法使用了! 一樣,接著前面放入這些程式碼

1//連接資料庫(MongoDB)
2if(DB_USER && DB_PASS){
3	ActiveMongo::connect(DB_NAME, DB_HOST, DB_USER, DB_PASS); //從設定檔讀取資料庫資訊
4}else{
5	ActiveMongo::connect(DB_NAME, DB_HOST); //因為ActiveMongo沒有動態設定使用者名稱/密碼的功能,所以另外檢查
6}

為什麼要用 if(DB_USER & DB_PASS){} 呢?這是因為 Active Mongo 如果不需要帳號密碼時,還是設定進去,會發生錯誤,所以只好這樣設計。(也許我們可以在設定檔將 ’’ 改為 NULL)

然後,要定義對應的位址,這樣 Framework 才知道什麼時候該顯示什麼!

1$app->get('/', function() use ($app){
2	$app->render('home.PHP');
3});
4
5$app->run(); //啟動 Slim Framework

$app->get(); 的 get 就是所謂的方法,就像牙膏可以有「擠」這個動作一樣。

function() use ($app) 是 PHP 5.3 之後的功能,要這樣使用請注意自己的 PHP 版本是 5.3 之後,這個功能關係 namespace 暫時不討論

到此為止,我們已經對 index.PHP 做好簡單的設定,現在我們要建立剛剛 render 進來的 home.PHP 好讓留言板能顯示出畫面。

第一個樣板

首先,我們先建立一個空白的網頁,大致建立其基礎。

 1<!DOCTYPE html>
 2<html lang="zh-tw">
 3<head>
 4	<meta charset="utf-8" />
 5
 6	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
 7
 8	<title>My 30min Guest Book</title>
 9	<meta name="description" content="" />
10	<meta name="author" content="Aotoki" />
11
12	<meta name="viewport" content="width=device-width; initial-scale=1.0" />
13</head>
14
15<body>
16	<div class="container">
17		<header>
18			<h1>Guest Book</h1>
19		</header>
20		<nav>
21			<!--- 選單 -->
22		</nav>
23
24		<div>
25			<!-- 內容 -->
26		</div>
27
28		<footer>
29		 <p>&copy; Copyright by Aotoki</p>
30		</footer>
31	</div>
32</body>
33</html>

我選擇了 HTML5 的方式建立,現在打開瀏覽器,連上留言板應該會看到一個粗體字寫著"Guest Book"然後就沒了! 不過,這也是正常的。

小結


好吧,我承認對初次接觸的大家來說做到這樣可能已經花上三十分鐘了! 所以,先休息一下,待會 Part 2 就會繼續解說關於讀取留言的部份,雖然有點抽象,但是等留言功能完成的時候,就會發現非常的感動喔!