2011-12-14 8 views
0

私が取り組んでいるウェブサイトの1つにユーザー登録するのは、複数のステップからなるプロセスで、同じコントローラから、さらには異なるコントローラからでもさまざまな操作が必要です。Cakephp - アクション間の一方向のフローを保証する最良の方法は何ですか?

ユーザーがプロセスの開始時に確実に起動し、手順2にアクセスする前にユーザーが手順1を完了していることを確認する最も良い方法は何ですか。新しいユーザーはこれらの操作のURLを知ることはできませんが、まだ理解しています。

セッション変数を使用する必要がありますか?あるいは、各アクションの始めにリファラーをチェックすることもできますか?まず

答えて

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. 更新ステップ数とをリダイレクトしますユーザーが先にスキップしようとすると、前の手順にリダイレクトされます。

    とても各アクションは、ロジックを再利用することができます必要な手順のリストを格納するのに役立つだろう:

    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

    +0

    はい。セッションはサーバーに格納されるため、クライアントはこれに書き込むことができず、必要な手順を進めることができません。最悪の場合、セッションIDを保存しているCookieが削除されます。つまり、すべての処理が失われます。 – deizel

    +0

    セッションでこれを実装しようとしています...どこで関数enforceRegistrationFlow()を書くべきですか? appControllerでは??ありがとう – AlexBrand

    関連する問題