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 непосредственно из моей модели.