Я проверяю, заполнил ли студент форму с атрибутом '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.