Я перемещаю часть своего кода находки в моделях.
Ранее в моем контроллере я имел
$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
Существует ли способ получить информацию о в настоящее время зарегистрированном пользователе из модели?
Существует хорошее решение 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
Я думаю, что код в порядке, так как он имеет и принадлежит контроллеру, или по крайней мере, он должен получать удостоверения личности от контроллера и не пытаться получить их. Модель должна быть обеспокоена только для получения данных из хранилища данных и возвращая его. Он не должен быть обеспокоен тем, как данные обрабатываются в остальной части приложения или где приходят параметры к его запросу. В противном случае вы нарисуете себя в угол, где ReviewModel может получить только данные для зарегистрированных пользователей, которые могут не всегда быть тем, что вы хотите.
Как таковой, я бы использовал функцию подписи, как это:
function findByBookAndUserId($book_id, $user_id) {
…
}
$this->Review->findByBookAndUserId($id, $this->Auth->user('id'));
Самый грязный способ - просто получить доступ к информации о пользователе на сеансе. Наименьшее количество накладных расходов, связанных с этим.
«Правильный» способ, вероятно, будет создать экземпляр объекта AuthComponent, так что он делает все, что он должен быть полностью оперативным. Как и звезды смерти, AuthComponent не работает хорошо, когда не полностью установка.
Чтобы получить новый объект AC, в модели:
App::import( 'Component', 'Auth' );
$this->Auth = new AuthComponent();
Теперь вы можете использовать $ This-> Auth в модели, такой же, как вы бы в контроллере.