CakePHP: получить информацию о пользователе в моделях
Я перемещаю часть кода поиска внутри моделей.
Раньше в моем контроллере у меня был
$this->Book->Review->find('first', array(
'conditions' => array(
'Review.book_id' => $id,
'Review.user_id' => $this->Auth->user('id')
)
));
поэтому в моей модели обзора я помещаю что-то вроде
function own($id) {
$this->contain();
$review = $this->find('first', array(
'conditions' => array(
'Review.book_id' => $id,
'Review.user_id' => AuthComponent::user('id')
)
));
return $review;
}
Итак, я вызываю AuthComponent статически из Модели. Я знаю, что могу сделать это для метода AuthComponent:: password(), который полезен для проверки. Но я получаю ошибки, используя метод AuthComponent:: user(), в частности
Неустранимая ошибка: вызов функции-члена check() на не-объекте в /var/www/MathOnline/cake/libs/controller/components/auth.php на линии 663
Есть ли способ получить информацию о текущем зарегистрированном пользователе из модели?
Ответы
Ответ 1
Есть хорошее решение Мэтта Карри. Вы сохраняете данные текущего зарегистрированного пользователя в app_controller, используя обратный вызов beforeFilter, и получите доступ к нему позже, используя статические вызовы. Описание можно найти здесь:
http://www.pseudocoder.com/archives/2008/10/06/accessing-user-sessions-from-models-or-anywhere-in-cakephp-revealed/
EDIT: вышеуказанная ссылка устарела: https://github.com/mcurry/cakephp_static_user
Ответ 2
Создайте новую функцию в "app_model.php" ( "AppModel.php" в CakePHP 2.x), поэтому она будет доступна на всех моделях нашего приложения:
function getCurrentUser() {
// for CakePHP 1.x:
App::import('Component','Session');
$Session = new SessionComponent();
// for CakePHP 2.x:
App::uses('CakeSession', 'Model/Datasource');
$Session = new CakeSession();
$user = $Session->read('Auth.User');
return $user;
}
в модели:
$user = $this->getCurrentUser();
$user_id = $user['id'];
$username = $user['username'];
Ответ 3
Способ, которым я пользуюсь, заключается в следующем:
App::import('component', 'CakeSession');
$thisUserID = CakeSession::read('Auth.User.id');
Кажется, что это работает очень хорошо: -)
Ответ 4
Я думаю, что код в порядке, и он принадлежит контроллеру, или, по крайней мере, ему нужно получить идентификаторы из контроллера и не пытаться получить их самостоятельно. Модель должна учитывать только выборку данных из хранилища данных и их возврат. Он не должен касаться того, как данные обрабатываются в остальной части приложения или откуда поступают параметры к его запросу. В противном случае вы рисуете себя в углу, где ReviewModel может извлекать данные только для зарегистрированных пользователей, что может не всегда быть тем, что вы хотите.
Таким образом, я бы использовал такую подпись функции, как это:
function findByBookAndUserId($book_id, $user_id) {
…
}
$this->Review->findByBookAndUserId($id, $this->Auth->user('id'));
Ответ 5
Самый простой способ - просто получить доступ к информации о пользователе в сеансе. Наименьшее количество накладных расходов связано с этим.
"Правильный" способ, вероятно, состоит в том, чтобы создать экземпляр объекта AuthComponent, чтобы он делал все необходимое для полноценной работы. Подобно смертельной звезде, AuthComponent не очень хорошо работает, когда не полностью настроен.
Чтобы получить новый объект AC, в модели:
App::import( 'Component', 'Auth' );
$this->Auth = new AuthComponent();
Теперь вы можете использовать $this- > Auth в модели, как и в контроллере.
Ответ 6
Я думаю, что это не очень хорошая идея, чтобы получить ценность из Сессии. Лучшее решение для получения зарегистрированного идентификатора пользователя внутри любой модели просто попробуйте следующее:
AuthComponent::user('id');
Это будет работать почти везде. Просмотр, модель и контроллер
Ответ 7
Для CakePHP 3.x этот простой компонент доступен: http://cakemanager.org/docs/utils/1.0/components/globalauth/. Прямой доступ к сеансу невозможен из-за разных SessionKeys.
В GlobalAuthComponent вы можете получить доступ к своим пользовательским данным везде: Configure::read('GlobalAuth');
.
Greetz
Боб
Ответ 8
Я использую торты 2.2, и они оба отлично работают:
$this->Session->read('Auth.User');
//or
$this->Auth->user();
Вы также можете получить поле текущего пользователя:
$this->Session->read('Auth.User.email');
//or
$this->Auth->user()['email'];
Ответ 9
Ни одно из этих решений не работает в CakePHP версии 3. Кто-нибудь знает, как это сделать? Прямо сейчас я полностью перешагиваю инфраструктуру, обращаясь к переменной $_SESSION непосредственно из моей модели.