Session元件(Session Component)

第一節

Cake內Session的儲存參數

Cake內建三種方式存放session資料:放在暫存檔,使用PHP預設機制,或存放在資料庫,預設使用PHP預設機制。 如果想改成使用暫存檔或資料庫,請編輯核心設定檔:/app/config/core.php。 依需要可以把CAKE_SESSION_SAVE變數改成'cake','php'或'database'三者之一。

core.php Session 設定

/**
 * CakePHP includes 3 types of session saves
 * database or file. Set this to your preferred method.
 * If you want to use your own save handler place it in
 * app/config/name.php DO NOT USE file or database as the name.
 * and use just the name portion below.
 *
 * Setting this to 'cake' will save files to /cakedistro/tmp directory
 * Setting it to 'php' will use the php default save path
 * Setting it to 'database' will use the database
 *
 *
 */
define('CAKE_SESSION_SAVE', 'php');

為了要將session資料存在資料庫,必須在資料庫內建立資料表。 資料表的schema放在/app/config/sql/sessions.sql內。

第二節

使用Cake的Session Component

Cake的session component用來與session資料互動。 它包含了對session資料最基本的讀寫動作,還包含錯誤訊息和接受訊息(如"Your data has been saved")等。 在所有的controller裡預設是可以使用Session component的。

  • check
  • string $name

檢查$name是否已經存於session裡。

  • del
  • string $name
  • delete
  • string $name

刪除$name這個session變數。

  • error

傳回Session component內所發生最後一個錯,常用於除錯。

  • flash
  • string $key = 'flash'

傳回session內用setFlash()所設定的最後一個訊息。 如果有指定$key,則會選用以該鍵存放的訊息中最近的一條。

  • read
  • string $name

傳回名為$name的session變數。

  • renew

建立新的session ID,重新目前使用中的session,刪除舊的,並將刪session的資料傳給新的。

  • setFlash
  • string $flashMessage
  • string $layout = 'default'
  • array $params
  • string $key = 'flash'

將$flashMessage寫到session內(稍後可由flash()取得)。

如果$layout設成'default',訊息會以'<div class="message">'.$flashMessage.'</div>'型式儲存。 如果$layout設成'',訊息會原封不動的被存放。 如果設成其他值,則使用$layout指定的方式存放。

$params是留著未來使用的,目前沒有作用。

$key則可以讓這個訊息以$key鍵存放,呼叫flash()時可依不同鍵取回訊息。

  • valid

如果session有效則傳回true。 最好在read()前使用,以確認讀得到資料。

  • write
  • string $name
  • mixed $value

將名稱為$name,值為$value的session變數存放於目前的session中。


附錄:讀者筆記

重新定義Controller預設(默許)的component可能會產生執行上錯誤 

liaosankai說:######################## #website_controller.php ######################## <? class WebsiteController extends Controller {   var $uses = array();   var $controller = array("session");     function login(){     $this->Session->write("myVar",true); }  } ?> ######################## #myctrl_controller.php ######################## class MyctrlController extends Controller {   var $uses = array();   var $controller = array("session");   function test(){     if($this->Session->check("myVar'")){       echo "myVar exist";     } else {       echo "myVar can't find";     }   } } 現先瀏覽(造訪) /website/login 再先瀏覽(造訪) /myctrl/test 結果輸出 myVar can't find 之後我試著將兩個Controller類別的該行註解 //var $controller = array("session"); 重新先瀏覽(造訪) /website/login 重新再瀏覽(造訪) /myctrl/test 結果輸出 myVar exist 心得: 1.似乎兩個Controller各自使用自己的session component 2.重新定義Controller預設(默許)的component可能會產生執行上錯誤