web-dev-qa-db-fra.com

CakePHP vérifie si l'utilisateur est connecté à l'intérieur d'une vue

J'ai le code suivant:

    <?php

    if (!$this->Auth->user())
    {
        echo $this->element('header');
    }
    else
    {
        echo $this->element('header-bar');
    }

    ?>

dans ma vue, ce qui devrait afficher un en-tête différent pour les utilisateurs connectés, mais renvoie l'erreur suivante:

Notice (8): Undefined property: View::$Auth [APP/views/layouts/page.ctp, line 17]
Fatal error: Call to a member function user() on a non-object in /Users/cameron/Sites/thehive/app/views/layouts/page.ctp on line 17

Comment puis-je réparer ça? Merci

24
Cameron

Remarque: Vérifiez également les informations de meotimdihia réponse ci-dessous . Il y a beaucoup de votes positifs.


Le composant Auth doit être utilisé dans le contrôleur. Vous voudrez vérifier les autorisations dans le contrôleur, puis définir une variable pour la vue, par exemple, $this->set('authUser', $this->Auth->user());. Ensuite, à votre avis, vous pouvez faire:

if (!$authUser)
{
    echo $this->element('header');
}

Si vous souhaitez que cela soit fait automatiquement pour toutes les méthodes du contrôleur, vous pouvez envisager de modifier cake/libs/controller/app_controller.php afin qu'il inclue le composant Auth.

30
webbiedave

Vous n'avez pas besoin de faire $this->set(compact('authUser')); Utilisez-le uniquement dans View: 

if ($this->Session->read('Auth.User')){
// do something 
}
86
meotimdihia

À partir de CakePHP 2.x:

<?php if (AuthComponent::user('id')): ?>
   Logged in as <?= AuthComponent::user('name') ?>
<?php endif; ?>
49
jesal

Pour résumer les réponses sur cette page, évaluez l'un des éléments suivants en fonction de la version de CakePHP que vous utilisez:

Pour la version 1.x

$this->Session->read('Auth.User')

Pour la version 2.x

AuthComponent::user('id')

Fore version 3.x

$this->request->session()->read('Auth.User.id')
16
Mr Griever

Cela fonctionne dans Cakephp 3+ (les modifications modifient: "Auth.User.username" en fonction de vos données de session)

<?php

if (is_null($this->request->session()->read('Auth.User.username'))) {

    echo "....logged out";

} else {

    echo "You are Logged in As " . $this->request->session()->read('Auth.User.username'); 

}

?>
11
Lee Nielsen

cakePHP ne fonctionne pas depuis longtemps avec CakePHP mais, autant que je puisse m'en souvenir, ne prend pas en charge Auth in View. Ce que vous pouvez faire est bien sûr de définir une variable dans le contrôleur .__ pour l’utiliser dans la vue.

<?
   class AppController {
     ....
     function beforeFilter(){
       ....
       $this->set('auth',$this->Auth);
     }
     ....
   }
?>

puis utilisez-le dans la vue comme celle-ci

$auth->....

ou vous pouvez utiliser le AuthHelper écrit par Ritesh Agrawal

http://bakery.cakephp.org/articles/ragrawal/2008/07/29/authhelper

BTW

Je pense que s’il s’agit de tester uniquement si une personne est connectée à la réponse de @ webbiedaveest préférable en termes de style MVC. 

Néanmoins, si vous devez accéder à userdata dans la vue, extrayez simplement le composant userinfo À partir de Auth et définissez-le dans le contrôleur comme je vous l'ai montré et utilisez-le dans la vue

Cordialement

5
Jeremy S.

Essaye ça

class AppController extends Controller{
    $this->user = false;

   public function beforeFilter(){
     $this->user = $this->Auth->user();
   }

   public function beforeRender(){
      $this->set('logged_user',$this->user);
   }
}

Maintenant, vous pouvez vérifier $ utilisateur_logué dans la vue comme 

if($logged_user){
  // users logged in $logged_user have all the details
}else{
  // not logged in
}
2
Spandan Singh

dans Cakephp 3, vous pouvez vérifier la session d'authentification dans la vue comme celle-ci

if($this->request->Session()->read('Auth.User')){
//do when login
}
else{
 //do not login
}
2
YeHtunZ

Vous devez définir les détails de l'utilisateur à partir d'un contrôleur, de préférence AppController, hérité de tous les contrôleurs de votre site. Créez/modifiez votre app_controller.php pour qu'il contienne cette méthode beforeFilter();.

<?php
class AppController extends Controller {

function beforeFilter() {
    $user = $this->Auth->user();
    $this->set(compact('user'));
}

Cela définira une variable appelée $user sur les vues qui seront vides si l'utilisateur n'est pas connecté ou contiennent leurs données si elles le sont.

0
Dunhamzzz

J'ai trouvé quelque chose d'intéressant à mentionner, le gestionnaire de session de CakePHP 3.x est obsolète,

si nous voulons accéder à la session en vue, nous pouvons le faire via le gestionnaire de demandes. nous devons utiliser

<?php
   // For CakePHP 3.x to access all user information
   $this->request->session()->read('Auth.User');

  // For CakePHP 3.x to check session
  if($this->request->session()->read('Auth.User.id')) {

  }
?>
0
Amit Sarwara
//In the views (or layout)
$session->check('Auth.User.id');

//In controller
$this->Auth->User('id'); 
0
Sumith Harshan

Si cela aide quelqu'un dans la session 3.7.8 de Cakephp, il a été privé de getSession afin de mettre à jour le commentaire de Lee Nielsen.

if (is_null($this->request->getSession()->read('Auth.User.username'))) {

echo "....logged out";

} else {

echo "You are Logged in As " . $this->request->getSession()->read('Auth.User.username'); 

}
0
infobuster