CakePHP: получить информацию о пользователях в моделях - PullRequest
11 голосов
/ 27 января 2010

Я перемещаю часть своего кода поиска внутри моделей.

Ранее в моем контроллере у меня было

$this->Book->Review->find('first', array(
    'conditions' => array(
        'Review.book_id' => $id,
        'Review.user_id' => $this->Auth->user('id')
    )
));

поэтому в моей модели Review я поместил что-то вроде

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

Есть ли способ получить информацию о текущем вошедшем в систему пользователе из модели?

Ответы [ 9 ]

13 голосов
/ 12 апреля 2011

Создайте новую функцию в «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'];
11 голосов
/ 20 марта 2011

Способ, которым я пользуюсь, таков:

App::import('component', 'CakeSession');        
$thisUserID = CakeSession::read('Auth.User.id');

Кажется, это работает довольно хорошо: -)

6 голосов
/ 28 января 2010

Я думаю, что код в порядке и принадлежит Контроллеру, или, по крайней мере, ему нужно получать идентификаторы от Контроллера, а не пытаться получить их сам. Модель должна иметь дело только с получением данных из хранилища данных и их возвратом. Он не должен интересоваться тем, как обрабатываются данные в остальной части приложения или откуда поступают параметры для его запроса. В противном случае вы попадаете в угол, где ReviewModel может извлекать данные только для зарегистрированных пользователей, что может не всегда соответствовать вашим ожиданиям.

Таким образом, я бы использовал сигнатуру функции следующим образом:

function findByBookAndUserId($book_id, $user_id) {
    …
}

$this->Review->findByBookAndUserId($id, $this->Auth->user('id'));
3 голосов
/ 28 января 2010

Есть отличное решение от Мэтта Карри. Вы сохраняете данные текущего зарегистрированного пользователя в app_controller с помощью обратного вызова beforeFilter и обращаетесь к нему позже с помощью статических вызовов. Описание можно найти здесь: http://www.pseudocoder.com/archives/2008/10/06/accessing-user-sessions-from-models-or-anywhere-in-cakephp-revealed/


РЕДАКТИРОВАТЬ: вышеуказанная ссылка устарела: https://github.com/mcurry/cakephp_static_user

1 голос
/ 13 июня 2015

Для CakePHP 3.x доступен этот простой компонент: http://cakemanager.org/docs/utils/1.0/components/globalauth/. Прямой доступ к сеансу невозможен из-за разных ключей SessionKeys.

С GlobalAuthComponent вы можете получить доступ к своим данным пользователя везде: Configure::read('GlobalAuth');.

Greetz

Bob

1 голос
/ 26 июня 2014

Я думаю, что это не очень хорошая идея, чтобы получить значение от сессии. Лучшее решение для получения идентификатора зарегистрированного пользователя внутри любой модели - попробуйте это:

AuthComponent::user('id');

Это будет работать почти везде. Вид, модель и контроллер

1 голос
/ 28 января 2010

Самый грязный способ - просто получить доступ к пользовательской информации в сеансе. Наименьшее количество накладных расходов, связанных с этим.

"Правильный" способ, вероятно, заключался бы в том, чтобы создать экземпляр объекта AuthComponent, чтобы он выполнял всю работу, необходимую для полной работы. Очень похоже на звезду смерти, AuthComponent не очень хорошо работает, когда не полностью настроен.

Чтобы получить новый объект переменного тока, в модели:

App::import( 'Component', 'Auth' );
$this->Auth = new AuthComponent();

Теперь вы можете использовать $ this-> Auth в модели так же, как в контроллере.

0 голосов
/ 25 мая 2015

Ни одно из этих решений не работает в CakePHP версии 3. Кто-нибудь знает способ сделать это? Прямо сейчас я полностью обхожу фреймворк, получая доступ к переменной $ _SESSION непосредственно из моей модели.

0 голосов
/ 09 ноября 2012

Я использую торт 2.2, и оба прекрасно работают:

$this->Session->read('Auth.User');
//or
$this->Auth->user();

Вы также можете получить поле зарегистрированного пользователя:

$this->Session->read('Auth.User.email');
//or
$this->Auth->user()['email'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...