我正在模型中移动我的一些代码。
以前在我的控制器中我有
$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行
有没有办法从模型中获取有关当前登录用户的信息?
答案 0 :(得分:13)
在“app_model.php”(CakePHP 2.x中的“AppModel.php”)中创建一个新函数,因此它将在我们的应用程序中的所有模型中可用:
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'];
答案 1 :(得分:11)
我使用的方式是:
App::import('component', 'CakeSession');
$thisUserID = CakeSession::read('Auth.User.id');
它看起来效果很好: - )
答案 2 :(得分:6)
我认为代码很好并且属于Controller,或者至少它需要从Controller接收ID而不是尝试自己获取它们。模型应该只关注从数据存储中获取数据并返回它。它不应该关心如何在应用程序的其余部分或其请求的参数来自何处来处理数据。否则,您将自己画成一个角落,其中ReviewModel只能检索登录用户的数据,这可能并不总是您想要的。
因此,我会使用这样的函数签名:
function findByBookAndUserId($book_id, $user_id) {
…
}
$this->Review->findByBookAndUserId($id, $this->Auth->user('id'));
答案 3 :(得分:3)
Matt Curry有一个很好的解决方案。您使用beforeFilter回调将当前登录用户的数据存储在app_controller中,稍后使用静态调用访问它。可以在这里找到描述: <删除> http://www.pseudocoder.com/archives/2008/10/06/accessing-user-sessions-from-models-or-anywhere-in-cakephp-revealed/ 德尔>
答案 4 :(得分:1)
最简单的方法是只访问Session中的用户信息。与此相关的最少开销。
“正确”的方式可能是实例化AuthComponent对象,以便它完成所有需要完全运行的东西。就像死星一样,AuthComponent在没有完全设置的情况下也不能很好地工作。
在模型中获取新的AC对象:
App::import( 'Component', 'Auth' );
$this->Auth = new AuthComponent();
现在你可以在模型中使用$ this-&gt; Auth,就像你在控制器中一样。
答案 5 :(得分:1)
我认为从Session获取价值并不是一个好主意。在任何模型中获取已记录用户ID的更好解决方案只需尝试:
AuthComponent::user('id');
这几乎适用于所有地方。视图,模型和控制器
答案 6 :(得分:1)
对于CakePHP 3.x,这个简单的组件可用:http://cakemanager.org/docs/utils/1.0/components/globalauth/。由于SessionKeys不同,无法直接访问Session。
使用GlobalAuthComponent,您可以使用以下网址访问您的用户数据:Configure::read('GlobalAuth');
。
格尔茨
鲍勃
答案 7 :(得分:0)
我使用蛋糕2.2,这些都很棒:
$this->Session->read('Auth.User');
//or
$this->Auth->user();
您还可以获取当前登录用户的字段:
$this->Session->read('Auth.User.email');
//or
$this->Auth->user()['email'];
答案 8 :(得分:0)
这些解决方案都不适用于CakePHP版本3.任何人都知道这样做的方法吗?现在,我通过直接从我的模型访问$ _SESSION变量来完全绕过框架。