如何使用:$this->;认证->;模型中的用户(';id';)?CakePHP3.0

如何使用:$this->;认证->;模型中的用户(';id';)?CakePHP3.0,cakephp,authentication,model,cakephp-3.0,Cakephp,Authentication,Model,Cakephp 3.0,我一直在研究瘦控制器胖模型。之前,我在我的控制器中使用过: $this ->find('all') ->contain(['Declarator']) ->where(['user_id' => $this->Auth->user('id')]) ->order(['Declarations.created' => 'DESC']); 但是,$this->Auth->user('id')在模型中不起作用 还有什么其

我一直在研究瘦控制器胖模型。之前,我在我的控制器中使用过:

$this
    ->find('all')
    ->contain(['Declarator'])
    ->where(['user_id' => $this->Auth->user('id')])
    ->order(['Declarations.created' => 'DESC']);
但是,
$this->Auth->user('id')
在模型中不起作用

还有什么其他方法可以从模型中经过身份验证的用户那里获取id

还有什么其他方法可以从模型中经过身份验证的用户那里获取id

只需将其传递给模型方法:

public function someModelMethod($userId, array $postData) {
    // Do something here, move your code from the controller here
    return $something;
}

public function someControllerAction() {
    $this->set('data', $this->Model->someModelMethod(
        $this->Auth->user('id'),
        $this->request->data
    );
}

Cake没有一个层可以容纳业务逻辑,所以大部分时间它都放在模型层中。Cake也不使用依赖项注入,所以像auth对象那样传递整个实例有时很麻烦。另外,我认为auth对象本身不应该与模型层相交。我们希望避免紧密耦合。为了简化这一过程(也用于测试),只需将所需的值传递给方法就容易多了。

在CakePHP 2.x中,它的操作如下所述。我很确定,即使文档中没有,也可以用同样的方法来完成

//在任何地方使用
AuthComponent::用户('id')
//从控制器内部
$this->Auth->user('id');
来源:


3.x版的文档:

也许这不是个好主意,但在cake的模型中,您可以使用
$\u会话['Auth']['User']['id']

或者只
使用Cake\Routing\Router
表的顶部
类,然后,您可以通过以下方式访问会话:

Router::getRequest()->getSession()->read('Auth.User.id');

谢谢你的信息。这就是我所需要的。从使用它的每个控制器传递登录的用户id可能非常麻烦。我知道关注点的分离很重要,但是登录用户id是模型层在我正在处理的代码库所支持的业务用例中如何工作的一个组成部分。似乎应该有一种更好的方法来处理关注点分离,而不需要这么多开销。@space97我们有一个相当大的应用程序,没有“开销”,只是人们懒散地牺牲体系结构,通过这种维护和TCO在方便的祭坛上。。。如果您想走错这条路,那么即使这样,也有更好的解决方案:让模型实现一个像“UserSetterInterface”这样的接口,该接口需要setUserId()方法。在AppController::initialize()中,通过instanceof检查该接口的每个模型,如果这是真的,则从调用此方法的组件传递id。@burzum我不主张破坏该体系结构。实际上,我正在努力将$u会话的使用从以前开发人员使用的表中拉出来,以使应用程序无状态,并出于架构方面的原因,我正在试图找到正确的方法来实现这一点。谢谢你的建议@space97我希望您没有直接使用$\u会话。如果您正在使用某种抽象,那么用户是否通过有状态或无状态机制进行了身份验证并不重要,因为此时,id或身份数据应该已经解析,无论是通过会话还是令牌。看看这个,它是独立于框架的,但很容易集成到所有内容中。:)如果你投反对票,请发表评论。我知道这不应该在模型中进行,但我的帖子回答了这个问题。组件用于控制器而不是模型。这不适用于无状态用户身份验证