Получение связанных моделей с $ this-> Auth в Cakephp - PullRequest
11 голосов
/ 20 марта 2012

Я использую встроенный компонент аутентификации CakePHP 2.0. У меня есть следующие таблицы:

  • Пользователи
  • Группы
  • Профили

Мои модельные отношения таковы:

User belongsTo Group
User hasMany Profiles

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

Есть ли способ сделать это с компонентом Auth?

Ответы [ 3 ]

6 голосов
/ 20 марта 2012

Нет способа сделать это с 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 сохраните переменную для контроллеров, чтобы получить:

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 теперь принимает ключ «содержать» для хранения дополнительной информации в сеансе.

1 голос
/ 20 марта 2012

Два способа:

1) Расширить класс FormAuthenticate (см. / Controller / Component / Auth) или все, что вы используете для входа в систему и переопределить метод _findUser (), и указать компоненту Auth использовать этот класс авторизации,Смотрите на этой странице, как сделать все это http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

2) Просто внедрите в модель метод, который будет извлекать все необходимые данные, вызывать его в методе входа в систему вашего контроллера и записывать данные всессия.IMO удобно иметь такой метод, потому что иногда вам все равно нужно обновить данные сеанса.

Из-за вашего комментария к другому ответу:

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

1 голос
/ 20 марта 2012

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

$group_data = $this->Group->findById($this->Auth->user('group_id'));

Или

$profile_data = $this->Profile->findByUserId($this->Auth->user('id'));

Но я не думаю, что выможет получить его непосредственно из компонента Auth, так как он не кэширует связанные данные модели из коробки.

...