ルート
おかげで、あなたは複数のコントローラを言及するので、それは登録プロセスを見てユーザーフレンドリーの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');
一つの方法は、ステップ数を格納するかもしれないと、各アクションが
強制終了時に
- 更新ステップ数とをリダイレクトしますユーザーが先にスキップしようとすると、前の手順にリダイレクトされます。
とても各アクションは、ロジックを再利用することができます必要な手順のリストを格納するのに役立つだろう:
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あなたのために上記のことをしようがありますしかし、私はそれらが動作することは保証できません(特に、複数のコントローラ間で)、またはあなたが仕事をより早く完了させるのに役立つでしょう。 :)
セッション変数は安全な方法でしょうか?ありがとう – AlexBrand
はい。セッションはサーバーに格納されるため、クライアントはこれに書き込むことができず、必要な手順を進めることができません。最悪の場合、セッションIDを保存しているCookieが削除されます。つまり、すべての処理が失われます。 – deizel
セッションでこれを実装しようとしています...どこで関数enforceRegistrationFlow()を書くべきですか? appControllerでは??ありがとう – AlexBrand