Получение связанных моделей с $this-> Auth в CakePHP
Я использую интегрированный компонент Auth CakePHP 2.0.
У меня есть следующие таблицы:
- Пользователи
- Группы
- Профили
Мои модельные отношения заключаются в следующем:
User belongsTo Group
User hasMany Profiles
Во время входа на сайт я заметил, что сеанс Auth содержит только информацию в таблице пользователя, но мне также нужна информация о группах и профилях для зарегистрированного пользователя.
Есть ли способ сделать это с помощью компонента Auth?
Ответы
Ответ 1
Нет способа сделать это с помощью AuthComponent
из-за того, как он обрабатывает ключи сеанса. Однако вы можете просто сохранить его на сеансе самостоятельно.
Единственный способ сделать это - добавить к сеансу, когда пользователь входит в систему:
function login() {
if ($this->Auth->login($this->data)) {
$this->User->id = $this->Auth->user('id');
$this->User->contain(array('Profile', 'Group'));
$this->Session->write('User', $this->User->read());
}
}
Затем в вашем beforeFilter()
в вашем AppController
сохраните var для контроллеров, чтобы добраться до:
function beforeFilter() {
$this->activeUser = $this->Session->read('User');
}
// and allow the views to have access to user data
function beforeRender() {
$this->set('activeUser', $this->activeUser);
}
Обновление. Начиная с версии CakePHP 2.2 (здесь), AuthComponent теперь принимает ключ "содержать" для сохраняя дополнительную информацию в сеансе.
Ответ 2
Насколько мне известно, компонент Auth только кэширует данные из вашей модели пользователей. Вы можете использовать эту информацию для извлечения желаемых данных из других моделей, например, используя это в своем контроллере:
$group_data = $this->Group->findById($this->Auth->user('group_id'));
или
$profile_data = $this->Profile->findByUserId($this->Auth->user('id'));
Но я не думаю, что вы можете получить его непосредственно из компонента Auth, так как он не кэширует связанные данные модели из коробки.
Ответ 3
Два способа:
1) Расширьте класс FormAuthenticate (см./Controller/Component/Auth) или все, что вы используете для входа и переопределите метод _findUser() и сообщите компоненту Auth, чтобы использовать этот класс авторизации. См. Эту страницу, как сделать все это http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html
2) Просто реализуйте метод в модели, который будет извлекать все нужные данные и вызывать его в методе входа вашего контроллера и записывать данные в сеанс. ИМО удобно использовать такой метод, потому что иногда вам нужно обновлять данные сеанса.
Из-за вашего комментария к другому ответу:
Вам нужно будет написать метод и некоторый код в модели, которая вернет вам данные. CakePHP не может читать ваш разум и базу данных без кода. Независимо от того, какой из предложенных способов вы собираетесь использовать, вам придется писать код.