Cakephp - Каков наилучший способ обеспечить однонаправленный поток между действиями? - PullRequest
0 голосов
/ 14 декабря 2011

Регистрация пользователя на одном из веб-сайтов, над которыми я работаю, представляет собой многоэтапный процесс, требующий различных действий от одного контроллера и даже от разных контроллеров.

Каков наилучший способ обеспечить запуск пользователя в начале процесса и убедиться, что пользователь завершил шаг 1, прежде чем он сможет получить доступ к шагу 2? Я понимаю, что новые пользователи не будут знать URL этих действий, но все же.

Должен ли я использовать переменные сеанса? Или, может быть, проверка реферера в начале каждого действия?

Спасибо

1 Ответ

1 голос
/ 14 декабря 2011

Маршруты

Во-первых, поскольку вы упоминаете несколько контроллеров, возможно, стоит подумать о создании маршрутов, чтобы 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');

Одним из подходов может быть сохранение номера шага, и каждое действие будет

  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]);
    }
}

Наконец, есть некоторые компоненты мастера различного качества, которые пытаются выполнить вышеперечисленное для вас, но я не могу гарантировать, что они работают (особенно в несколькихконтролеры) или что они помогут вам выполнить работу быстрее.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...