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.

Josh
la source
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.

Altrim
la source
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

Dr MAF
la source
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...
}
jody_lognoul
la source
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();
}
Maztch
la source
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.

francfort-laravel
la source
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 () {});.

Ashwani Panwar
la source
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;
éruptions cutanées
la source
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..

l3okor
la source
5

Si quelqu'un cherche laravel 5>

 Auth::id() 

donner l'identifiant de l'utilisateur autorisé

Md Sifatul Islam
la source
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();
Parveen Chauhan
la source
4

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

Auth::check() ? Auth::user()->id : null
Vahid Alvandi
la source
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.

Andrew Koper
la source
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 }}
}
Abid Shah
la source
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;
Ajjay Arora
la source
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;
user761100
la source
0

Tu peux essayer :

$id = \Auth::user()->id
éruptions cutanées
la source
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'));
    }
Md.Azizur Rahman
la source
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
0

Cela fonctionne avec moi:

echo Auth::guard('guard_name')->user()->id;
Abd Abughazaleh
la source