CakePHP: получите информацию о пользователе в моделях

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

Ранее в моем контроллере я имел

$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:: пароль (), который полезен для проверки. Но я получаю ошибки с помощью метода AuthComponent:: пользователь (), в особенности

Фатальная ошибка: Призовите к проверке функции членства () на необъекте в/var/www/MathOnline/cake/libs/controller/components/auth.php на строке 663

Существует ли способ получить информацию о в настоящее время зарегистрированном пользователе из модели?

12
задан Andrea 27 January 2010 в 20:24
поделиться

3 ответа

Существует хорошее решение Matt Curry. Вы храняте данные текущего зарегистрированного пользователя в App_Controller, используя обратный вызов Forefilter и доступа к нему позже, используя статические вызовы. Описание можно найти здесь: http://www.pseudoCoder.com/Archives/2008/10/06/accessing-user-sessions-from-models-sess-andeway-in-cakephp-revealed/


Редактировать: приведенная выше ссылка Устаревший: https://github.com/mcurry/cakephp_static_usser

3
ответ дан 2 December 2019 в 04:08
поделиться

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

Как таковой, я бы использовал функцию подписи, как это:

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

$this->Review->findByBookAndUserId($id, $this->Auth->user('id'));
6
ответ дан 2 December 2019 в 04:08
поделиться

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

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

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

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

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

1
ответ дан 2 December 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: