Получение связанных моделей с $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 не может читать ваш разум и базу данных без кода. Независимо от того, какой из предложенных способов вы собираетесь использовать, вам придется писать код.