Mennauu
Mennauu

Reputation: 157

How to use: $this->Auth->user('id') in a model? Cakephp 3.0

I've been working on the skinny controller fat model way. Before, I used this in my controller:

$this
    ->find('all')
    ->contain(['Declarator'])
    ->where(['user_id' => $this->Auth->user('id')])
    ->order(['Declarations.created' => 'DESC']);

However, $this->Auth->user('id'), doesn't work in a model.

What other way is there to get the id from the authenticated user in a model?

Upvotes: 6

Views: 6132

Answers (3)

Dariusz Majchrzak
Dariusz Majchrzak

Reputation: 1237

Mayby it's not a good idea, but in cake's model You can get users id using $_SESSION['Auth']['User']['id']

Or just use Cake\Routing\Router; at the top of your Table class and then, You can get access to session using:

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

Upvotes: 2

Tomas Gonzalez
Tomas Gonzalez

Reputation: 1175

In CakePHP 2.x it's done as stated below. I'm quite sure that, even though it's not in the docs, it may be done the same way.

// Use anywhere
AuthComponent::user('id')

// From inside a controller
$this->Auth->user('id');

Source: http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#accessing-the-logged-in-user

Docs for version 3.x: http://book.cakephp.org/3.0/en/controllers/components/authentication.html#accessing-the-logged-in-user

Upvotes: -4

floriank
floriank

Reputation: 25698

What other way is there to get the id from the authenticated user in a model?

Simply pass it to a model method:

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 doesn't have a layer that would take the business logic so most of the time it's put in the model layer. Cake also doesn't use dependency injection so passing whole instances around like the auth object is sometimes cumbersome. Also I don't think the auth object itself should intersect with the model layer. We want to avoid tight coupling. To simplify this (also for testing) it is much easier to just pass the required values to the methods.

Upvotes: 6

Related Questions