設定

第一節

資料庫設定

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支援以下幾種資料庫:

  1. mysql

  2. postgres

  3. sqlite

  4. pear-drivername (例如pear-mysql)

  5. adodb-drivername

$default中的'connect'設定可以指定資料庫是否持續保持連線。 database.php.default檔中的註解有詳細記載如何為你的資料庫選用一種連線方式。

資料庫內的資料表名稱也得遵循以下的命名規則:

  1. Cake使用的資料表名稱必須使用英文字的複數型,像"users","authors",或"articles"。 注意,相對應的Model名稱是單數型。

  2. 資料表主欄欄位名稱必須命名為'id'。

  3. 如果要建立關聯資料表,外部鍵的命名為:'article_id'。 關聯的資料表名稱的單數型,後面接上'_id'。

  4. 如果有欄位名叫'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檔案。 說明如下:

  1. high:session 在使用者持續10分鐘沒動作後過期,並在每一個request重新產生session id。

  2. medium:session 在使用者持續20分鐘沒動作後過期

  3. low:session 在使用者持續30分鐘沒動作後過期

CAKE_SESSION_SAVE:指定session資料的存放方式。

  1. cake:存放於Cake安裝目錄下的tmp/目錄內。

  2. php:存放的位置由php.ini決定。

  3. 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')
);
?>

說明:

  1. URL是一個用正規表示式寫成,代表想要轉換的URL的字串。

  2. controllername是要呼叫的controller名稱。

  3. actionname是在沒有輸入action的情況下使用的action名稱。

  4. 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轉向:

  1. rss

  2. xml

  3. rest

  4. soap

  5. 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)。

檔案中有詳細的說明,只要將檔案內的範例註解符號去除就行了。 修改前務必了解一些正規表示法的觀念。


附錄:讀者筆記

小錯字 

貝貝說:資料表命名規則段中: ...(略)名稱也得"尊循"以下...(略) "遵循" 辛苦囉~