Laravel: Auth :: user () -> ID, die versucht, eine Eigenschaft eines Nichtobjekts abzurufen

88

Ich erhalte die folgende Fehlermeldung "Ich versuche, eine Eigenschaft eines Nicht-Objekts abzurufen", wenn ich ein Formular zum Hinzufügen eines Benutzers sende. Der Fehler befindet sich anscheinend in der ersten Zeile: Auth :: user () -> ID der folgenden ::

$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);

Irgendwelche Ideen? Ich habe eine Weile gesucht und alles, was ich sehe, sagt, dass dies gut funktionieren sollte. Mein Benutzer ist mit dem Sentry 2-Authentifizierungspaket angemeldet.

Josh
quelle
Gibt es eine Spalte mit dem Namen id in Ihrer Benutzertabelle? Wenn nicht, ist das das Problem.
OffTheFitz
Ja, ID ist da @OffTheFitz die Tabelle heißt Benutzer
Josh
Korrigieren Sie mich, wenn ich falsch liege, aber Sie versuchen, einen angemeldeten Benutzer zu registrieren? Wenn Sie Sentry verwenden, um einen Benutzer zu registrieren, warum rufen Sie an Auth::user();? Der Auth :: user () gibt den aktuell angemeldeten Benutzer zurück.
Wenn
@ Josh Was ist mit deinem Modell? Was ist der geschützte Schlüssel?
OffTheFitz
2
Wenn Sie Sentry verwenden, überprüfen Sie den angemeldeten Benutzer mit Sentry::getUser()->id. Der Fehler, den Sie erhalten, ist, dass der Auth::user()Wert NULL zurückgibt und versucht, die ID von NULL abzurufen, daher der Fehler trying to get a property from a non-object.
Altrim

Antworten:

61

Wenn Sie verwenden, Sentryüberprüfen Sie den angemeldeten Benutzer mit Sentry::getUser()->id. Der Fehler, den Sie erhalten, ist, dass der Auth::user()Wert NULL zurückgibt und versucht, die ID von NULL abzurufen, daher der Fehler trying to get a property from a non-object.

Altrim
quelle
1
Ich bevorzuge die Methodenverkettung {{auth () -> user () -> name}}
Hos Mercury
70

Mit Laravel 4.2 ist es jetzt einfach, die Benutzer-ID abzurufen:

$userId = Auth::id();

das ist alles.

Um jedoch andere Benutzerdaten als die ID abzurufen, verwenden Sie:

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

Weitere Informationen finden Sie im Sicherheitsteil der Dokumentation

Dr. MAF
quelle
Auth :: id () spricht Laravel 6.0
Pavel8289
Vergessen Sie nicht, "use Illuminate \ Support \ Facades \ Auth;" hinzuzufügen.
Mauronet
46

Führen Sie vorher ein Auth :: check () durch, um sicherzustellen, dass Sie gut angemeldet sind:

if (Auth::check())
{
    // The user is logged in...
}
jody_lognoul
quelle
3
Das ist richtig - zuerst müssen Sie Auth :: check (), wenn der Benutzer angemeldet ist. Dann hat der Auth :: getUser () ein nützliches Objekt :)
BlueMan
1
Wenn Sie dies mithilfe von Blade-Vorlagen tun möchten: @if(Auth::check()) {{Auth::user()->id}} @endif(Dies ist nützlich, wenn Sie die Benutzer-ID für Javascript / Ajax erhalten möchten.)
Cato Minor
Was ist, wenn Laravel 6?
Gumuruh
19

ID ist protected, fügen Sie einfach eine öffentliche Methode in Ihre/models/User.php

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

so kannst du es nennen

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

Denken Sie immer daran, zu testen, ob der Benutzer angemeldet ist ...

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

In Laravel 5.6 verwende ich

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

als der andere Vorschlag

Auth::id()

scheint auf ältere Versionen von Laravel 5.x zuzutreffen und hat bei mir nicht funktioniert.

Frankfurt-Laravel
quelle
1
Auth::id()funktioniert gut in Laravel 5.7 Version.
RN Kushwaha
8

Überprüfen Sie Ihre routeFunktion auf die Funktion, die Sie verwenden Auth::user(). Um Auth :: user () -Daten abzurufen, sollte sich die Funktion in der webMiddleware befinden Route::group(['middleware' => 'web'], function () {});.

Ashwani Panwar
quelle
8

Vergessen Sie niemals, Middleware-Authentifizierung einzuschließen und zu verwenden:

use Illuminate\Http\Request;   

Suchen Sie dann die ID mithilfe der Anforderungsmethode:

$id= $request->user()->id;
Hautausschläge
quelle
5

Verwenden Sie Illuminate \ Support \ Facades \ Auth.

Im Unterricht:

protected $user;

Dieser Code funktioniert bei mir

Im Konstrukt:

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

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

etc..

l3okor
quelle
5

Wenn jemand nach Laravel 5> sucht

 Auth::id() 

Geben Sie die ID des autorisierten Benutzers an

Md Sifatul Islam
quelle
5

Sie können über die Auth-Fassade auf den authentifizierten Benutzer zugreifen:

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
quelle
4

Sie müssen überprüfen, ob der Benutzer angemeldet ist.

Auth::check() ? Auth::user()->id : null
Vahid Alvandi
quelle
2

Ihre Frage und Ihr Codebeispiel sind etwas vage, und ich glaube, die anderen Entwickler konzentrieren sich auf das Falsche. Ich mache eine Anwendung in Laravel, habe Online-Tutorials zum Erstellen eines neuen Benutzers und zur Authentifizierung verwendet und anscheinend bemerkt, dass beim Erstellen eines neuen Benutzers in Laravel kein Auth-Objekt erstellt wird - mit dem Sie das (neue) Die ID des angemeldeten Benutzers im Rest der Anwendung. Dies ist ein Problem, und ich glaube, was Sie fragen. Ich habe diese Art von ungeschicktem Hack in userController :: store gemacht:

$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);

Sollte nicht erstellen und authentifizieren müssen, aber ich wusste nicht, was ich sonst tun sollte.

Andrew Koper
quelle
2

Der erste Check-Benutzer hat sich angemeldet und dann

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

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

Für Laravel 6.X können Sie Folgendes tun:

$user = Auth::guard(<GUARD_NAME>)->user();
$user_id = $user->id;
$full_name = $user->full_name;
Ajjay Arora
quelle
1
sehr elegante Antwort.
Rashedcs
@ Rashedcs Danke
Ajjay Arora
0

Du kannst es versuchen :

$id = \Auth::user()->id
Hautausschläge
quelle
1
Obwohl diese Antwort technisch möglicherweise korrekt ist, geben Sie bitte einen Kontext an, warum das Problem Ihrer Meinung nach behoben werden könnte und was es bewirkt und nicht der aktuelle Namespace)
Barkermn01
0
 if(Auth::check() && Auth::user()->role->id == 2){ 
         $tags = Tag::latest()->get();
        return view('admin.tag.index',compact('tags'));
    }
Md.Azizur Rahman
quelle
Hallo und willkommen bei stackoverflow, und danke für die Antwort. Während dieser Code möglicherweise die Frage beantwortet, können Sie eine Erklärung hinzufügen, was das Problem ist, das Sie gelöst haben, und wie Sie es gelöst haben? Dies wird zukünftigen Lesern helfen, Ihre Antwort besser zu verstehen und daraus zu lernen.
Plutian
0

Es funktioniert mit mir:

echo Auth::guard('guard_name')->user()->id;
Abd Abughazaleh
quelle
0

In Laravel 8.6 funktioniert für mich in einem Controller Folgendes:

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