Laravel: Auth :: user () -> id essayant d'obtenir une propriété d'un non-objet


88

J'obtiens l'erreur suivante "essayer d'obtenir une propriété d'un non-objet" lorsque je soumets un formulaire pour ajouter un utilisateur, l'erreur est apparemment sur la première ligne: Auth :: user () -> id de ce qui suit :

$id = Auth::user()->id;
$currentuser = User::find($id);
$usergroup = $currentuser->user_group;
$group = Sentry::getGroupProvider()->findById($usergroup);

$generatedPassword = $this->_generatePassword(8,8);
$user = Sentry::register(array('email' => $input['email'], 'password' => $generatedPassword, 'user_group' => $usergroup));

$user->addGroup($group);

Des idées? J'ai cherché pendant un moment et tout ce que je vois dit que cela devrait fonctionner correctement. Mon utilisateur est connecté à l'aide du kit d'authentification Sentry 2.


Y a-t-il une colonne nommée id dans votre table User? Sinon, c'est le problème.
OffTheFitz

Oui, l'id est là @OffTheFitz la table s'appelle users
Josh

Corrigez-moi si je me trompe mais que vous essayez d'enregistrer un utilisateur connecté ?? Si vous utilisez Sentry pour enregistrer un utilisateur, pourquoi appelez-vous Auth::user();? Auth :: user () renvoie l'utilisateur actuellement connecté, donc vous essayez d'enregistrer un utilisateur qui devrait être connecté, cela n'a pas de sens
Altrim

@Josh Et votre modèle. Quel est le protectedKey?
OffTheFitz

2
Eh bien, si vous utilisez Sentry, vérifiez l'utilisateur connecté avec Sentry::getUser()->id. L'erreur que vous obtenez est que le Auth::user()retourne NULL et qu'il essaie d'obtenir l'id de NULL d'où l'erreur trying to get a property from a non-object.
Altrim

Réponses:


61

Si vous utilisez, Sentryvérifiez l'utilisateur connecté avec Sentry::getUser()->id. L'erreur que vous obtenez est que le Auth::user()retourne NULL et qu'il essaie d'obtenir l'id de NULL d'où l'erreur trying to get a property from a non-object.


2
Je préfère utiliser le chaînage de méthodes {{auth () -> user () -> name}}
Hos Mercury

70

Maintenant, avec laravel 4.2, il est facile d'obtenir l'identifiant de l'utilisateur:

$userId = Auth::id();

c'est tout.

Mais pour récupérer les données de l'utilisateur autres que l'identifiant, vous utilisez:

$email = Auth::user()->email;

Pour plus de détails, consultez la partie sécurité de la documentation


Auth :: id () écrit Laravel 6.0
Pavel8289

N'oubliez pas d'ajouter "use Illuminate \ Support \ Facades \ Auth;"
mauronet

46

Faites un Auth :: check () avant de vous assurer que vous êtes bien connecté:

if (Auth::check())
{
    // The user is logged in...
}

3
C'est correct - vous devez d'abord Auth :: check () si l'utilisateur est connecté. Ensuite, Auth :: getUser () aura un objet utile :)
BlueMan

1
Si vous voulez faire cela en utilisant le modèle de lame: @if(Auth::check()) {{Auth::user()->id}} @endif(cela est utile si vous voulez obtenir l'ID utilisateur pour javascript / ajax)
Cato Minor

et si laravel 6?
gumuruh

19

id est protected, ajoutez simplement une méthode publique dans votre/models/User.php

public function getId()
{
  return $this->id;
}

donc tu peux l'appeler

$id = Auth::user()->getId();

rappelez-vous toujours de tester si l'utilisateur est connecté ...

if (Auth::check())
{
     $id = Auth::user()->getId();
}

11

Dans Laravel 5.6 j'utilise

use Auth;
$user_id = Auth::user()->id;

comme l'autre suggestion

Auth::id()

semble s'appliquer aux anciennes versions de Laravel 5.x et n'a pas fonctionné pour moi.


1
Auth::id()fonctionne très bien dans la version laravel 5.7.
RN Kushwaha

8

Vérifiez routela fonction dans laquelle vous utilisez Auth::user(). Pour obtenir les données Auth :: user (), la fonction doit être à l'intérieur du webmiddleware Route::group(['middleware' => 'web'], function () {});.


8

N'oubliez jamais d'inclure et d'essayer d'utiliser l'authentification middleware:

use Illuminate\Http\Request;   

Recherchez ensuite l'ID en utilisant la méthode de requête:

$id= $request->user()->id;

5

utilisez Illuminate \ Support \ Facades \ Auth;

En classe:

protected $user;

Ce code fonctionne pour moi

En construction:

$this->user = User::find(Auth::user()->id);

In function:
$this->user->id;
$this->user->email;

etc..


5

Si quelqu'un cherche laravel 5>

 Auth::id() 

donner l'identifiant de l'utilisateur autorisé


5

Vous pouvez accéder à l'utilisateur authentifié via la façade Auth:

use Illuminate\Support\Facades\Auth;

// Get the currently authenticated user...
$user = Auth::user();

// Get the currently authenticated user's ID...
$id = Auth::id();

4

vous devez vérifier si l'utilisateur est connecté?

Auth::check() ? Auth::user()->id : null

2

Votre question et votre exemple de code sont un peu vagues, et je pense que les autres développeurs se concentrent sur la mauvaise chose. Je crée une application dans Laravel, j'ai utilisé des tutoriels en ligne pour créer un nouvel utilisateur et une authentification, et j'ai semblé avoir remarqué que lorsque vous créez un nouvel utilisateur dans Laravel, aucun objet Auth n'est créé - que vous utilisez pour obtenir le (nouveau) ID de l'utilisateur connecté dans le reste de l'application. C'est un problème, et je crois ce que vous demandez peut-être. J'ai fait ce genre de hack cludgy dans userController :: store:

$user->save();

Session::flash('message','Successfully created user!');

//KLUDGE!! rest of site depends on user id in auth object - need to force/create it here
Auth::attempt(array('email' => Input::get('email'), 'password' => Input::get('password')), true);

Redirect::to('users/' . Auth::user()->id);

Je ne devrais pas avoir à créer et authentifier, mais je ne savais pas quoi faire d'autre.


2

Le premier utilisateur de vérification s'est connecté, puis

if (Auth::check()){
    //get id of logged in user
    {{ Auth::getUser()->id}}

    //get the name of logged in user
    {{ Auth::getUser()->name }}
}

2

Pour Laravel 6.X, vous pouvez effectuer les opérations suivantes:

$user = Auth::guard(<GUARD_NAME>)->user();
$user_id = $user->id;
$full_name = $user->full_name;

1
réponse très élégante.
rashedcs

@rashedcs Thanks
Ajjay Arora

1

Dans Laravel 8.6, ce qui suit fonctionne pour moi dans un contrôleur:

$id = auth()->user()->id;

0

Tu peux essayer :

$id = \Auth::user()->id

1
Bien que cette réponse puisse être techniquement correcte, veuillez fournir un contexte expliquant pourquoi vous pensez que cela résoudrait le problème et ce que cela ferait EG (lorsque vous utilisez des espaces de noms, tout élément dans l'espace de noms global doit avoir un `` avant pour indiquer qu'il est dans l'espace de noms global et non l'espace de noms actuel)
Barkermn01

0
 if(Auth::check() && Auth::user()->role->id == 2){ 
         $tags = Tag::latest()->get();
        return view('admin.tag.index',compact('tags'));
    }

Bonjour et bienvenue sur stackoverflow, et merci d'avoir répondu. Bien que ce code puisse répondre à la question, pouvez-vous envisager d'ajouter des explications sur le problème que vous avez résolu et comment vous l'avez résolu? Cela aidera les futurs lecteurs à mieux comprendre votre réponse et à en tirer des leçons.
plutien

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.