Маршруты
Во-первых, поскольку вы упоминаете несколько контроллеров, возможно, стоит подумать о создании маршрутов, чтобы 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
}
Этот подход может не сработать для вашего приложения, но перед тем, как приступить к решению, стоит подумать о проблеме в ее простейшем состоянии.это так, что вы можете держать на любой ненужной сложности.
Сеанс
Я бы соблазнился использовать сеанс пользователя в качестве способа сохранения, какие шаги были выполнены какне рекомендуется доверять тому, что вы получаете от клиента.(Клиент отправляет свой идентификатор сеанса с каждым запросом, но хранилище сеанса находится на стороне сервера).Как именно вы хотите это сделать, будет зависеть от вашей реализации:
$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]);
}
}
Наконец, есть некоторые компоненты мастера различного качества, которые пытаются выполнить вышеперечисленное для вас, но я не могу гарантировать, что они работают (особенно в несколькихконтролеры) или что они помогут вам выполнить работу быстрее.:)