Использование сессий для перенаправления работы - PullRequest
0 голосов
/ 17 января 2011

Я застрял со структурой «если».Идея состоит в том, что когда пользователь входит в систему, в зависимости от его роли, он будет перенаправлен на другой URL-адрес, и для роли (учащегося) он становится более сложным, потому что, если он заполнил форму, он будетбыть перенаправлены в другое место.Итак, функция входа в систему для подведения итогов такова:

function login() {
    if ($this->Session->read('Auth.User')) {
         if($this->Session->read('Auth.User.group_id') == '1')
             $this->redirect(array('controller'=>'specializations', 'action' => 'index'));
         else if ($this->Session->read('Auth.User.group_id') == '2')
             $this->redirect(array('controller'=>'specializations', 'action' => 'index'));
         else if ($this->Session->read('Auth.User.group_id') == '3')
             if ($this->Session->read('Auth.Student.form_activated') == '1')
                $this->redirect(array('controller'=>'students', 'action' => 'view',$this->Session->read('Auth.Student.id')));
             else
                $this->redirect(array('controller'=>'students', 'action' => 'add'));
        $this->Session->setFlash('You are logged in!');
        $this->redirect('/', null, false);
    }

Я проверяю, заполнил ли студент форму с атрибутом form_activation или нет.Я не знаю, хороший ли это подход, но он единственный, который я себе представляю.

Так что теперь, каждый раз, когда я вхожу в систему в качестве студента, он перенаправляет на страницу «Добавить», и думаю, что я нашелв DebugKit ...

  1. Auth

  2. перенаправление / студенты / просмотр / 1

  3. Пользователь

o id3

o emailalf@gmail.com

o group_id3

Он должен быть перенаправлен на страницу просмотра ... но это не такt ...

Кажется, что он не читает $ this-> Session-> read ('Auth.Student.id'), я думаю, что вы можете использовать это только с Auth.User, кто-нибудь знает, какэто может быть читать параметры студента с помощью SessionHelper?Нужно ли использовать запрос?

Любые подсказки ??

Заранее спасибо,

Альф.

Ответы [ 2 ]

1 голос
/ 17 января 2011

Я проверяю, заполнил ли студент форму с атрибутом 'form_activation'.Я не знаю, хороший ли это подход, но я представляю его единственно.

Во-первых, сеанс не является постоянным хранилищем данных.Это разрушается при выходе из системы.Любые изменения в данных сеанса после входа в систему будут недоступны при следующем входе в систему, если вы не сохраните и не восстановите их каким-либо образом.

Кажется, что он не читает $ this-> Session-> read ('Auth.Student.id '), я думаю, что вы можете использовать это только с Auth.User, кто-нибудь знает, как это может быть для чтения параметров ученика с помощью SessionHelper?

Вы пытаетесь получить доступAuth.User и Auth.Student во время действия входа в систему вашего приложения, которое предполагает (учитывая предоставленный код), что вы можете что-то неправильно понять.

При входе в систему AuthComponent копирует пользователя из базы данных (обычно этозапись в таблице users) в сеанс (обычно Auth.User).

(Кроме того: вы можете немного изменить это поведение по умолчанию, установив $this->Auth->userModel = 'Student' в своем приложении. Это заставит AuthComponent читать записииз модели Student - по умолчанию таблица students - при входе в систему и поместите их под Auth.Student в сеансе.)

Таким образом, во время вашего login()Действие выше, AuthComponent будет устанавливать только Auth.User (или Auth.Student, если вы использовали модель Student), а не оба!

Нужно ли использовать запрос?

Не то чтобы вы могли «запрашивать» сеансы как таковые, но это может быть решением.

MySQL, вероятно, является постоянным хранилищем данных, которое вы используете для своего приложения.Вам нужно хранить эту информацию (т.е., если студент заполнил форму) в MySQL, если она должна пережить сеанс уничтожает / тайм-ауты (т.е. выходы из системы).

Если вы можете просто сохранить эту информацию в пользовательскомзапись (в таблице users по умолчанию), затем AuthComponent, очевидно, скопирует информацию в сеанс.

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

По сути, все, что превышает способность AuthComponent копировать запись базы данных пользователядля сеанса (и уничтожения сеанса при выходе из системы) будет включать в себя написание дополнительного кода для хранения / извлечения / сохранения / восстановления необходимой информации.


Каждый выполненный запрос попадает на сервер базы данных.Если вам часто требуется некоторая информация (например, вы можете показать название класса учащегося на всех страницах), то нет смысла постоянно обращаться к базе данных, запрашивая одну и ту же информацию, поэтому использование сеанса пользователя в качестве хранилища может предотвратить это.need.

Поскольку Model::find() возвращает массивы, а SessionComponent::write() принимает массивы, перемещение данных между базой данных и сеансом (или обратно) довольно просто.

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

class UsersController extends AppController {
    public function edit($id = null) {
        // ..
        if ($this->User->save($this->data)) {
            $user = $this->User->read(null, $this->User->id); // get latest record
            $this->Session->write('Auth.User', $user['User']); // overwrite session
            // ..
        }
    }
}

Другим примером может быть приложение, которое использует адрес пользователя для доставки карт или локализованноерезультаты на большинстве страниц.Вы можете найти их адрес, который, как мы знаем, нам понадобится, и сохранить его в сеансе (например, когда пользователь входит в систему).

class UsersController extends AppController {
    public function login() {
        if ($this->Auth->login()) {
            $address = $this->User->Address->find('first', array(
                'conditions' => array(
                    'Address.user_id' => $this->Auth->user('id'),
                    'Address.default' => true,
                )
            ));
            if ($address) {
                $this->Session->write('Address', $address['Address']);
            }
        }
    }
}

Теперь мы можем делать такие вещи, как $this->Session->read('Address.latitude'), чтобычасто извлекайте эту информацию без дополнительных затрат на общение с MySQL.

0 голосов
/ 17 января 2011

Получите идентификатор пользователя, выполнив:

$this->Auth->user('id');

См. http://book.cakephp.org/view/1264/user

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