phalcon framework的 session 與 persistent 差異

簡單地說就是 persistent 物件不能跨 class 存取,而 session 物件可以。

persistent 物件最適合使用的情況是儲存搜尋表單的資料,這樣在換頁的時候就不用操煩太多。例如向下面用 phalcon devtool 生出來的 searchAction 程式碼片段。

if ($this->request->isPost()) {
            $query = Criteria::fromInput($this->di, 'Testmodel', $_POST);
            $this->persistent->parameters = $query->getParams();
        } else {
            $query = Criteria::fromInput($this->di, 'Testmodel', $_GET);
            $this->persistent->parameters = $query->getParams();
        }

實際上 persistent 是用 session bag 物件,如果作 var_dump($this->persistent) 可以看到詳細的資料,且可以發現被限定在單一 class 中。

而預設的 session 物件是用 File adapter (Phalcon\Session\Adapter\Files),雖然說官方文件寫存取的方式需要透過 get() & set() 方法,但是實際上直接當成一般參數作存取似乎也沒甚麼問題 (當然養成好習慣比較好)。同樣也可用 isset() 這個 php 內建function 或者用 session 物件的 has() 方法檢查是否存在。

// 這兩個寫法都可以用,但建議乖乖用 set 寫入
$this->session->set("customerid", 1);
$this->session->customerid= 1;
// 這兩個寫法都可以用,但建議乖乖用 get 讀取
echo $this->session->get("customerid");
echo $this->session->customerid;
// 這兩個寫法都可以用
var_dump($this->session->has("customerid"));
var_dump(isset($this->session->customerid));