第一節
資料庫設定
app/config/database.php檔就是放置資料庫設定參數的地方。
剛剛裝好的CakePHP並沒有這個檔案,要將database.php.default複製一分,將名稱改為:
app/config/database.php
var $default = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name',
'prefix' => '');
把預設值改成自己應用程式的資料庫連線資訊。
注意一下'prefix'參數:這字會被加在對此資料庫操作的SQL指令內的所有資料表名稱前。
在此宣告一次,別的地方就不用再宣告。
如果你被限制只能使用一個資料庫,就可以用prefix讓資料表名稱依然遵循Cake的命名規則。
注意:對JOIN資料表來說,只加入一次前置字的結果是prefix_apples_bananas,不是prefix_apples_prefix_bananas。
CakePHP支援以下幾種資料庫:
mysql
postgres
sqlite
pear-drivername (例如pear-mysql)
adodb-drivername
在$default中的'connect'設定可以指定資料庫是否持續保持連線。
database.php.default檔中的註解有詳細記載如何為你的資料庫選用一種連線方式。
資料庫內的資料表名稱也得遵循以下的命名規則:
Cake使用的資料表名稱必須使用英文字的複數型,像"users","authors",或"articles"。
注意,相對應的Model名稱是單數型。
資料表主欄欄位名稱必須命名為'id'。
如果要建立關聯資料表,外部鍵的命名為:'article_id'。
關聯的資料表名稱的單數型,後面接上'_id'。
如果有欄位名叫'created'或'modified',在新增和編輯時會自動出現相對應的操作介面。
你應該也注意到database.php檔內有個名為$test的連線設定。
填好此設定,接者在Model中放入下面的程式碼使用它:
var $useDbConfig = 'test';在Model裡可以用同樣的方法加入多組連線設定。
第二節
全域設定
CakePHP的全域設定可以在app/config/core.php檔裡找到。
雖然我們實在很不喜歡設定檔,但還是得做。
您可以在這兒改變一些設定,每項設定的使用說明都列在core.php檔內。
DEBUG:設定成不同的值以輔助您除錯。
在這個值大於零時,將強迫Cake印出pr()和debug()所列印的內容。
將它設成2以上的值,則SQL指令會被印在網頁最下方。
同樣的,在除錯模式下(DEBUG的值大於1),Cake會畫出目前出錯的頁面,類似"Missing Controller","Missing Action"等。
在產品模式下(DEBUG的值等於0),Cake就直接秀出"Not Found"頁面,頁面內容可以由app/views/errors/error404.thtml修改。
CAKE_SESSION_COOKIE:將此值設成此應用程式在使用者Session中使用的cookie名稱。
CAKE_SECURITY:透過此值設定Session檢查機制的安全等級。
根據不同設定,session的保留時間會有所不同,也由此值決定是否產生新的session id與是否刪除舊的session檔案。
說明如下:
high:session 在使用者持續10分鐘沒動作後過期,並在每一個request重新產生session id。
medium:session 在使用者持續20分鐘沒動作後過期
low:session 在使用者持續30分鐘沒動作後過期
CAKE_SESSION_SAVE:指定session資料的存放方式。
cake:存放於Cake安裝目錄下的tmp/目錄內。
php:存放的位置由php.ini決定。
database:存放在'default'指定的資料庫內。
第三節
Route設定
"Route"是PHP內類似Apache中mod_rewrite的功能,可以將URL與controller/action/參數相互轉換。
在Cake裡加入Route使它具備更多設定參數,並且不再需要mod_rewrite。
雖然使用mod_rewrite的確能讓位址列看起來更整齊。
Route是指URL與controller和action間相互轉換的規則。
設定檔放在app/config/routes.php。說明說下:
Route Pattern
<?php
$Route->connect(
'URL',
array('controller'=>'controllername',
'action'=>'actionname',
'firstparam')
);
?>
說明:
URL是一個用正規表示式寫成,代表想要轉換的URL的字串。
controllername是要呼叫的controller名稱。
actionname是在沒有輸入action的情況下使用的action名稱。
firstparam是在沒有輸入參數的情況下第一個參數的值。
接在firstparam之後的所有值都會被當參數值傳入controller的action內。
接下來的範例把所有以/blog開頭的URL都連到BlogController內。
預設呼叫的action為BlogController::index()。
Route 範例
<?php
$Route->connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index'));
?>類似/blog/history/05/june的URL處理方式如下:
Controller內Route的處理結果
<?php
class BlogController extends AppController
{
function history ($year, $month=null)
{
// .. 顯示適當的內容
}
}
?>由Blog的route規則看,URL裡的'history'字串合於:action。
URL之後合於*的部分則被當成參數傳到處理方法裡,在此為$year和$month。
若只呼叫/blog/history/05,就只有05會被傳到hisotry()裡。
下面的範例是CakePHP裡預設的route,會將'/'轉到PagesController::display('home')裡控制。
藉由建立/app/views/pages/home.thtml這個檔就可以改變首頁顯示的內容。
預設的Route設定
<?php
$Route->connect ('/', array('controller'=>'Pages', 'action'=>'display', 'home'));
?>
第四節
進階Route設定:Admin Route和Webservice
/app/config/core.php裡有些設定可以用來管理應用程式,和將URL塑造成你和你的使用者最能理解的格式。
第一個就是Admin Route。
如果程式內有個controller叫ProductsController(或NewsController),
而你想讓具有管理權限的使用者透過特別的URL使用controller內特別的action。
為了維持URL的可閱讀性,有些人喜歡將/admin/products/add(和/admin/news/post)改成類似/products/adminAdd(/news/adminPost)。
要做這樣的事,首先,將/app/config/core.php檔內CAKE_ADMIN那一行的註解拿掉。
CAKE_ADMIN的預設值是'admin',可以隨意變更。
記住這個字串,因為所有管理用的action名稱前都會被加上這個字串。
所以,在這個例子中,管理用的action就被改名成admin_actionNanme()。
以下舉些範例:
/admin/products/add CAKE_ADMIN = 'admin'
ProductsController內的action名稱 = 'admin_add()'
/superuser/news/post CAKE_ADMIN = 'superuser'
NewsController內的action名稱 = 'superuser_post()'
/admin/posts/delete CAKE_ADMIN = 'admin'
PostsController內的action名稱 = 'admin_delete()'
使用Admin Route可以讓Route看起來更合乎使用邏輯,設定也很容易。
請注意,啟動Admin Route並不代表啟動任何認証或安全機制。這些還是得自己做。
類似的方法,也可以用於啟動Webservice Route。
想讓controller的Action以Webservice的方式開放給他人使用嗎?
首先,將/app/config/core.php設為'ON'。
這樣會啟動一自動Route功能,將帶有下面前置詞的Action轉向:
rss
xml
rest
soap
xmlrpc
它做的事就是讓你在收到/rss/controllerName/actionName或/soap/controllerName/actionName時,指定另一個view顯示。
讓一個action擁有二個view:一個是一般的HTML使用者使用,另一個是給Webservice使用者使用。
透過這個功能,可以讓程式中的函式透過webservice的管道使用。
例如,假設程式內有個邏輯會告訴使用者辦公室現在誰在電話上。
我已經有一個HTML view顯示這個資料,但現在想要以XML格式提供這個資料,以便將它放在桌面的小程式或讓別的應用程式處理。
首先,必需啟動Cake的Webservice Route:
/app/config/core.php (部分)
/**
* 將webservice功能打開或關閉,預設是關閉。
*/
define('WEBSERVICES', 'on');接下來,就和平常一樣在controller裡設定邏輯:
messages_controller.php
<?php
class PhonesController extends AppController
{
function doWhosOnline()
{
// 這個action就是檢查誰在電話中的地方...
// 如果我要讓這個action可以透過Cake的XML webservice route呼叫,
// 就必需加入一個view叫/app/views/posts/xml/do_whos_online.thtml。
// 註:預設是使用/app/views/layouts/xml/default.thtml。
// 如使用者下了/phones/doWhosOnline,則得到HTML版的結果。
// 但若使用者下的是/xml/phones/doWhosOnline,則會得到XML版的結果。
}
}
?>第五節
(非必要) 自訂命名規則
Cake的命名規則的確很棒,可以將model叫Box,controller叫BoxesController,然後他們就自動配起對了。
但,對一些非英語系國家可就不是這麼一回事了,命名規則裡有些語法不太合乎需求(像複數,單數,第一個字大寫和底線)。
如果Cake看不懂Foci或Fish,依照自己的需求自訂規則吧。
在/app/config/inflections.php檔案內列出用來調整類別名稱內複數與單數的表示法,
也可以定義那些字壓根不必轉換(像Fish和Deer)。
檔案中有詳細的說明,只要將檔案內的範例註解符號去除就行了。
修改前務必了解一些正規表示法的觀念。
沒有留言:
張貼留言