顯示具有 bake 標籤的文章。 顯示所有文章
顯示具有 bake 標籤的文章。 顯示所有文章

2010年2月17日 星期三

CakePHP教學 on OSX(七)Blog練習:(1)命名習慣

CakePHP沿襲RoR的觀念,使用“慣例優於組態(Convention over Configuration)”的“設計典範(Design Paradigm)”。因此不論是程式檔案與功能函式的名稱、放置程式檔案的目錄名稱與路徑、或是資料庫表格的名稱與欄位的設計,都有一定的命名慣例。

依循慣例設計程式的好處,一方面可以讓CakePHP這種程式框架可以自動地產生相關的程式樣板以加速程式的開發的速度;另一方面也方便開發者閱讀與理解程式與函式之間的關聯性,方便程式的管理與維護。唯一的缺點,就是要注意英文名詞的單複數問題,避免使用程式框架已經使用到的關鍵字詞,同時要不小心迷失在一堆複雜的檔案路徑之中。

“類大檔小”與“模單表複”慣例
CakePHP是採用物件導向的程式編寫範式,因此每個程式檔案就是一個“類別(class)”。程式語法中,類別的名稱用“駝峰式命名法”,每個詞的第一個字母大寫,多個詞之間不留空白;但是程式檔案名稱則是全部小寫,多個詞之間要用“_”符號分開。

因為英文名詞有單複數的分別,所以基本上CakePHP命名方式也有單複之分。除了“模型(model)”類別通常是以(一個詞或多個詞組合的)單數名詞命名之外,“控制器(controller)”、“視圖(view)”程式,以及儲存模型的“資料表(table)”等等,都是以“複數名詞”命名。除非是“單複數同形”的名詞,不要忘了開加上“s”、“es”或“ies”的地方要正確(這是考托福嗎!?),以免整個CakePHP程式框架因為命名問題運作出錯。

因此按照CakePHP的命名方式,一個“User”類別有關的所有程式的命名與路徑如下:
模型:程式根目錄/models/user.php
class User extends AppModel {
    var $name = 'User';
    ....
}

控制器:程式根目錄/controllers/users_controller.php
class UsersController extends AppController {
    var $name = 'Users';
    ....
    function index() {
        ....
    }
}

視圖:程式根目錄/views/users/動作函式名稱.ctp
視圖檔案可以針對控制器中個別的動作函數指定,例如控制器UsersController之中的index函數的視圖檔案,應該是:程式根目錄/views/users/index.ctp

還好,大部份的時候我們可以用CakePHP提供的bake程式把這些檔案範本製作出來,不用自己傷腦筋命名問題。不過熟記這些命名與路徑慣例,對於修改與維護程式功能就很有用。不過跟RoR架構不同,CakePHP要先把資料庫架構好,才能用bake指令自動地“烤”出應用程式。
上一篇下一篇:資料庫設計

2009年12月23日 星期三

CakePHP教學 on OSX(六)Todo應用程式練習:(3)應用程式測試 Taste “todo” cake!

CakePHP的bake all腳本可以根據資料表的架構(schema),一次產生CRUD所需的程式碼。如果你按照幾篇的動作已經用bake all將items資料表的程式產生,就可以在瀏覽器輸入 http://localhost/todo/items 這個網址來測試。如果要在Aptana裡測試,請按照這一篇的方法,用“Run As > PHP Web Page”執行todo專案下的index.php叫出Aptana的內建瀏覽器,然後在輸入 http://localhost/todo/items 這個網址來測試。

CakePHP遵循MVC軟體架構,語言的編寫方式是採用物件導(Object-Oriented Programming)。所謂的“物件導向”是用“物件”來類比一個“獨立的程式”。一個“物件”有自己的“屬性(properties)”跟“行為(behaviors)”,例如一隻“小狗”會有自己的“品種”、“年齡”、“毛色”等屬性,以及“吃、喝、拉、撒”等行為。“物件”在實際的程式撰寫時,通常就是一個“獨立的程式檔案”,其內容稱為一個“類別”。一個“類別”的物件屬性,就是以類別的“變數(variables)來儲存;而“類別”的物件行為,就是以“函數(functions)”來實現。把適當的資料傳入一個“類別”的“函數”,就會引發一些行為,例如改變自己或其他類別的“屬性”,或引發自己或他類別的近一步的“行為”。物件導向的編寫方式有好處也有壞處,但基本上已經是目前廣被採用的程式設計典範,因此PHP語言在第4版之後就開始支援物件導向的語法。

其次所謂的MVC架構,簡單的說,就是把一個完整的應用程式的複雜任務,分為(資料儲存與驗證的)模型(model),(資料存取與運算的)控制器(controller)以及(資料輸出入與運算結果顯示的)視圖(view)三個部份。用“物件導向”來實現MVC架構,就是把一個應用程式拆成三個model, controller 以及 view 三個類別,也就是(至少)三個獨立分離的程式檔案。每個類別裡都有自己的變數與函數,功能獨立並可以互相傳遞資料。

跟“物件導向”一樣,MVC架構對於小型的應用程式來說是殺雞用牛刀,比較適合大型與複雜的功能。就我個人的看法,“物件導向”配合MVC的好處,可以將整個複雜的程式,分離成比較簡單與獨立的任務。當任務一多會有點繁雜,並產生除錯上的困難。但因為每個任務都簡化了,所以相對來說,可以容易完成程式的撰寫。


“Todo” 測試
  1. 基本上Cake的設計,是以 http:/網站根目錄/控制器名稱/函數名稱/函數引數 的方式,來導入或呼叫相關的程式。前面的練習我把應用程式寫在MAMP的網頁根目錄下的todo檔案夾,所以應用程式根目錄應該是 localhose/todo
  2. 由於我們的todo程式是用bake all腳本用從資料庫內的items資料表產生,所以控制器名稱就是 items 。依照CakePHP的命名規則,model名稱是名詞單數,例如如item,item的控制器以及資料表通常就是model名稱的複數,例如items。(所以建立資料表的時候,名稱記得要加“s”。)因此只要在瀏覽器輸入 http://localhost/todo/items 這個網址,就可以看到用來控制items資料表的items控制器程式的首頁。(由於目前CakePHP的除錯(Debug)模式是開啟的狀態,所以底下會看到SQL程式存取資料庫的輸出結果。):
  3. CakePHP的bake all腳本,會一次製作出items控制器的好幾個函數,例如:add, view, edit 與 delete 等等。因此如果要新增一筆資料,只要輸入網址: http://localhost/todo/items/add ,或網頁按下方的“New Item”連結,就會進入新增資料的頁面。請試試看新增幾筆資料看看。
  4. 如果已經有了幾筆資料後,要編輯 id=1 的這筆資料,只要輸入網址: http://localhost/todo/items/edit/1
  5. 如果要查看 id=1 的這筆資料的完整內容,只要輸入網址: http://localhost/todo/items/view/1
  6. 如果要刪除 id=1 的這筆資料,只要輸入 http://localhost/todo/items/delete/1 ,然後todo程式會提示確認是否要刪除?
  7. 這樣一來CRUD的“Create(add)”、“Update(edit)”、“Delete”都有了,那“Retrieve(find?)”呢?CakePHP的bake all產生出來的程式,是把items控制器的首頁,作成“find all”顯示所有的資料,並以“List”方式輸出,甚至還有分頁的功能!所以其他add, edit, view, delete頁面的“List Items”,都會導回到 http://localhost/todo/items 這個網址。所以“Retrieve”功能也算是有了。
這個todo練習只有用到一個資料表,蛋多數的網站需要多個彼此關連的資料表才能實現。因此接下來實作比較複雜一點,使用多個資料表的Blog網站。

2009年12月22日 星期二

CakePHP教學 on OSX(六)Todo應用程式練習:(2)自動產生程式碼 Bake All 一次烤熟!

雖然翻了幾本CakePHP跟RoR的書,但都還沒有全部看完。不過就我目前的了解,兩者建立資料庫的方式有點不同。RoR可以透過建立migrate檔案,記錄歷次資料庫架構(schema)設計上的改變,作為版本遷移的依據。RoR並且可以透過migrate檔案,產生不同的資料庫系統建立資料表所需的SQL程式碼,並自動產生資料庫檔案。這樣一來讓RoR的開發與資料庫的設計,不會遷就特定的資料庫系統而必須大幅修改程式碼。就這點來說,RoR可說是非常先進的設計。

CakePHP卻是要先用phpMyAdmin或其他的工具,在資料庫系統中先構建出完整的資料庫檔案,然後才能透過schema腳本從既有的資料庫備份出SQL檔案,作為資料庫架構的記錄與遷移的依據。或是先用SQL語言寫好資料庫的架構,再透過schema腳本將資料庫製作出來。方法上也許沒有RoR先進,但是我想一般的PHP開發者,應該都很熟悉這樣的開發方式。而且只要資料庫架構設計的夠好夠正確,透過bake腳本自動產生程式碼,甚至比RoR一步步地架構 scafford 還要迅速哦!這篇還是根據“Beginning CakePHP: From Novice to Professional”這一本書的第一個“Todo”範例加以修改。

用phpMyAdmin建立 todo 資料庫、帳號與密碼
  1. 打開MAMP視窗(基本上開發PHP過程中,MAMP應該都要一直開著),按一下“Open Start Page”按鈕:
  2. 按一下上方的“phpMyAdmin”標籤:
  3. 基本上MAMP是開發用的通常都不會拿來當正式的伺服器,所以root使用者我也沒有去更動密碼(有嘗試變更過但會出錯),所以MySQL的root安全性問題,這裡先跳過。phpMyAdmin的預設介面語言是英文,如果不習慣,可以在下方的“Interface”下的“Language”選單,選擇“中文 Chinese traditional”:
  4. 接下來要製作todo帳號跟資料庫。如果不是在phpMyAdmin的首頁,先點一下左上角的“小房子”圖像跳到首頁,後點一下上方的“權限”標簽,再點下方的“新增使用者”的超連結:
  5. 進入“新增使用者”的頁面,在“登入資訊”區內,“使用者名稱”欄位輸入:todo,主機選“本地(localhost)”,“密碼”跟“確認密碼”輸入相同的密碼值(之前bake腳本時設定的是:todo2009),不要按產生密碼按鈕。下方的“Database for user”區,請勾選第二項“Create database with same name and grant all privileges”,這樣就會自動產生一個同名的todo資料庫,並給同名的使用者與完全的存取權限。為了安全起見,“整體權限”內容請勿勾選。確認設定一切無誤後,請按右下方的“執行”按鈕:
  6. 指令執行成功的話,todo帳號跟同名的資料庫就產生了。點一下左側邊欄的“todo”連結,進入todo資料庫:
  7. 進入進入todo資料庫後,按一下上方的“SQL”標籤,在下方的欄位中貼上以下的SQL程式碼,然後按下執行:
    CREATE TABLE `items` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(255) CHARACTER SET utf8 NOT NULL,
    `completed` tinyint(1) NOT NULL,
    `created` datetime DEFAULT NULL,
    `modified` datetime DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
  8. 如果SQL程式沒有問題,就會看到items資料表出現在左側邊欄的todo資料庫下方:
  9. 這裡的資料表設計跟“書上”的範例有點不同。“書上”的範例是用一個“date”欄位來儲存時間,但是編寫model的驗證程式時跳過去。但是如果用書上的SQL產生的資料庫導入bake自動地產生程式,測試時發現一直無論“date”欄位如何選擇,都會出現一個“field empty”的驗證錯誤。所以這裡改用兩個CakePHP預設的“魔術欄位”:created”跟modified”兩個欄位,並設定成“datetime”格式,預設值是“NULL”。這樣一來CakePHP會自動地用created”儲存資料產生的時間,並用modified”儲存最後修改的時間,完全不用寫任何一行程式碼!!
增加bake all指令
CakePHP的bake腳本有一個超好用的參數“all”,一次就可以根據資料庫內所有的資料表,建立所有相關的model/controller/view的基本CRUD程式,甚至能自動建立資料表之間的關連性。所以這裡要把之前的bake外部指令修改一下,加入all參數:
  1. 從Aptana的“Run”選單下選擇“External Tools Configurations...”:
  2. 在左側邊欄上的bake指令上按右鍵,選擇“Duplicate”複製一個副本:
  3. 將新的外部指令改名為bake all,將在下方的“arguments”欄位參數改為 bake all ,然後按一下右下方的“Apply”按鈕儲存後,按“Close”按鈕關閉(暫時不要立即執行):
  4. 雖然bake all已經做好,但“Run”選單下卻看不到。要在“Run”選單下顯示bake all指令,請選擇“Organize Favorites...”:
  5. 出現“Organize Exertnal Tool Favorites”視窗,請按“Add”按鈕:

  6. 出現“Add Exertnal Tool Favorites”視窗,勾選要增加的兩個指令,或按“Select All”之後,按“OK”關閉視窗:
  7. 回到“Organize Exertnal Tool Favorites”視窗,請按“OK”按鈕關閉。以後就可以在Run選單裡看到bake跟bake all兩個外部指令:

用bake all自動建立基本的CRUD應用程式
  1. 外部指令bake all作好後,就可以套用在專案上。請先點一下左邊“PHP Explorer”視窗裡的“todo”專案圖示,然後從“Run”選單下選取“bake all”指令:
  2. Aptana會在下方的“Console”視窗顯示“bake all”的輸出結果。“bake all”會依照/config/database.php所設定的連線資料,從資料庫裡截取每一個資料表,依序循問要不要建立相關的model程式。接下來的操作都要在“Console”視窗裡輸入指令:

  3. 因為todo資料庫裡只有一個“items”資料表,所以這裡也只顯示一個項目,請輸入 1 後按下Enter繼續:
    Welcome to CakePHP v1.2.4.8284 Console
    ---------------------------------------------------------------
    App : todo
    Path: /Applications/MAMP/htdocs/todo
    ---------------------------------------------------------------
    ---------------------------------------------------------------
    Bake All
    ---------------------------------------------------------------
    Possible Models based on your current database:
    1. Item
    Enter a number from the list above, type in the name of another model, or 'q' to exit
    [q] > 1
  4. 接下來bake指令就開始自動產生所有的基本程式。過程中好像會發生時區設定的小問題,但不影響程式的產生。然後會出現製作檔案的提示,你可以看看bake all為你製作了哪些檔案。完成後,會顯示“Bake all complete”:
    One moment while the associations are detected.

    Baking model class for Item...

    Creating file /Applications/MAMP/htdocs/todo/models/item.php
    Wrote /Applications/MAMP/htdocs/todo/models/item.php
    Item Model was baked.

    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/tasks/model.php on line 879

    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/tasks/model.php on line 879

    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/tasks/model.php on line 930

    Baking test fixture for Item...

    Creating file /Applications/MAMP/htdocs/todo/tests/fixtures/item_fixture.php
    Wrote /Applications/MAMP/htdocs/todo/tests/fixtures/item_fixture.php

    Baking unit test for Item...

    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/tasks/model.php on line 736

    Creating file /Applications/MAMP/htdocs/todo/tests/cases/models/item.test.php
    Wrote /Applications/MAMP/htdocs/todo/tests/cases/models/item.test.php

    Creating file /Applications/MAMP/htdocs/todo/controllers/items_controller.php
    Wrote /Applications/MAMP/htdocs/todo/controllers/items_controller.php
    Item Controller was baked.

    Baking unit test for Items...

    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/tasks/controller.php on line 487

    Creating file /Applications/MAMP/htdocs/todo/tests/cases/controllers/items_controller.test.php
    Wrote /Applications/MAMP/htdocs/todo/tests/cases/controllers/items_controller.test.php

    Creating file /Applications/MAMP/htdocs/todo/views/items/index.ctp
    Wrote /Applications/MAMP/htdocs/todo/views/items/index.ctp

    Creating file /Applications/MAMP/htdocs/todo/views/items/view.ctp
    Wrote /Applications/MAMP/htdocs/todo/views/items/view.ctp

    Creating file /Applications/MAMP/htdocs/todo/views/items/add.ctp
    Wrote /Applications/MAMP/htdocs/todo/views/items/add.ctp

    Creating file /Applications/MAMP/htdocs/todo/views/items/edit.ctp
    Wrote /Applications/MAMP/htdocs/todo/views/items/edit.ctp
    Bake All complete
  5. 不過bake all完成後,還會繼續詢問是否產生其他model程式。如果再輸入一次選項 1 的話,bake all腳本會重新再製作一次所有的程式,而且檔案夾裡如果已經有重複的程式檔案的話,還會詢問你是否要“覆寫”?如果不要再重新產生或製作其他的model,請輸入 q 後按 Enter 結束bake all腳本:
    ---------------------------------------------------------------
    Bake All
    ---------------------------------------------------------------
    Possible Models based on your current database:
    1. Item
    Enter a number from the list above, type in the name of another model, or 'q' to exit
    [q] > q
    Exit
  6. 請注意,Aptana的“PHP Explorer”視窗並不會立即顯示剛剛bake all所產生的所有新檔案。請在 todo 專案圖像上按右鍵,選擇“Refresh”後,才能看到剛剛新產生的程式檔。
到這裡我們已經用CakePHP產生一個基本的俱備資料庫CRUD功能的應用程式,但其實只改了database.php裡的一行參數加上括號而已,大部份的時間都是在設定Aptana的功能而已,一個完整的應用程式就給烤出來了產生了。接下來請在瀏覽器裡輸入 http://localhost/todo/items 這個網址,品嚐看看一口CakePHP為我們烤出來的todo蛋糕滋味如何?

CakePHP教學 on OSX(六)Todo應用程式練習:(1)烤出應用程式 "Todo" a First Cake!

這篇是根據“Beginning CakePHP: From Novice to Professional”這一本書的第一個“Todo”範例加以修改,不過不過與書中範例不同的是,這裡要用bake腳本自動產生程式碼,並嘗試跟MAMP的伺服器作結合。

看過幾本CakePHP的書,包括官網上面的範例,都是直接把程式檔案放在跟 cake 核心檔案夾同一層的 app 檔案夾裡,然後按照M/C/V的方式把model, controller 跟 view 的相關檔案放在 app 底下特定的檔案夾裡,像是這樣:

但是如此一來,如果要分開作幾個不同的練習,或是分別開發幾個網站的話,不同的應用程式的程式碼,都會分散在 app 檔案夾裡的不同檔案夾裡給全混在一起分不開了。如果從頭到尾只寫一個應用是沒問題,但剛開始學CakePHP時,想分開寫第二個應用練習時就慘了。如果針對每個練習的檔案夾裡都複製一份cake的核心當然可以,但如果所有練習用的應用程式或不同的站台,都能套用同一個版本的CakePHP核心不是更好嗎?

官方往站雖然有說明“三種安裝方式”,示範如何把應用程式寫在 app 檔案夾之外,但看來看去還是語焉不詳。試了半天,發現在Aptnata裡配合之前作好的 bake 腳本,直接烤出一整個應用程式的基本設定檔案,一切馬上變得非常簡單,不用再傷腦筋config要怎麼修改。要讓多個不同目錄的應用程式使用一個相同的CakePHP核心的方法如下︰

新增“todo”專案
  1. 按Aptana視窗的新增圖像,選擇“PHP Project”:
  2. “New”視窗出現,按“Next”按鈕:
  3. 在“Project Name”欄位輸入專案名稱 todo ,點選“Creat project form existing source”,然後按下“Browse...”按鈕:
  4. 將路徑導引到MAMP的網頁根目錄 /Applications/MAMP/htdocs 下(不要放在cake_1_2之內),然後按“新增檔案夾”按鈕:
  5. 輸入新檔案夾名稱為 todo ,然後按下“製作”按鈕:
  6. 系統會打開 todo 檔案夾,請按“打開”按鈕:
  7. 回到“PHP Project”視窗,請按“Finish”結束。

Bake an “todo” App
  1. 接下來要“烤”出 todo 程式的基本設定,點一下Aptana左邊“PHP Explorer”欄的“todo”專案,然後從“Run”選單選之前作好的“External Tools > 1 bake”指令:
  2. 接下來Aptana底下的Console視窗會出現bake腳本的設定提示,接下來的操作都要在這個Console分割視窗裡輸入一些參數:
  3. 如果之前設定bake指令時,有在“Working Directory:”欄位正確輸入 ${project_loc} 參數的話,bake應該就會擷取到目前專案的正確路徑 /Applications/MAMP/htdocs/todo
    Welcome to CakePHP v1.2.4.8284 Console
    ---------------------------------------------------------------
    App : todo
    Path: /Applications/MAMP/htdocs/todo
    ---------------------------------------------------------------
  4. bake是交談式的腳本程式,第一個問題要確定 app 檔案夾。這裡要將 todo 當成 cake 的 app 檔案夾使用,所以請輸入 /Applications/MAMP/htdocs/todo 然後按下Enter
    What is the full path for this app including the app directory name?
    Example: /Applications/MAMP/htdocs/todo/myapp
    [/Applications/MAMP/htdocs/todo/myapp] > /Applications/MAMP/htdocs/todo
  5. 接下來準備要開始“烤”出整個專案,這裡會在確認一次路徑設定,請輸入 y 按下Enter
    Bake Project
    Skel Directory: /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/templates/skel
    Will be copied to: /Applications/MAMP/htdocs/todo
    ---------------------------------------------------------------
    Look okay? (y/n/q)
    [y] > y
  6. 接下來會提示要不要看到輸出的過程,如果要請輸入 y 按下Enter
    Do you want verbose output? (y/n)
    [n] > y
  7. 上一題如果回答,就會看到bake開始從skel檔案夾複製必要的檔案(這裡省略了大部分的過程):
    ---------------------------------------------------------------
    Created: todo in /Applications/MAMP/htdocs/todo
    ---------------------------------------------------------------
    /Applications/MAMP/htdocs/cake_1_2/cake/console/libs/templates/skel/.htaccess copied to /Applications/MAMP/htdocs/todo/.htaccess
    .
    .
    .
    .
    .
    .
    Creating file /Applications/MAMP/htdocs/todo/views/pages/home.ctp
    Wrote /Applications/MAMP/htdocs/todo/views/pages/home.ctp
    Welcome page created
    Random hash key created for 'Security.salt'
    CAKE_CORE_INCLUDE_PATH set to /Applications/MAMP/htdocs/cake_1_2 in webroot/index.php
    CAKE_CORE_INCLUDE_PATH set to /Applications/MAMP/htdocs/cake_1_2 in webroot/test.php
    Remember to check these value after moving to production server
    Your database configuration was not found. Take a moment to create one.
  8. 接下來進入資料庫的設定。雖然我們完全還沒設定好todo的資料庫,不過這裡可以先設定相關的資料,等一下再用phpMyAdmin把資料庫建好。前三個問題分別是問連線名稱資料庫驅動程式類別連線方式資料庫主機位址。這四項都不需要更動,請直接按下 Enter 跳過去:
    ---------------------------------------------------------------
    Database Configuration:
    ---------------------------------------------------------------
    Name:
    [default] >
    Driver: (db2/firebird/mssql/mysql/mysqli/odbc/oracle/postgres/sqlite/sybase)
    [mysql] >
    Persistent Connection? (y/n)
    [n] >
    Database Host:
    [localhost] >
  9. 接下來要設定資料庫連接埠。因為是搭配MAMP的MySQL資料庫,這裡正確的值應該要輸入 '/Applications/MAMP/tmp/mysql/mysql.sock' ,不過bake腳本不能接受一點或二點括號,所以這裡暫時先輸入 /Applications/MAMP/tmp/mysql/mysql.sock 按下 Enter,稍後再來修改:
    Port?
    [n] > /Applications/MAMP/tmp/mysql/mysql.sock
  10. 接下來要輸入資料庫的用戶名稱連線密碼資料庫名稱資料表前置詞資料表文字編碼。這裡的設定請抄起來,等下要到phpMyAdmin設定資料庫。如果要放中文或多國文字資料,請輸入 utf8
    User:
    [root] > todo
    Password:
    > todo2009
    Database Name:
    [cake] > todo
    Table Prefix?
    [n] >
    Table encoding?
    [n] > utf8
  11. 產生設定檔前還會確認依次,請輸入 y 按下Enter
    ---------------------------------------------------------------
    The following database configuration will be created:
    ---------------------------------------------------------------
    Name: default
    Driver: mysql
    Persistent: false
    Host: localhost
    Port: /Applications/MAMP/tmp/mysql/mysql.sock
    User: todo
    Pass: ********
    Database: todo
    Encoding: utf8
    ---------------------------------------------------------------
    Look okay? (y/n)
    [y] > y
  12. 最後會詢問是否要增加新的設置,請按 y 按下Enter結束設置:
    Do you wish to add another database configuration?
    [n] > n
  13. 接下來bake會開始產生資料庫連線的設定檔,但因為之前port設定的括號問題,這裡會發生錯誤並終止bake腳本:
    Creating file /Applications/MAMP/htdocs/todo/config/database.php Wrote /Applications/MAMP/htdocs/todo/config/database.php Parse error: syntax error, unexpected '/' in /Applications/MAMP/htdocs/todo/config/database.php on line 8
  14. 不用擔心,基本的設定bake都作好了。我們先看一下已經產生的檔案,再來修改上面的錯誤。在左邊的“todo”專案圖像上按右鍵,選“Refresh”指令,就可以看到todo檔案夾內出現剛剛bake出來的檔案。
  15. 找到 todo/config/database.php 檔案(圖像上有號表示程式發生錯誤)點二下打開。找到第8行,把參數前後加上括號後存檔就可以了(號消失):
  16. 'port' => '/Applications/MAMP/tmp/mysql/mysql.sock',
  17. 接下來先測試todo應用的基本設定有沒有問題。找到 todo/index.php 上按右鍵,選“Run As > PHP Wed Page”。
  18. 如果MAMP已經開啟,Aptana的內建瀏覽器就會顯示出正確的todo首頁“Sweet, "Todo" got Baked by CakePHP! ”:
  19. 不過因為資料庫並未設定好,所以還是會看到幾個黃色的警告提示。不過我們已經成功地在app檔案夾以外的路徑,建立一個CakePHP的應用。這樣的方式可以任意建立多個專案,而且不會與原來的核心程式碼混淆,方便進一步的開發與遷移。
接下來才要設定資料庫,並利用bake指令建立出CRUD的基本應用。