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的基本應用。

CakePHP教學 on OSX(五)開發環境與伺服器測試:CakePHP in Aptana with MAMP



RoR in Aptana
RoR的魔術之一,是可以透過Generator等用Ruby寫的腳本程式,一口氣自動地產生整個Model, Controller 跟 View等相關的基本程式碼。唯一可惜的是,這個魔術得在終端機視窗裡,手動地鍵入指令來執行。這種方式對於習慣OSX圖形介面(GUI)的人跟懶得記憶指令碼的我來,說真是一場惡夢。所幸Aptana的RadRails套件,把RoR的Generator等腳本都作成一個個的View視窗,可以透過GUI來選擇執行項目與輸入參數。我想光這個功能就可以讓Aptana登上OSX上的RoR開發環境的前幾名了:

Aptana還有內建主控台(Console)分割視窗來顯示輸出結果,不須要離開Aptana去打開“終端機”程式。Aptana甚至還有內建的瀏覽器,可以直接檢視網頁的輸出結果。只差了MySQL資料庫,如果用Splite這個RoR內建的簡單資料庫,開發RoR可以完全在Aptana內進行,不須要其他附加的軟體,可以說是名符其實一網打盡的整合式開發環境。(雖然RadRails還是需要系統預先安裝Xcode套件。安裝RadRails時,Aptana會要求安裝OSX的開發軟體Xcode,因為RadRails還是需要OSX系統內先安裝Ruby的Gem套件,這是Rails管理與安裝相關套件的必要工具。)

CakePHP in Aptana

CakePHP也有類似RoR的Generator自動程式碼產生器,名字叫cake bake的腳本程式。不過也跟RoR的Generator一樣,還是要使用命令列的方式,手動地由終端機上輸入像是火星文一般的指令;或是是透過PHP主控台來執行一個叫“cake.php”的程式。但是如果用了Aptana這類的IDE來還要這麼作,未免也太遜了。可惜Aptana 2.0已經沒有開發官方的PHP套件,除了麵包店裡這一篇“Setting up Eclipse to work with Cake”有解說如何整合Eclipse跟CakePHP之外,網路上也沒有相關Aptana整合CakePHP的中文訊息。不過既然Aptana是基於Eclipse,設定方法應該也類似。於是嘗試一下根據這篇的說明來操作,是了半天終於給試了出來。不過要在Aptana內直接使用cake bake腳本程式,得要先把cakephp輸入成Aptana的專案:
  1. 先確定Aptana已經安裝了PDT套件;MAMP已經啓動;並且在MAMP的網頁根目錄htdocs檔案夾裡已經把CakePHP檔案複製到cake_1_2檔案夾。接下來要把cake_1_2檔案夾,變成Aptana裡建立成一個專案(project):
  2. 按Aptana視窗左上角“新增圖像”右邊那個很小的“倒三角”(哎,這是從Eclipse來的彆腳介面),從選單裡選擇“Project...”;
  3. 接下來要選擇巫師(wizard?),請選擇PHP Project:
  4. 進入“PHP Project”視窗,專案名稱輸入 cake_1_2(最好跟檔案夾名稱一致)。因為要匯入cake_1_2這個檔案夾,這裡要選“Creat project form existing source”,然後按下“Browse...”按鈕:
  5. 找到 /Appliations/MAMP/htdocs 找 cake_1_2 檔案夾(找路徑的過程中請用“點二下”打開檔案夾,不要按右下角的“開啓”按鈕),找到cake_1_2 檔案夾後不要打開,按一下檔案夾圖像再按右下角的 “打開”按鈕:
  6. 回到“PHP Project”視窗,按下“Finish”結束:
  7. 如果本來的“Perspective”(透視?在Aptana/Eclipse 指的是配合不同開發目的,各個相關分割視窗的配製方式)不是PHP,會提示要不要開啓“PHP Perspective”。請按“Yes”,讓Aptana將畫面配製成適合PHP的形式:
  8. 接下來測試一下Aptana內建的網頁伺服器。因為Aptana沒有內建PHP的執行環境,請先確定MAMP伺服器已經開啓,否則無法執行.php檔案。在 cake_1_2 專案下的 index.php 上按右鍵,選取“Run As > PHP Web Page”:
  9. 第一次執行“Run As”,Aptana會提示確認檔案路徑,下次就會用相同地方式執行。請按“OK”:
  10. 如果一切正確,Aptana內建的瀏覽器會顯示CakePHP的首頁:

Bake in Aptana
CakePHP成為Aptana的專案後,接下來要製作Aptana執行cake bake的指令:
  1. 從Aptana的 Run 選單下選擇“External Tools Configurations...”:
  2. 先在“External Tools Configurations”視窗的側邊欄上點一下“Program”,然後按一下左上角的“新增”圖示:

  3. 新增後,在右邊的Name欄位輸入 bake ,然後按一下“Browse Workspace...”:
  4. 出現“Choose Location”視窗,找到 cake_1_2/cake/console 目錄點一下,然後點右邊的 cake 檔案(不是cake.bat或cake.php):
  5. 回到“External Tools Configurations”視窗,在“Working Directory:”欄位輸入:
    ${project_loc}
    並在“Arguments:”欄位輸入:
    bake
  6. 按一下右下角的“Apple”按鈕儲存指令,然後按一下“Run”按鈕執行腳本試看看。如果cake bake有執行的話,應該可以在下方的“Console”分割視窗看到輸出提示。現在只是測試腳本,還不要輸入任何項目,請按“Console”分割區右上方的紅色方塊停止cake bake腳本:
  7. 設定好之後,就可以在“Run > External Tools”選單下看到“bake”指令:
CakePHP 模版 .ctp 檔案編輯
跟CakePHP 1.1 版的模版檔案是 .thtml ,1.2版的模版檔案是 .ctp ,內容都是PHP或HTML的程式碼。但由於Aptana不認得 .ctp ,得要手動設定它跟PHP編輯器的關聯。方法如下:
  1. 從“Aptana Studio”選單下選擇“偏好設定(Preferences...)”:
  2. 從“Preferences”視窗的側邊欄找到的“General > Content Tpyes”,然後點一下右邊的“PHP Content Type”,然後按一下“Add”按鈕:
  3. 在“Content Type”欄位輸入 .ctp ,然後按“OK”:
  4. 接下來設定編輯器的關聯。在側邊欄找到的“General > Editor >File Associations”,然後按一下右邊的“Add”按鈕:
  5. 在“File Type”欄位輸入 .ctp ,然後按“OK”:
  6. 回到“Preferences”視窗,在右下方的“Associated editors:”欄位,點一下“PHP Editor”圖示,然後按一下“Default”按鈕儲存為預設值。最後再按“OK”關閉視窗。

  7. 以後 .ctp 檔案就會自動以PHP editor來編輯。
接下來就可以準備烤第一塊蛋糕了。