2011-12-14 13 views
0

我在其中一個網站上進行用戶註冊是一個多步驟過程,需要來自同一控制器的各種操作,甚至需要不同的控制器。Cakephp - 確保操作之間單向流動的最佳方法是什麼?

確保用戶在流程開始時啓動並確保用戶在訪問步驟2之前完成了第1步的最佳方法是什麼?我瞭解新用戶不會知道這些操作的網址,但仍然是。

我應該使用會話變量嗎?或者在每個動作開始時檢查引用者?

感謝

回答

1

路線

首先,既然你提到的多個控制器,它可能是值得考慮創建路由,以便爲註冊過程看用戶友好的URL和良好的流動性:

Router::connect('/register', array('controller' => 'users', 'action' => 'register')); 
Router::connect('/register/step1', array('controller' => 'profile', 'action' => 'add')); 
Router::connect('/register/step2', array('controller' => 'users', 'action' => 'verify')); 

一旦你確定了上述內容,它應該使流邏輯更清晰一些。

單控制器動作

一個最直接的辦法,以嚮導是一個簡單的$step參數傳遞到您的控制器動作:

public function register($step) { 
    if ($step == 'profile') { 
     // do stuff 
     if ($hasProfile) { 
      $this->redirect(array('verify')); 
     } 
    } 
    if ($step == 'verify') { 
     if (!$hasProfile) { 
      return $this->redirect(array('profile')); 
     } 
     // do stuff 
    } 
    if ($step == 'done') { 
     if (!$hasProfile) { 
      return $this->redirect(array('profile')); 
     } 
     if (!$hasVerified) { 
      return $this->redirect(array('verify')); 
     } 
     // do stuff 
    } 
    $this->redirect('profile'); // default step 
} 

這種方法可能不適合你的應用程序中工作但在處理它之前,最值得考慮的問題是它處於最簡單的狀態,這樣可以減少任何不必要的複雜性。

會議

我會嘗試使用用戶的會話作爲,因爲它是不建議信任你從客戶端接收哪些已經完成的步驟持續存在的一種方式。 (客戶端提交他們的會話ID與每個請求,但會話存儲是服務器端)。究竟要如何做到這一點,將取決於具體的實現:

$this->Session->write('Auth.registration_step', '2'); 

一種方法可能是存儲步數和每一個行動將

  1. 更新步數和重定向完成
  2. 執行步驟編號,如果用戶試圖跳過,則重定向回到上一步。

這將有助於存儲的參與使每個動作可重複使用的邏輯步驟列表:

public function enforceRegistrationFlow() { 
    $flow = array(
     1 => array('controller' => 'users', 'action' => 'register'), 
     2 => array('controller' => 'profile', 'action' => 'add'), 
     3 => array('controller' => 'users', 'action' => 'verify') 
    ); 
    $step = $this->Session->read('Auth.registration_step'); 
    if ($flow[$step] !== /* current controller/action */) { 
     $this->redirect($flow[$step]); 
    } 
} 

最後,還有一些wizard components圍繞着質量參差不齊的嘗試做上述爲你,但我不能保證它們能夠工作(特別是跨多個控制器),或者他們能夠幫助您更快地完成工作。 :)

+0

所以你說,會話變量將是一個安全的方式來做到這一點?謝謝 – AlexBrand 2011-12-15 05:14:57

相關問題